mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
SIL SideEffects: handle program termination point functions
We can ignore any memory writes in a program termination point, because it's not relevant for the caller. But we need to consider memory reads, otherwise preceeding memory writes would be eliminated by dead-store-elimination in the caller. E.g. String initialization for error strings which are printed by the program termination point. Regarding ownership: a program termination point must not touch any reference counted objects.
This commit is contained in:
@@ -128,6 +128,14 @@ extension Function {
|
|||||||
default:
|
default:
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
if isProgramTerminationPoint {
|
||||||
|
// We can ignore any memory writes in a program termination point, because it's not relevant
|
||||||
|
// for the caller. But we need to consider memory reads, otherwise preceeding memory writes
|
||||||
|
// would be eliminated by dead-store-elimination in the caller. E.g. String initialization
|
||||||
|
// for error strings which are printed by the program termination point.
|
||||||
|
// Regarding ownership: a program termination point must not touch any reference counted objects.
|
||||||
|
return SideEffects.GlobalEffects(memory: SideEffects.Memory(read: true))
|
||||||
|
}
|
||||||
var result = SideEffects.GlobalEffects.worstEffects
|
var result = SideEffects.GlobalEffects.worstEffects
|
||||||
switch effectAttribute {
|
switch effectAttribute {
|
||||||
case .none:
|
case .none:
|
||||||
|
|||||||
@@ -121,6 +121,10 @@ final public class Function : CustomStringConvertible, HasShortDescription, Hash
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// True if the callee function is annotated with @_semantics("programtermination_point").
|
||||||
|
/// This means that the function terminates the program.
|
||||||
|
public var isProgramTerminationPoint: Bool { hasSemanticsAttribute("programtermination_point") }
|
||||||
|
|
||||||
/// Kinds of effect attributes which can be defined for a Swift function.
|
/// Kinds of effect attributes which can be defined for a Swift function.
|
||||||
public enum EffectAttribute {
|
public enum EffectAttribute {
|
||||||
/// No effect attribute is specified.
|
/// No effect attribute is specified.
|
||||||
|
|||||||
Reference in New Issue
Block a user