Skip to content

Commit c4f5bab

Browse files
committed
Swift Bridging: use C++ instead of C bridging for BridgedBasicBlock
1 parent c0c0b80 commit c4f5bab

File tree

8 files changed

+170
-188
lines changed

8 files changed

+170
-188
lines changed

SwiftCompilerSources/Sources/Optimizer/PassManager/Context.swift

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -224,24 +224,24 @@ extension Undef {
224224
extension BasicBlock {
225225
func addBlockArgument(type: Type, ownership: Ownership, _ context: some MutatingContext) -> BlockArgument {
226226
context.notifyInstructionsChanged()
227-
return SILBasicBlock_addBlockArgument(bridged, type.bridged, ownership._bridged).blockArgument
227+
return bridged.addBlockArgument(type.bridged, ownership._bridged).blockArgument
228228
}
229229

230230
func eraseArgument(at index: Int, _ context: some MutatingContext) {
231231
context.notifyInstructionsChanged()
232-
SILBasicBlock_eraseArgument(bridged, index)
232+
bridged.eraseArgument(index)
233233
}
234234

235235
func moveAllInstructions(toBeginOf otherBlock: BasicBlock, _ context: some MutatingContext) {
236236
context.notifyInstructionsChanged()
237237
context.notifyBranchesChanged()
238-
SILBasicBlock_moveAllInstructionsToBegin(bridged, otherBlock.bridged)
238+
bridged.moveAllInstructionsToBegin(otherBlock.bridged)
239239
}
240240

241241
func moveAllInstructions(toEndOf otherBlock: BasicBlock, _ context: some MutatingContext) {
242242
context.notifyInstructionsChanged()
243243
context.notifyBranchesChanged()
244-
SILBasicBlock_moveAllInstructionsToEnd(bridged, otherBlock.bridged)
244+
bridged.moveAllInstructionsToEnd(otherBlock.bridged)
245245
}
246246

247247
func eraseAllArguments(_ context: some MutatingContext) {
@@ -252,7 +252,7 @@ extension BasicBlock {
252252
}
253253

254254
func moveAllArguments(to otherBlock: BasicBlock, _ context: some MutatingContext) {
255-
BasicBlock_moveArgumentsTo(bridged, otherBlock.bridged)
255+
bridged.moveArgumentsTo(otherBlock.bridged)
256256
}
257257
}
258258

SwiftCompilerSources/Sources/SIL/BasicBlock.swift

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,31 +15,31 @@ import SILBridging
1515

1616
@_semantics("arc.immortal")
1717
final public class BasicBlock : CustomStringConvertible, HasShortDescription {
18-
public var next: BasicBlock? { SILBasicBlock_next(bridged).block }
19-
public var previous: BasicBlock? { SILBasicBlock_previous(bridged).block }
18+
public var next: BasicBlock? { bridged.getNext().block }
19+
public var previous: BasicBlock? { bridged.getPrevious().block }
2020

21-
public var parentFunction: Function { SILBasicBlock_getFunction(bridged).function }
21+
public var parentFunction: Function { bridged.getFunction().function }
2222

2323
public var description: String {
24-
let stdString = SILBasicBlock_debugDescription(bridged)
24+
let stdString = bridged.getDebugDescription()
2525
return String(_cxxString: stdString)
2626
}
2727
public var shortDescription: String { name }
2828

2929
public var arguments: ArgumentArray { ArgumentArray(block: self) }
3030

3131
public var instructions: InstructionList {
32-
InstructionList(first: SILBasicBlock_firstInst(bridged).instruction)
32+
InstructionList(first: bridged.getFirstInst().instruction)
3333
}
3434

3535
public var terminator: TermInst {
36-
SILBasicBlock_lastInst(bridged).instruction as! TermInst
36+
bridged.getLastInst().instruction as! TermInst
3737
}
3838

3939
public var successors: SuccessorArray { terminator.successors }
4040

4141
public var predecessors: PredecessorList {
42-
PredecessorList(startAt: SILBasicBlock_getFirstPred(bridged))
42+
PredecessorList(startAt: bridged.getFirstPred())
4343
}
4444

4545
public var singlePredecessor: BasicBlock? {
@@ -98,7 +98,7 @@ public struct InstructionList : CollectionLikeSequence, IteratorProtocol {
9898

9999
public func reversed() -> ReverseInstructionList {
100100
if let inst = currentInstruction {
101-
let lastInst = SILBasicBlock_lastInst(inst.parentBlock.bridged).instruction
101+
let lastInst = inst.parentBlock.bridged.getLastInst().instruction
102102
return ReverseInstructionList(first: lastInst)
103103
}
104104
return ReverseInstructionList(first: nil)
@@ -135,10 +135,10 @@ public struct ArgumentArray : RandomAccessCollection {
135135
fileprivate let block: BasicBlock
136136

137137
public var startIndex: Int { return 0 }
138-
public var endIndex: Int { SILBasicBlock_getNumArguments(block.bridged) }
138+
public var endIndex: Int { block.bridged.getNumArguments() }
139139

140140
public subscript(_ index: Int) -> Argument {
141-
SILBasicBlock_getArgument(block.bridged, index).argument
141+
block.bridged.getArgument(index).argument
142142
}
143143
}
144144

SwiftCompilerSources/Sources/SIL/Value.swift

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,16 @@ extension Value {
104104
/// True if the value has a trivial type which is and does not contain a Builtin.RawPointer.
105105
public var hasTrivialNonPointerType: Bool { type.isTrivialNonPointer(in: parentFunction) }
106106

107-
public var ownership: Ownership { bridged.getOwnership().ownership }
107+
public var ownership: Ownership {
108+
switch bridged.getOwnership() {
109+
case .Unowned: return .unowned
110+
case .Owned: return .owned
111+
case .Guaranteed: return .guaranteed
112+
case .None: return .none
113+
default:
114+
fatalError("unsupported ownership")
115+
}
116+
}
108117

109118
public var hashable: HashableValue { ObjectIdentifier(self) }
110119

@@ -198,16 +207,3 @@ final class PlaceholderValue : Value {
198207
extension OptionalBridgedValue {
199208
var value: Value? { obj.getAs(AnyObject.self) as? Value }
200209
}
201-
202-
extension BridgedValue.Ownership {
203-
var ownership: Ownership {
204-
switch self {
205-
case .Unowned: return .unowned
206-
case .Owned: return .owned
207-
case .Guaranteed: return .guaranteed
208-
case .None: return .none
209-
default:
210-
fatalError("unsupported ownership")
211-
}
212-
}
213-
}

include/swift/SIL/SILBridging.h

Lines changed: 114 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,19 @@ struct BridgedValue {
8888
}
8989
};
9090

91+
struct OptionalBridgedValue {
92+
OptionalSwiftObject obj;
93+
};
94+
95+
inline swift::ValueOwnershipKind castToOwnership(BridgedValue::Ownership ownership) {
96+
switch (ownership) {
97+
case BridgedValue::Ownership::Unowned: return swift::OwnershipKind::Unowned;
98+
case BridgedValue::Ownership::Owned: return swift::OwnershipKind::Owned;
99+
case BridgedValue::Ownership::Guaranteed: return swift::OwnershipKind::Guaranteed;
100+
case BridgedValue::Ownership::None: return swift::OwnershipKind::None;
101+
}
102+
}
103+
91104
// This is the layout of a class existential.
92105
struct BridgeValueExistential {
93106
BridgedValue value;
@@ -301,8 +314,106 @@ struct BridgedGlobalVar {
301314
bool isLet() const { return getGlobal()->isLet(); }
302315
};
303316

317+
struct BridgedInstruction {
318+
SwiftObject obj;
319+
};
320+
321+
typedef struct {
322+
OptionalSwiftObject obj;
323+
} OptionalBridgedInstruction;
324+
325+
typedef struct {
326+
SwiftObject obj;
327+
} BridgedArgument;
328+
329+
typedef struct {
330+
OptionalSwiftObject obj;
331+
} OptionalBridgedArgument;
332+
333+
struct OptionalBridgedBasicBlock {
334+
OptionalSwiftObject obj;
335+
336+
swift::SILBasicBlock *getBlock() const {
337+
return obj ? static_cast<swift::SILBasicBlock *>(obj) : nullptr;
338+
}
339+
};
340+
304341
struct BridgedBasicBlock {
305342
SwiftObject obj;
343+
344+
swift::SILBasicBlock * _Nonnull getBlock() const {
345+
return static_cast<swift::SILBasicBlock *>(obj);
346+
}
347+
348+
std::string getDebugDescription() const;
349+
350+
SWIFT_IMPORT_UNSAFE
351+
OptionalBridgedBasicBlock getNext() const {
352+
auto iter = std::next(getBlock()->getIterator());
353+
if (iter == getBlock()->getParent()->end())
354+
return {nullptr};
355+
return {&*iter};
356+
}
357+
358+
SWIFT_IMPORT_UNSAFE
359+
OptionalBridgedBasicBlock getPrevious() const {
360+
auto iter = std::next(getBlock()->getReverseIterator());
361+
if (iter == getBlock()->getParent()->rend())
362+
return {nullptr};
363+
return {&*iter};
364+
}
365+
366+
SWIFT_IMPORT_UNSAFE
367+
BridgedFunction getFunction() const {
368+
return {getBlock()->getParent()};
369+
}
370+
371+
SWIFT_IMPORT_UNSAFE
372+
OptionalBridgedInstruction getFirstInst() const {
373+
if (getBlock()->empty())
374+
return {nullptr};
375+
return {getBlock()->front().asSILNode()};
376+
}
377+
378+
SWIFT_IMPORT_UNSAFE
379+
OptionalBridgedInstruction getLastInst() const {
380+
if (getBlock()->empty())
381+
return {nullptr};
382+
return {getBlock()->back().asSILNode()};
383+
}
384+
385+
SwiftInt getNumArguments() const {
386+
return getBlock()->getNumArguments();
387+
}
388+
389+
SWIFT_IMPORT_UNSAFE
390+
BridgedArgument getArgument(SwiftInt index) const {
391+
return {getBlock()->getArgument(index)};
392+
}
393+
394+
SWIFT_IMPORT_UNSAFE
395+
BridgedArgument addBlockArgument(swift::SILType type, BridgedValue::Ownership ownership) const {
396+
return {getBlock()->createPhiArgument(type, castToOwnership(ownership))};
397+
}
398+
399+
void eraseArgument(SwiftInt index) const {
400+
getBlock()->eraseArgument(index);
401+
}
402+
403+
void moveAllInstructionsToBegin(BridgedBasicBlock dest) const {
404+
dest.getBlock()->spliceAtBegin(getBlock());
405+
}
406+
407+
void moveAllInstructionsToEnd(BridgedBasicBlock dest) const {
408+
dest.getBlock()->spliceAtEnd(getBlock());
409+
}
410+
411+
void moveArgumentsTo(BridgedBasicBlock dest) const {
412+
dest.getBlock()->moveArgumentList(getBlock());
413+
}
414+
415+
SWIFT_IMPORT_UNSAFE
416+
inline OptionalBridgedSuccessor getFirstPred() const;
306417
};
307418

308419
struct BridgedSuccessor {
@@ -333,34 +444,10 @@ struct BridgedSuccessorArray {
333444
SwiftInt count;
334445
};
335446

336-
struct OptionalBridgedBasicBlock {
337-
OptionalSwiftObject obj;
338-
};
339-
340-
typedef struct {
341-
SwiftObject obj;
342-
} BridgedArgument;
343-
344-
typedef struct {
345-
OptionalSwiftObject obj;
346-
} OptionalBridgedArgument;
347-
348447
typedef struct {
349448
SwiftObject obj;
350449
} BridgedNode;
351450

352-
typedef struct {
353-
OptionalSwiftObject obj;
354-
} OptionalBridgedValue;
355-
356-
struct BridgedInstruction {
357-
SwiftObject obj;
358-
};
359-
360-
typedef struct {
361-
OptionalSwiftObject obj;
362-
} OptionalBridgedInstruction;
363-
364451
typedef struct {
365452
SwiftObject obj;
366453
} BridgedMultiValueResult;
@@ -470,23 +557,6 @@ void PassContext_eraseInstruction(BridgedPassContext passContext,
470557
void PassContext_eraseBlock(BridgedPassContext passContext,
471558
BridgedBasicBlock block);
472559

473-
OptionalBridgedBasicBlock SILBasicBlock_next(BridgedBasicBlock block);
474-
OptionalBridgedBasicBlock SILBasicBlock_previous(BridgedBasicBlock block);
475-
BridgedFunction SILBasicBlock_getFunction(BridgedBasicBlock block);
476-
std::string SILBasicBlock_debugDescription(BridgedBasicBlock block);
477-
OptionalBridgedInstruction SILBasicBlock_firstInst(BridgedBasicBlock block);
478-
OptionalBridgedInstruction SILBasicBlock_lastInst(BridgedBasicBlock block);
479-
SwiftInt SILBasicBlock_getNumArguments(BridgedBasicBlock block);
480-
BridgedArgument SILBasicBlock_getArgument(BridgedBasicBlock block, SwiftInt index);
481-
BridgedArgument SILBasicBlock_addBlockArgument(BridgedBasicBlock block,
482-
swift::SILType type,
483-
BridgedValue::Ownership ownership);
484-
void SILBasicBlock_eraseArgument(BridgedBasicBlock block, SwiftInt index);
485-
void SILBasicBlock_moveAllInstructionsToBegin(BridgedBasicBlock block, BridgedBasicBlock dest);
486-
void SILBasicBlock_moveAllInstructionsToEnd(BridgedBasicBlock block, BridgedBasicBlock dest);
487-
void BasicBlock_moveArgumentsTo(BridgedBasicBlock block, BridgedBasicBlock dest);
488-
OptionalBridgedSuccessor SILBasicBlock_getFirstPred(BridgedBasicBlock block);
489-
490560
std::string SILNode_debugDescription(BridgedNode node);
491561

492562
std::string SILLocation_debugDescription(swift::SILDebugLocation loc);
@@ -654,6 +724,9 @@ OptionalBridgedBasicBlock BridgedFunction::getLastBlock() const {
654724
return {getFunction()->empty() ? nullptr : &*getFunction()->rbegin()};
655725
}
656726

727+
OptionalBridgedSuccessor BridgedBasicBlock::getFirstPred() const {
728+
return {getBlock()->pred_begin().getSuccessorRef()};
729+
}
657730

658731
SWIFT_END_NULLABILITY_ANNOTATIONS
659732

include/swift/SIL/SILBridgingUtils.h

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -39,27 +39,10 @@ template <class I = SILInstruction> I *castToInst(OptionalBridgedInstruction ins
3939
return cast<I>(static_cast<SILNode *>(inst.obj)->castToInstruction());
4040
}
4141

42-
inline SILBasicBlock *castToBasicBlock(BridgedBasicBlock block) {
43-
return static_cast<SILBasicBlock *>(block.obj);
44-
}
45-
46-
inline SILBasicBlock *castToBasicBlock(OptionalBridgedBasicBlock block) {
47-
return block.obj ? static_cast<SILBasicBlock *>(block.obj) : nullptr;
48-
}
49-
5042
template <class A = SILArgument> A *castToArgument(BridgedArgument argument) {
5143
return cast<A>(static_cast<SILArgument *>(argument.obj));
5244
}
5345

54-
inline ValueOwnershipKind castToOwnership(BridgedValue::Ownership ownership) {
55-
switch (ownership) {
56-
case BridgedValue::Ownership::Unowned: return OwnershipKind::Unowned;
57-
case BridgedValue::Ownership::Owned: return OwnershipKind::Owned;
58-
case BridgedValue::Ownership::Guaranteed: return OwnershipKind::Guaranteed;
59-
case BridgedValue::Ownership::None: return OwnershipKind::None;
60-
}
61-
}
62-
6346
ArrayRef<SILValue> getSILValues(BridgedValueArray values,
6447
SmallVectorImpl<SILValue> &storage);
6548

0 commit comments

Comments
 (0)