Skip to content

Commit f3a9b08

Browse files
committed
SwiftCompilerSources: bridged ProtocolConformance
And use that in some Builder APIs
1 parent 897ef2c commit f3a9b08

File tree

7 files changed

+179
-14
lines changed

7 files changed

+179
-14
lines changed

SwiftCompilerSources/Sources/Optimizer/InstructionSimplification/SimplifyRefCasts.swift

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,10 @@ private func insertCompensatingInstructions(for inst: Instruction, in failureBlo
116116
let newInst: SingleValueInstruction
117117
switch inst {
118118
case let ier as InitExistentialRefInst:
119-
newInst = builder.createInitExistentialRef(instance: newArg, existentialType: ier.type, useConformancesOf: ier)
119+
newInst = builder.createInitExistentialRef(instance: newArg,
120+
existentialType: ier.type,
121+
formalConcreteType: ier.formalConcreteType,
122+
conformances: ier.conformances)
120123
case let uc as UpcastInst:
121124
newInst = builder.createUpcast(from: newArg, to: uc.type)
122125
default:

SwiftCompilerSources/Sources/SIL/Builder.swift

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -434,20 +434,22 @@ public struct Builder {
434434

435435
public func createInitExistentialRef(instance: Value,
436436
existentialType: Type,
437-
useConformancesOf: InitExistentialRefInst) -> InitExistentialRefInst {
437+
formalConcreteType: BridgedASTType,
438+
conformances: ProtocolConformanceArray) -> InitExistentialRefInst {
438439
let initExistential = bridged.createInitExistentialRef(instance.bridged,
439440
existentialType.bridged,
440-
useConformancesOf.bridged)
441+
formalConcreteType,
442+
conformances.bridged)
441443
return notifyNew(initExistential.getAs(InitExistentialRefInst.self))
442444
}
443445

444446
public func createInitExistentialMetatype(
445447
metatype: Value,
446448
existentialType: Type,
447-
useConformancesOf: InitExistentialMetatypeInst) -> InitExistentialMetatypeInst {
449+
conformances: ProtocolConformanceArray) -> InitExistentialMetatypeInst {
448450
let initExistential = bridged.createInitExistentialMetatype(metatype.bridged,
449451
existentialType.bridged,
450-
useConformancesOf.bridged)
452+
conformances.bridged)
451453
return notifyNew(initExistential.getAs(InitExistentialMetatypeInst.self))
452454
}
453455

SwiftCompilerSources/Sources/SIL/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ add_swift_compiler_module(SIL
2323
Linkage.swift
2424
Location.swift
2525
Operand.swift
26+
ProtocolConformance.swift
2627
Registration.swift
2728
SILStage.swift
2829
SubstitutionMap.swift

SwiftCompilerSources/Sources/SIL/Instruction.swift

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -669,6 +669,14 @@ class TailAddrInst : SingleValueInstruction {
669669
final public
670670
class InitExistentialRefInst : SingleValueInstruction, UnaryInstruction {
671671
public var instance: Value { operand.value }
672+
673+
public var conformances: ProtocolConformanceArray {
674+
ProtocolConformanceArray(bridged: bridged.InitExistentialRefInst_getConformances())
675+
}
676+
677+
public var formalConcreteType: BridgedASTType {
678+
bridged.InitExistentialRefInst_getFormalConcreteType()
679+
}
672680
}
673681

674682
final public
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
//===--- ProtocolConformance.swift ----------------------------------------===//
2+
//
3+
// This source file is part of the Swift.org open source project
4+
//
5+
// Copyright (c) 2014 - 2024 Apple Inc. and the Swift project authors
6+
// Licensed under Apache License v2.0 with Runtime Library Exception
7+
//
8+
// See https://swift.org/LICENSE.txt for license information
9+
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
10+
//
11+
//===----------------------------------------------------------------------===//
12+
13+
import SILBridging
14+
15+
// TODO: move `ProtocolConformance` to an AST module, once we have it
16+
17+
public struct ProtocolConformance {
18+
public let bridged: BridgedProtocolConformance
19+
20+
init(bridged: BridgedProtocolConformance) {
21+
self.bridged = bridged
22+
}
23+
24+
public var isConcrete: Bool { bridged.isConcrete() }
25+
26+
public var isValid: Bool { bridged.isValid() }
27+
28+
public var isSpecialized: Bool {
29+
assert(isConcrete)
30+
return bridged.isSpecializedConformance()
31+
}
32+
33+
public var genericConformance: ProtocolConformance {
34+
assert(isSpecialized)
35+
return bridged.getGenericConformance().protocolConformance
36+
}
37+
38+
public var specializedSubstitutions: SubstitutionMap {
39+
assert(isSpecialized)
40+
return SubstitutionMap(bridged: bridged.getSpecializedSubstitutions())
41+
}
42+
}
43+
44+
public struct ProtocolConformanceArray : RandomAccessCollection, CustomReflectable {
45+
public let bridged: BridgedProtocolConformanceArray
46+
47+
public var startIndex: Int { return 0 }
48+
public var endIndex: Int { return bridged.getCount() }
49+
50+
public init(bridged: BridgedProtocolConformanceArray) {
51+
self.bridged = bridged
52+
}
53+
54+
public subscript(_ index: Int) -> ProtocolConformance {
55+
bridged.getAt(index).protocolConformance
56+
}
57+
58+
public var customMirror: Mirror {
59+
let c: [Mirror.Child] = map { (label: nil, value: $0) }
60+
return Mirror(self, children: c)
61+
}
62+
}
63+
64+
extension BridgedProtocolConformance {
65+
public var protocolConformance: ProtocolConformance { ProtocolConformance(bridged: self) }
66+
}

include/swift/SIL/SILBridging.h

Lines changed: 42 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -691,6 +691,43 @@ struct BridgedSILTypeArray {
691691
BridgedType getAt(SwiftInt index) const;
692692
};
693693

694+
struct BridgedProtocolConformance {
695+
void * _Nullable opaqueValue;
696+
697+
#ifdef USED_IN_CPP_SOURCE
698+
BridgedProtocolConformance(swift::ProtocolConformanceRef conformance)
699+
: opaqueValue(conformance.getOpaqueValue()) {}
700+
701+
swift::ProtocolConformanceRef unbridged() const {
702+
return swift::ProtocolConformanceRef::getFromOpaqueValue(opaqueValue);
703+
}
704+
#endif
705+
706+
BRIDGED_INLINE bool isConcrete() const;
707+
BRIDGED_INLINE bool isValid() const;
708+
BRIDGED_INLINE bool isSpecializedConformance() const;
709+
SWIFT_IMPORT_UNSAFE BRIDGED_INLINE BridgedProtocolConformance getGenericConformance() const;
710+
SWIFT_IMPORT_UNSAFE BRIDGED_INLINE BridgedSubstitutionMap getSpecializedSubstitutions() const;
711+
};
712+
713+
struct BridgedProtocolConformanceArray {
714+
BridgedArrayRef pcArray;
715+
716+
#ifdef USED_IN_CPP_SOURCE
717+
BridgedProtocolConformanceArray(llvm::ArrayRef<swift::ProtocolConformanceRef> conformances)
718+
: pcArray(conformances) {}
719+
720+
llvm::ArrayRef<swift::ProtocolConformanceRef> unbridged() const {
721+
return pcArray.unbridged<swift::ProtocolConformanceRef>();
722+
}
723+
#endif
724+
725+
SwiftInt getCount() const { return SwiftInt(pcArray.Length); }
726+
727+
SWIFT_IMPORT_UNSAFE BRIDGED_INLINE
728+
BridgedProtocolConformance getAt(SwiftInt index) const;
729+
};
730+
694731
struct BridgedGenericSpecializationInformation {
695732
const swift::GenericSpecializationInformation * _Nullable data = nullptr;
696733
};
@@ -813,6 +850,8 @@ struct BridgedInstruction {
813850
BRIDGED_INLINE bool PointerToAddressInst_isStrict() const;
814851
BRIDGED_INLINE bool AddressToPointerInst_needsStackProtection() const;
815852
BRIDGED_INLINE bool IndexAddrInst_needsStackProtection() const;
853+
SWIFT_IMPORT_UNSAFE BRIDGED_INLINE BridgedProtocolConformanceArray InitExistentialRefInst_getConformances() const;
854+
SWIFT_IMPORT_UNSAFE BRIDGED_INLINE BridgedASTType InitExistentialRefInst_getFormalConcreteType() const;
816855
SWIFT_IMPORT_UNSAFE BRIDGED_INLINE BridgedGlobalVar GlobalAccessInst_getGlobal() const;
817856
SWIFT_IMPORT_UNSAFE BRIDGED_INLINE BridgedGlobalVar AllocGlobalInst_getGlobal() const;
818857
SWIFT_IMPORT_UNSAFE BRIDGED_INLINE BridgedFunction FunctionRefBaseInst_getReferencedFunction() const;
@@ -1237,10 +1276,11 @@ struct BridgedBuilder{
12371276
SwiftInt ownership) const;
12381277
SWIFT_IMPORT_UNSAFE BRIDGED_INLINE BridgedInstruction createInitExistentialRef(BridgedValue instance,
12391278
BridgedType type,
1240-
BridgedInstruction useConformancesOf) const;
1279+
BridgedASTType formalConcreteType,
1280+
BridgedProtocolConformanceArray conformances) const;
12411281
SWIFT_IMPORT_UNSAFE BRIDGED_INLINE BridgedInstruction createInitExistentialMetatype(BridgedValue metatype,
12421282
BridgedType existentialType,
1243-
BridgedInstruction useConformancesOf) const;
1283+
BridgedProtocolConformanceArray conformances) const;
12441284
SWIFT_IMPORT_UNSAFE BRIDGED_INLINE BridgedInstruction createMetatype(BridgedType type,
12451285
BridgedType::MetatypeRepresentation representation) const;
12461286
SWIFT_IMPORT_UNSAFE BRIDGED_INLINE BridgedInstruction createEndCOWMutation(BridgedValue instance,

include/swift/SIL/SILBridgingImpl.h

Lines changed: 52 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
#include "SILBridging.h"
2323
#include "swift/AST/Builtins.h"
2424
#include "swift/AST/Decl.h"
25+
#include "swift/AST/ProtocolConformance.h"
26+
#include "swift/AST/ProtocolConformanceRef.h"
2527
#include "swift/AST/SubstitutionMap.h"
2628
#include "swift/AST/Types.h"
2729
#include "swift/Basic/BasicBridging.h"
@@ -978,6 +980,42 @@ BridgedType BridgedSILTypeArray::getAt(SwiftInt index) const {
978980
return unbridged()[index];
979981
}
980982

983+
//===----------------------------------------------------------------------===//
984+
// BridgedProtocolConformance
985+
//===----------------------------------------------------------------------===//
986+
987+
static_assert(sizeof(BridgedProtocolConformance) == sizeof(swift::ProtocolConformanceRef));
988+
989+
bool BridgedProtocolConformance::isConcrete() const {
990+
return unbridged().isConcrete();
991+
}
992+
993+
bool BridgedProtocolConformance::isValid() const {
994+
return !unbridged().isInvalid();
995+
}
996+
997+
bool BridgedProtocolConformance::isSpecializedConformance() const {
998+
return swift::isa<swift::SpecializedProtocolConformance>(unbridged().getConcrete());
999+
}
1000+
1001+
BridgedProtocolConformance BridgedProtocolConformance::getGenericConformance() const {
1002+
auto *specPC = swift::cast<swift::SpecializedProtocolConformance>(unbridged().getConcrete());
1003+
return {swift::ProtocolConformanceRef(specPC->getGenericConformance())};
1004+
}
1005+
1006+
BridgedSubstitutionMap BridgedProtocolConformance::getSpecializedSubstitutions() const {
1007+
auto *specPC = swift::cast<swift::SpecializedProtocolConformance>(unbridged().getConcrete());
1008+
return {specPC->getSubstitutionMap()};
1009+
}
1010+
1011+
//===----------------------------------------------------------------------===//
1012+
// BridgedProtocolConformanceArray
1013+
//===----------------------------------------------------------------------===//
1014+
1015+
BridgedProtocolConformance BridgedProtocolConformanceArray::getAt(SwiftInt index) const {
1016+
return unbridged()[index];
1017+
}
1018+
9811019
//===----------------------------------------------------------------------===//
9821020
// BridgedInstruction
9831021
//===----------------------------------------------------------------------===//
@@ -1131,6 +1169,14 @@ bool BridgedInstruction::IndexAddrInst_needsStackProtection() const {
11311169
return getAs<swift::IndexAddrInst>()->needsStackProtection();
11321170
}
11331171

1172+
BridgedProtocolConformanceArray BridgedInstruction::InitExistentialRefInst_getConformances() const {
1173+
return getAs<swift::InitExistentialRefInst>()->getConformances();
1174+
}
1175+
1176+
BridgedASTType BridgedInstruction::InitExistentialRefInst_getFormalConcreteType() const {
1177+
return {getAs<swift::InitExistentialRefInst>()->getFormalConcreteType().getPointer()};
1178+
}
1179+
11341180
BridgedGlobalVar BridgedInstruction::GlobalAccessInst_getGlobal() const {
11351181
return {getAs<swift::GlobalAccessInst>()->getReferencedGlobal()};
11361182
}
@@ -2036,20 +2082,19 @@ BridgedInstruction BridgedBuilder::createStore(BridgedValue src, BridgedValue ds
20362082

20372083
BridgedInstruction BridgedBuilder::createInitExistentialRef(BridgedValue instance,
20382084
BridgedType type,
2039-
BridgedInstruction useConformancesOf) const {
2040-
auto *src = useConformancesOf.getAs<swift::InitExistentialRefInst>();
2085+
BridgedASTType formalConcreteType,
2086+
BridgedProtocolConformanceArray conformances) const {
20412087
return {unbridged().createInitExistentialRef(
2042-
regularLoc(), type.unbridged(), src->getFormalConcreteType(),
2043-
instance.getSILValue(), src->getConformances())};
2088+
regularLoc(), type.unbridged(), swift::CanType(formalConcreteType.unbridged()),
2089+
instance.getSILValue(), conformances.unbridged())};
20442090
}
20452091

20462092
BridgedInstruction BridgedBuilder::createInitExistentialMetatype(BridgedValue metatype,
20472093
BridgedType existentialType,
2048-
BridgedInstruction useConformancesOf) const {
2049-
auto *src = useConformancesOf.getAs<swift::InitExistentialMetatypeInst>();
2094+
BridgedProtocolConformanceArray conformances) const {
20502095
return {unbridged().createInitExistentialMetatype(
20512096
regularLoc(), metatype.getSILValue(), existentialType.unbridged(),
2052-
src->getConformances())};
2097+
conformances.unbridged())};
20532098
}
20542099

20552100
BridgedInstruction BridgedBuilder::createMetatype(BridgedType type,

0 commit comments

Comments
 (0)