Skip to content

Commit fc2ad09

Browse files
committed
Swift Bridging: use C++ instead of C bridging for BridgedSuccessor
1 parent eecea08 commit fc2ad09

File tree

4 files changed

+64
-48
lines changed

4 files changed

+64
-48
lines changed

SwiftCompilerSources/Sources/SIL/BasicBlock.swift

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -143,19 +143,20 @@ public struct ArgumentArray : RandomAccessCollection {
143143
}
144144

145145
public struct SuccessorArray : RandomAccessCollection, FormattedLikeArray {
146-
private let succArray: BridgedArrayRef
146+
private let base: OptionalBridgedSuccessor
147+
public let count: Int
147148

148-
init(succArray: BridgedArrayRef) {
149-
self.succArray = succArray
149+
init(base: OptionalBridgedSuccessor, count: Int) {
150+
self.base = base
151+
self.count = count
150152
}
151153

152154
public var startIndex: Int { return 0 }
153-
public var endIndex: Int { return Int(succArray.numElements) }
155+
public var endIndex: Int { return count }
154156

155157
public subscript(_ index: Int) -> BasicBlock {
156-
assert(index >= 0 && index < endIndex)
157-
let s = BridgedSuccessor(succ: succArray.data! + index &* BridgedSuccessorSize);
158-
return SILSuccessor_getTargetBlock(s).block
158+
assert(index >= startIndex && index < endIndex)
159+
return base.advancedBy(index).getTargetBlock().block
159160
}
160161
}
161162

@@ -165,10 +166,9 @@ public struct PredecessorList : CollectionLikeSequence, IteratorProtocol {
165166
public init(startAt: OptionalBridgedSuccessor) { currentSucc = startAt }
166167

167168
public mutating func next() -> BasicBlock? {
168-
if let succPtr = currentSucc.succ {
169-
let succ = BridgedSuccessor(succ: succPtr)
170-
currentSucc = SILSuccessor_getNext(succ)
171-
return SILSuccessor_getContainingInst(succ).instruction.parentBlock
169+
if let succ = currentSucc.successor {
170+
currentSucc = succ.getNext()
171+
return succ.getContainingInst().instruction.parentBlock
172172
}
173173
return nil
174174
}
@@ -196,3 +196,12 @@ extension Optional where Wrapped == BasicBlock {
196196
OptionalBridgedBasicBlock(obj: self?.bridged.obj)
197197
}
198198
}
199+
200+
extension OptionalBridgedSuccessor {
201+
var successor: BridgedSuccessor? {
202+
if let succ = succ {
203+
return BridgedSuccessor(succ: succ)
204+
}
205+
return nil
206+
}
207+
}

SwiftCompilerSources/Sources/SIL/Instruction.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -779,7 +779,8 @@ final public class BeginApplyInst : MultipleValueInstruction, FullApplySite {
779779

780780
public class TermInst : Instruction {
781781
final public var successors: SuccessorArray {
782-
SuccessorArray(succArray: TermInst_getSuccessors(bridged))
782+
let succArray = TermInst_getSuccessors(bridged)
783+
return SuccessorArray(base: succArray.base, count: succArray.count)
783784
}
784785

785786
public var isFunctionExiting: Bool { false }

include/swift/SIL/SILBridging.h

Lines changed: 40 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,9 @@ SWIFT_BEGIN_NULLABILITY_ANNOTATIONS
2828

2929
struct BridgedInstruction;
3030
struct OptionalBridgedOperand;
31+
struct OptionalBridgedSuccessor;
3132

3233
enum {
33-
BridgedSuccessorSize = 4 * sizeof(uintptr_t) + sizeof(uint64_t),
3434
BridgedVTableEntrySize = 5 * sizeof(uintptr_t),
3535
BridgedWitnessTableEntrySize = 5 * sizeof(uintptr_t)
3636
};
@@ -133,14 +133,6 @@ struct BridgedOperandArray {
133133
SwiftInt count;
134134
};
135135

136-
typedef struct {
137-
const void * _Nonnull succ;
138-
} BridgedSuccessor;
139-
140-
typedef struct {
141-
const void * _Nullable succ;
142-
} OptionalBridgedSuccessor;
143-
144136
typedef struct {
145137
const void * _Nonnull ptr;
146138
} BridgedVTable;
@@ -181,9 +173,37 @@ typedef struct {
181173
SwiftObject obj;
182174
} BridgedGlobalVar;
183175

184-
typedef struct {
176+
struct BridgedBasicBlock {
185177
SwiftObject obj;
186-
} BridgedBasicBlock;
178+
};
179+
180+
struct BridgedSuccessor {
181+
const swift::SILSuccessor * _Nonnull succ;
182+
183+
SWIFT_IMPORT_UNSAFE
184+
inline OptionalBridgedSuccessor getNext() const;
185+
186+
SWIFT_IMPORT_UNSAFE
187+
BridgedBasicBlock getTargetBlock() const {
188+
return {succ->getBB()};
189+
}
190+
191+
SWIFT_IMPORT_UNSAFE
192+
inline BridgedInstruction getContainingInst() const;
193+
};
194+
195+
struct OptionalBridgedSuccessor {
196+
const swift::SILSuccessor * _Nullable succ;
197+
198+
// Assumes that `succ` is not null.
199+
SWIFT_IMPORT_UNSAFE
200+
BridgedSuccessor advancedBy(SwiftInt index) const { return {succ + index}; }
201+
};
202+
203+
struct BridgedSuccessorArray {
204+
OptionalBridgedSuccessor base;
205+
SwiftInt count;
206+
};
187207

188208
typedef struct {
189209
OptionalSwiftObject obj;
@@ -362,9 +382,6 @@ void SILBasicBlock_moveAllInstructionsToBegin(BridgedBasicBlock block, BridgedBa
362382
void SILBasicBlock_moveAllInstructionsToEnd(BridgedBasicBlock block, BridgedBasicBlock dest);
363383
void BasicBlock_moveArgumentsTo(BridgedBasicBlock block, BridgedBasicBlock dest);
364384
OptionalBridgedSuccessor SILBasicBlock_getFirstPred(BridgedBasicBlock block);
365-
OptionalBridgedSuccessor SILSuccessor_getNext(BridgedSuccessor succ);
366-
BridgedBasicBlock SILSuccessor_getTargetBlock(BridgedSuccessor succ);
367-
BridgedInstruction SILSuccessor_getContainingInst(BridgedSuccessor succ);
368385

369386
std::string SILNode_debugDescription(BridgedNode node);
370387

@@ -428,7 +445,7 @@ SwiftInt MultipleValueInstruction_getNumResults(BridgedInstruction inst);
428445
BridgedMultiValueResult
429446
MultipleValueInstruction_getResult(BridgedInstruction inst, SwiftInt index);
430447

431-
BridgedArrayRef TermInst_getSuccessors(BridgedInstruction term);
448+
BridgedSuccessorArray TermInst_getSuccessors(BridgedInstruction term);
432449

433450
llvm::StringRef CondFailInst_getMessage(BridgedInstruction cfi);
434451
SwiftInt LoadInst_getLoadOwnership(BridgedInstruction load);
@@ -547,6 +564,14 @@ OptionalBridgedOperand BridgedValue::getFirstUse() const {
547564
return {*getSILValue()->use_begin()};
548565
}
549566

567+
OptionalBridgedSuccessor BridgedSuccessor::getNext() const {
568+
return {succ->getNext()};
569+
}
570+
571+
BridgedInstruction BridgedSuccessor::getContainingInst() const {
572+
return {succ->getContainingInst()};
573+
}
574+
550575

551576
SWIFT_END_NULLABILITY_ANNOTATIONS
552577

lib/SIL/Utils/SILBridging.cpp

Lines changed: 2 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -293,9 +293,6 @@ void SILFunction_setNeedStackProtection(BridgedFunction function,
293293
// SILBasicBlock
294294
//===----------------------------------------------------------------------===//
295295

296-
static_assert(BridgedSuccessorSize == sizeof(SILSuccessor),
297-
"wrong bridged SILSuccessor size");
298-
299296
OptionalBridgedBasicBlock SILBasicBlock_next(BridgedBasicBlock block) {
300297
SILBasicBlock *b = castToBasicBlock(block);
301298
auto iter = std::next(b->getIterator());
@@ -373,22 +370,6 @@ OptionalBridgedSuccessor SILBasicBlock_getFirstPred(BridgedBasicBlock block) {
373370
return {castToBasicBlock(block)->pred_begin().getSuccessorRef()};
374371
}
375372

376-
static SILSuccessor *castToSuccessor(BridgedSuccessor succ) {
377-
return const_cast<SILSuccessor *>(static_cast<const SILSuccessor *>(succ.succ));
378-
}
379-
380-
OptionalBridgedSuccessor SILSuccessor_getNext(BridgedSuccessor succ) {
381-
return {castToSuccessor(succ)->getNext()};
382-
}
383-
384-
BridgedBasicBlock SILSuccessor_getTargetBlock(BridgedSuccessor succ) {
385-
return {castToSuccessor(succ)->getBB()};
386-
}
387-
388-
BridgedInstruction SILSuccessor_getContainingInst(BridgedSuccessor succ) {
389-
return {castToSuccessor(succ)->getContainingInst()};
390-
}
391-
392373
//===----------------------------------------------------------------------===//
393374
// SILArgument
394375
//===----------------------------------------------------------------------===//
@@ -885,9 +866,9 @@ MultipleValueInstruction_getResult(BridgedInstruction inst, SwiftInt index) {
885866
return {castToInst<MultipleValueInstruction>(inst)->getResult(index)};
886867
}
887868

888-
BridgedArrayRef TermInst_getSuccessors(BridgedInstruction term) {
869+
BridgedSuccessorArray TermInst_getSuccessors(BridgedInstruction term) {
889870
auto successors = castToInst<TermInst>(term)->getSuccessors();
890-
return {(const unsigned char *)successors.data(), successors.size()};
871+
return {{successors.data()}, (SwiftInt)successors.size()};
891872
}
892873

893874
//===----------------------------------------------------------------------===//

0 commit comments

Comments
 (0)