Skip to content

Commit 7a62f15

Browse files
committed
pass Context: verify that only the currently transformed function is modified
1 parent 499b218 commit 7a62f15

File tree

6 files changed

+26
-0
lines changed

6 files changed

+26
-0
lines changed

SwiftCompilerSources/Sources/Optimizer/PassManager/Context.swift

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,10 @@ extension MutatingContext {
6262
func notifyInvalidatedStackNesting() { _bridged.notifyInvalidatedStackNesting() }
6363
var needFixStackNesting: Bool { _bridged.getNeedFixStackNesting() }
6464

65+
func verifyIsTransforming(function: Function) {
66+
precondition(_bridged.isTransforming(function.bridged), "pass modifies wrong function")
67+
}
68+
6569
/// Splits the basic block, which contains `inst`, before `inst` and returns the
6670
/// new block.
6771
///
@@ -88,6 +92,9 @@ extension MutatingContext {
8892
}
8993

9094
func erase(instruction: Instruction) {
95+
if !instruction.isInStaticInitializer {
96+
verifyIsTransforming(function: instruction.parentFunction)
97+
}
9198
if instruction is FullApplySite {
9299
notifyCallsChanged()
93100
}
@@ -374,18 +381,21 @@ extension Type {
374381
extension Builder {
375382
/// Creates a builder which inserts _before_ `insPnt`, using a custom `location`.
376383
init(before insPnt: Instruction, location: Location, _ context: some MutatingContext) {
384+
context.verifyIsTransforming(function: insPnt.parentFunction)
377385
self.init(insertAt: .before(insPnt), location: location,
378386
context.notifyInstructionChanged, context._bridged.asNotificationHandler())
379387
}
380388

381389
/// Creates a builder which inserts _before_ `insPnt`, using the location of `insPnt`.
382390
init(before insPnt: Instruction, _ context: some MutatingContext) {
391+
context.verifyIsTransforming(function: insPnt.parentFunction)
383392
self.init(insertAt: .before(insPnt), location: insPnt.location,
384393
context.notifyInstructionChanged, context._bridged.asNotificationHandler())
385394
}
386395

387396
/// Creates a builder which inserts _after_ `insPnt`, using a custom `location`.
388397
init(after insPnt: Instruction, location: Location, _ context: some MutatingContext) {
398+
context.verifyIsTransforming(function: insPnt.parentFunction)
389399
if let nextInst = insPnt.next {
390400
self.init(insertAt: .before(nextInst), location: location,
391401
context.notifyInstructionChanged, context._bridged.asNotificationHandler())
@@ -397,17 +407,20 @@ extension Builder {
397407

398408
/// Creates a builder which inserts _after_ `insPnt`, using the location of `insPnt`.
399409
init(after insPnt: Instruction, _ context: some MutatingContext) {
410+
context.verifyIsTransforming(function: insPnt.parentFunction)
400411
self.init(after: insPnt, location: insPnt.location, context)
401412
}
402413

403414
/// Creates a builder which inserts at the end of `block`, using a custom `location`.
404415
init(atEndOf block: BasicBlock, location: Location, _ context: some MutatingContext) {
416+
context.verifyIsTransforming(function: block.parentFunction)
405417
self.init(insertAt: .atEndOf(block), location: location,
406418
context.notifyInstructionChanged, context._bridged.asNotificationHandler())
407419
}
408420

409421
/// Creates a builder which inserts at the begin of `block`, using a custom `location`.
410422
init(atBeginOf block: BasicBlock, location: Location, _ context: some MutatingContext) {
423+
context.verifyIsTransforming(function: block.parentFunction)
411424
let firstInst = block.instructions.first!
412425
self.init(insertAt: .before(firstInst), location: location,
413426
context.notifyInstructionChanged, context._bridged.asNotificationHandler())
@@ -416,6 +429,7 @@ extension Builder {
416429
/// Creates a builder which inserts at the begin of `block`, using the location of the first
417430
/// instruction of `block`.
418431
init(atBeginOf block: BasicBlock, _ context: some MutatingContext) {
432+
context.verifyIsTransforming(function: block.parentFunction)
419433
let firstInst = block.instructions.first!
420434
self.init(insertAt: .before(firstInst), location: firstInst.location,
421435
context.notifyInstructionChanged, context._bridged.asNotificationHandler())

SwiftCompilerSources/Sources/SIL/Instruction.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ public class Instruction : CustomStringConvertible, Hashable {
4141
return bridged.isDeleted()
4242
}
4343

44+
final public var isInStaticInitializer: Bool { bridged.isInStaticInitializer() }
45+
4446
final public var operands: OperandArray {
4547
let operands = bridged.getOperands()
4648
return OperandArray(base: operands.base, count: operands.count)

include/swift/SIL/SILBridging.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -700,6 +700,7 @@ struct BridgedInstruction {
700700
SWIFT_IMPORT_UNSAFE BRIDGED_INLINE BridgedBasicBlock getParent() const;
701701
SWIFT_IMPORT_UNSAFE BRIDGED_INLINE BridgedInstruction getLastInstOfParent() const;
702702
BRIDGED_INLINE bool isDeleted() const;
703+
BRIDGED_INLINE bool isInStaticInitializer() const;
703704
SWIFT_IMPORT_UNSAFE BRIDGED_INLINE BridgedOperandArray getOperands() const;
704705
SWIFT_IMPORT_UNSAFE BRIDGED_INLINE BridgedOperandArray getTypeDependentOperands() const;
705706
BRIDGED_INLINE void setOperand(SwiftInt index, BridgedValue value) const;

include/swift/SIL/SILBridgingImpl.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -774,6 +774,10 @@ bool BridgedInstruction::isDeleted() const {
774774
return unbridged()->isDeleted();
775775
}
776776

777+
bool BridgedInstruction::isInStaticInitializer() const {
778+
return unbridged()->isStaticInitializerInst();
779+
}
780+
777781
BridgedOperandArray BridgedInstruction::getOperands() const {
778782
auto operands = unbridged()->getAllOperands();
779783
return {{operands.data()}, (SwiftInt)operands.size()};

include/swift/SILOptimizer/OptimizerBridging.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,7 @@ struct BridgedPassContext {
175175
BRIDGED_INLINE SILStage getSILStage() const;
176176
BRIDGED_INLINE bool hadError() const;
177177
BRIDGED_INLINE bool moduleIsSerialized() const;
178+
BRIDGED_INLINE bool isTransforming(BridgedFunction function) const;
178179

179180
// Analysis
180181

include/swift/SILOptimizer/OptimizerBridgingImpl.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,10 @@ bool BridgedPassContext::moduleIsSerialized() const {
155155
return invocation->getPassManager()->getModule()->isSerialized();
156156
}
157157

158+
bool BridgedPassContext::isTransforming(BridgedFunction function) const {
159+
return invocation->getFunction() == function.getFunction();
160+
}
161+
158162
BridgedAliasAnalysis BridgedPassContext::getAliasAnalysis() const {
159163
return {invocation->getPassManager()->getAnalysis<swift::AliasAnalysis>(invocation->getFunction())};
160164
}

0 commit comments

Comments
 (0)