Skip to content

Commit 6072d87

Browse files
committed
Bridging: Implement bridges required for ongoing AutoDiff changes
In swiftlang#83926, part of the changes resolving swiftlang#68944 is submitted. The AutoDiff closure specialization optimizer pass relies on several AST-level bridges not implemented yet. This patch introduces these missing bridges.
1 parent 52a163f commit 6072d87

File tree

10 files changed

+333
-10
lines changed

10 files changed

+333
-10
lines changed

SwiftCompilerSources/Sources/SIL/Context.swift

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,20 @@ extension Context {
5555
}
5656
}
5757

58+
public func getTupleType(elements: [AST.`Type`]) -> AST.`Type` {
59+
let bridgedElements = elements.map { $0.bridged }
60+
return bridgedElements.withBridgedArrayRef {
61+
AST.`Type`(bridged: _bridged.getTupleType($0))
62+
}
63+
}
64+
65+
public func getTupleTypeWithLabels(elements: [AST.`Type`], labels: [swift.Identifier]) -> AST.`Type` {
66+
assert(elements.count == labels.count)
67+
return elements.withBridgedArrayRef{
68+
eltArr in labels.withBridgedArrayRef{labelsArr in
69+
AST.`Type`(bridged: _bridged.getTupleTypeWithLabels(eltArr, labelsArr))}}
70+
}
71+
5872
public var swiftArrayDecl: NominalTypeDecl {
5973
_bridged.getSwiftArrayDecl().getAs(NominalTypeDecl.self)
6074
}

SwiftCompilerSources/Sources/SIL/Type.swift

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -266,6 +266,7 @@ public struct NominalFieldsArray : RandomAccessCollection, FormattedLikeArray {
266266
}
267267

268268
public struct EnumCase {
269+
public let enumElementDecl : EnumElementDecl
269270
public let payload: Type?
270271
public let index: Int
271272
}
@@ -288,7 +289,8 @@ public struct EnumCases : CollectionLikeSequence, IteratorProtocol {
288289
caseIterator = caseIterator.getNext()
289290
caseIndex += 1
290291
}
291-
return EnumCase(payload: enumType.bridged.getEnumCasePayload(caseIterator, function.bridged).typeOrNil,
292+
return EnumCase(enumElementDecl: enumType.bridged.getEnumElementDecl(caseIterator).getAs(EnumElementDecl.self),
293+
payload: enumType.bridged.getEnumCasePayload(caseIterator, function.bridged).typeOrNil,
292294
index: caseIndex)
293295
}
294296
return nil
@@ -304,6 +306,10 @@ public struct TupleElementArray : RandomAccessCollection, FormattedLikeArray {
304306
public subscript(_ index: Int) -> Type {
305307
type.bridged.getTupleElementType(index).type
306308
}
309+
310+
public func label(at index: Int) -> swift.Identifier {
311+
type.bridged.getTupleElementLabel(index)
312+
}
307313
}
308314

309315
public struct BoxFieldsArray : RandomAccessCollection, FormattedLikeArray {

include/swift/AST/ASTBridging.h

Lines changed: 87 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -361,6 +361,7 @@ struct BridgedDeclObj {
361361
BRIDGED_INLINE swift::SourceLoc getLoc() const;
362362
SWIFT_IMPORT_UNSAFE BRIDGED_INLINE BridgedDeclObj getModuleContext() const;
363363
SWIFT_IMPORT_UNSAFE BRIDGED_INLINE OptionalBridgedDeclObj getParent() const;
364+
SWIFT_IMPORT_UNSAFE BRIDGED_INLINE BridgedDeclContext getDeclContext() const;
364365
SWIFT_IMPORT_UNSAFE BRIDGED_INLINE BridgedStringRef Type_getName() const;
365366
SWIFT_IMPORT_UNSAFE BRIDGED_INLINE BridgedStringRef Value_getUserFacingName() const;
366367
SWIFT_IMPORT_UNSAFE BRIDGED_INLINE swift::SourceLoc Value_getNameLoc() const;
@@ -378,6 +379,10 @@ struct BridgedDeclObj {
378379
BRIDGED_INLINE bool AbstractFunction_isOverridden() const;
379380
BRIDGED_INLINE bool Destructor_isIsolated() const;
380381
BRIDGED_INLINE bool EnumElementDecl_hasAssociatedValues() const;
382+
SWIFT_IMPORT_UNSAFE BRIDGED_INLINE BridgedParameterList
383+
EnumElementDecl_getParameterList() const;
384+
SWIFT_IMPORT_UNSAFE BRIDGED_INLINE BridgedStringRef
385+
EnumElementDecl_getNameStr() const;
381386
SWIFT_IMPORT_UNSAFE BRIDGED_INLINE BridgedStringRef AccessorDecl_getKindName() const;
382387
};
383388

@@ -431,6 +436,23 @@ class BridgedASTNode {
431436
#define ABSTRACT_DECL(Id, Parent) DECL(Id, Parent)
432437
#include "swift/AST/DeclNodes.def"
433438

439+
// Declare `.asValueDecl` on each BridgedXXXDecl type that's also a
440+
// ValueDecl.
441+
#define DECL(Id, Parent)
442+
#define VALUE_DECL(Id, Parent) \
443+
SWIFT_NAME("getter:Bridged" #Id "Decl.asValueDecl(self:)") \
444+
BridgedValueDecl Bridged##Id##Decl_asValueDecl(Bridged##Id##Decl decl);
445+
#include "swift/AST/DeclNodes.def"
446+
447+
// Declare `.asNominalTypeDecl` on each BridgedXXXDecl type that's also a
448+
// NominalTypeDecl.
449+
#define DECL(Id, Parent)
450+
#define NOMINAL_TYPE_DECL(Id, Parent) \
451+
SWIFT_NAME("getter:Bridged" #Id "Decl.asNominalTypeDecl(self:)") \
452+
BridgedNominalTypeDecl Bridged##Id##Decl_asNominalTypeDecl( \
453+
Bridged##Id##Decl decl);
454+
#include "swift/AST/DeclNodes.def"
455+
434456
// Declare `.asDeclContext` on each BridgedXXXDecl type that's also a
435457
// DeclContext.
436458
#define DECL(Id, Parent)
@@ -440,6 +462,16 @@ class BridgedASTNode {
440462
#define ABSTRACT_CONTEXT_DECL(Id, Parent) CONTEXT_DECL(Id, Parent)
441463
#include "swift/AST/DeclNodes.def"
442464

465+
// Declare `.asGenericContext` on each BridgedXXXDecl type that's also a
466+
// GenericContext.
467+
#define DECL(Id, Parent)
468+
#define GENERIC_DECL(Id, Parent) \
469+
SWIFT_NAME("getter:Bridged" #Id "Decl.asGenericContext(self:)") \
470+
BridgedGenericContext Bridged##Id##Decl_asGenericContext( \
471+
Bridged##Id##Decl decl);
472+
#define ITERABLE_GENERIC_DECL(Id, Parent) GENERIC_DECL(Id, Parent)
473+
#include "swift/AST/DeclNodes.def"
474+
443475
// Declare `.asStmt` on each BridgedXXXStmt type, which upcasts a wrapper for
444476
// a Stmt subclass to a BridgedStmt.
445477
#define STMT(Id, Parent) \
@@ -617,6 +649,10 @@ BridgedDeclContext_getParentSourceFile(BridgedDeclContext dc);
617649
SWIFT_NAME("getter:BridgedSourceFile.isScriptMode(self:)")
618650
BRIDGED_INLINE bool BridgedSourceFile_isScriptMode(BridgedSourceFile sf);
619651

652+
SWIFT_NAME("BridgedSourceFile.addTopLevelDecl(self:_:)")
653+
BRIDGED_INLINE void BridgedSourceFile_addTopLevelDecl(BridgedSourceFile sf,
654+
BridgedDecl decl);
655+
620656
SWIFT_NAME("BridgedPatternBindingInitializer.create(declContext:)")
621657
BridgedPatternBindingInitializer
622658
BridgedPatternBindingInitializer_create(BridgedDeclContext cDeclContext);
@@ -1384,10 +1420,18 @@ BridgedParamDecl BridgedParamDecl_createParsed(
13841420
swift::SourceLoc paramNameLoc, BridgedNullableExpr defaultValue,
13851421
BridgedNullableDefaultArgumentInitializer cDefaultArgumentInitContext);
13861422

1423+
SWIFT_NAME("BridgedParamDecl.cloneWithoutType(self:)")
1424+
BRIDGED_INLINE BridgedParamDecl
1425+
BridgedParamDecl_cloneWithoutType(BridgedParamDecl cDecl);
1426+
13871427
SWIFT_NAME("BridgedParamDecl.setTypeRepr(self:_:)")
13881428
BRIDGED_INLINE void BridgedParamDecl_setTypeRepr(BridgedParamDecl cDecl,
13891429
BridgedTypeRepr cType);
13901430

1431+
SWIFT_NAME("BridgedParamDecl.setInterfaceType(self:_:)")
1432+
BRIDGED_INLINE void BridgedParamDecl_setInterfaceType(BridgedParamDecl cDecl,
1433+
BridgedASTType cType);
1434+
13911435
/// The various spellings of ownership modifier that can be used in source.
13921436
enum ENUM_EXTENSIBILITY_ATTR(closed) BridgedParamSpecifier {
13931437
BridgedParamSpecifierDefault,
@@ -1406,8 +1450,18 @@ BRIDGED_INLINE void
14061450
BridgedParamDecl_setSpecifier(BridgedParamDecl cDecl,
14071451
BridgedParamSpecifier cSpecifier);
14081452

1409-
SWIFT_NAME("BridgedParamDecl.setImplicit(self:)")
1410-
BRIDGED_INLINE void BridgedParamDecl_setImplicit(BridgedParamDecl cDecl);
1453+
SWIFT_NAME("BridgedDecl.setImplicit(self:)")
1454+
BRIDGED_INLINE void BridgedDecl_setImplicit(BridgedDecl cDecl);
1455+
1456+
SWIFT_NAME("BridgedGenericContext.setGenericSignature(self:_:)")
1457+
BRIDGED_INLINE void
1458+
BridgedGenericContext_setGenericSignature(BridgedGenericContext cDecl,
1459+
BridgedGenericSignature cGenSig);
1460+
1461+
SWIFT_NAME("BridgedNominalTypeDecl.addMember(self:_:)")
1462+
BRIDGED_INLINE void
1463+
BridgedNominalTypeDecl_addMember(BridgedNominalTypeDecl cDecl,
1464+
BridgedDecl member);
14111465

14121466
SWIFT_NAME("BridgedConstructorDecl.setParsedBody(self:_:)")
14131467
void BridgedConstructorDecl_setParsedBody(BridgedConstructorDecl decl,
@@ -1471,14 +1525,20 @@ void BridgedExtensionDecl_setParsedMembers(BridgedExtensionDecl decl,
14711525
SWIFT_NAME(
14721526
"BridgedEnumDecl.createParsed(_:declContext:enumKeywordLoc:name:nameLoc:"
14731527
"genericParamList:inheritedTypes:genericWhereClause:braceRange:)")
1474-
BridgedNominalTypeDecl BridgedEnumDecl_createParsed(
1528+
BridgedEnumDecl BridgedEnumDecl_createParsed(
14751529
BridgedASTContext cContext, BridgedDeclContext cDeclContext,
14761530
swift::SourceLoc enumKeywordLoc, swift::Identifier name,
14771531
swift::SourceLoc nameLoc, BridgedNullableGenericParamList genericParamList,
14781532
BridgedArrayRef cInheritedTypes,
14791533
BridgedNullableTrailingWhereClause genericWhereClause,
14801534
swift::SourceRange braceRange);
14811535

1536+
SWIFT_NAME("BridgedEnumDecl.create(_:declContext:name:genericParamList:)")
1537+
BridgedEnumDecl
1538+
BridgedEnumDecl_create(BridgedASTContext cContext,
1539+
BridgedDeclContext cDeclContext, BridgedStringRef name,
1540+
BridgedNullableGenericParamList genericParamList);
1541+
14821542
SWIFT_NAME(
14831543
"BridgedEnumCaseDecl.createParsed(declContext:caseKeywordLoc:elements:)")
14841544
BridgedEnumCaseDecl
@@ -1494,6 +1554,12 @@ BridgedEnumElementDecl BridgedEnumElementDecl_createParsed(
14941554
BridgedNullableParameterList parameterList, swift::SourceLoc equalsLoc,
14951555
BridgedNullableExpr opaqueRawValue);
14961556

1557+
SWIFT_NAME("BridgedEnumElementDecl.create(_:declContext:name:"
1558+
"parameterList:)")
1559+
BridgedEnumElementDecl BridgedEnumElementDecl_create(
1560+
BridgedASTContext cContext, BridgedDeclContext cDeclContext,
1561+
BridgedStringRef name, BridgedParameterList parameterList);
1562+
14971563
SWIFT_NAME("BridgedStructDecl.createParsed(_:declContext:structKeywordLoc:name:"
14981564
"nameLoc:genericParamList:inheritedTypes:genericWhereClause:"
14991565
"braceRange:)")
@@ -1662,6 +1728,9 @@ void BridgedTopLevelCodeDecl_dump(BridgedTopLevelCodeDecl decl);
16621728
SWIFT_NAME("BridgedDecl.dump(self:)")
16631729
void BridgedDecl_dump(BridgedDecl decl);
16641730

1731+
SWIFT_NAME("BridgedValueDecl.setAccessPublic(self:)")
1732+
void BridgedValueDecl_setAccessPublic(BridgedValueDecl decl);
1733+
16651734
//===----------------------------------------------------------------------===//
16661735
// MARK: AbstractStorageDecl
16671736
//===----------------------------------------------------------------------===//
@@ -2913,6 +2982,10 @@ BridgedParameterList BridgedParameterList_createParsed(
29132982
BridgedASTContext cContext, swift::SourceLoc leftParenLoc,
29142983
BridgedArrayRef cParameters, swift::SourceLoc rightParenLoc);
29152984

2985+
SWIFT_NAME("BridgedParameterList.create(_:parameters:)")
2986+
BridgedParameterList BridgedParameterList_create(BridgedASTContext cContext,
2987+
BridgedArrayRef cParameters);
2988+
29162989
SWIFT_NAME("getter:BridgedParameterList.size(self:)")
29172990
size_t BridgedParameterList_size(BridgedParameterList cParameterList);
29182991

@@ -3017,6 +3090,7 @@ struct BridgedASTType {
30173090
SWIFT_IMPORT_UNSAFE BRIDGED_INLINE BridgedGenericSignature getInvocationGenericSignatureOfFunctionType() const;
30183091
SWIFT_IMPORT_UNSAFE BRIDGED_INLINE BridgedASTType subst(BridgedSubstitutionMap substMap) const;
30193092
SWIFT_IMPORT_UNSAFE BRIDGED_INLINE BridgedConformance checkConformance(BridgedDeclObj proto) const;
3093+
SWIFT_IMPORT_UNSAFE BRIDGED_INLINE BridgedASTType mapTypeOutOfContext() const;
30203094
};
30213095

30223096
class BridgedCanType {
@@ -3084,13 +3158,23 @@ struct BridgedSubstitutionMap {
30843158
SWIFT_IMPORT_UNSAFE BRIDGED_INLINE BridgedASTTypeArray getReplacementTypes() const;
30853159
};
30863160

3161+
struct BridgedCanGenericSignature;
3162+
30873163
struct BridgedGenericSignature {
30883164
const swift::GenericSignatureImpl * _Nullable impl;
30893165

30903166
BRIDGED_INLINE swift::GenericSignature unbridged() const;
30913167
BridgedOwnedString getDebugDescription() const;
30923168
SWIFT_IMPORT_UNSAFE BRIDGED_INLINE BridgedASTTypeArray getGenericParams() const;
30933169
SWIFT_IMPORT_UNSAFE BRIDGED_INLINE BridgedASTType mapTypeIntoContext(BridgedASTType type) const;
3170+
BRIDGED_INLINE BridgedCanGenericSignature getCanonicalSignature() const;
3171+
};
3172+
3173+
struct BridgedCanGenericSignature {
3174+
const swift::GenericSignatureImpl *_Nullable impl;
3175+
3176+
BRIDGED_INLINE swift::CanGenericSignature unbridged() const;
3177+
BRIDGED_INLINE BridgedGenericSignature getGenericSignature() const;
30943178
};
30953179

30963180
struct BridgedFingerprint {

include/swift/AST/ASTBridgingImpl.h

Lines changed: 58 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,12 @@ bool BridgedSourceFile_isScriptMode(BridgedSourceFile sf) {
137137
return sf.unbridged()->isScriptMode();
138138
}
139139

140+
void BridgedSourceFile_addTopLevelDecl(BridgedSourceFile sf, BridgedDecl decl) {
141+
auto &file = sf.unbridged()->getOrCreateSynthesizedFile();
142+
file.addTopLevelDecl(decl.unbridged());
143+
file.getParentModule()->clearLookupCache();
144+
}
145+
140146
//===----------------------------------------------------------------------===//
141147
// MARK: BridgedDeclObj
142148
//===----------------------------------------------------------------------===//
@@ -153,6 +159,10 @@ OptionalBridgedDeclObj BridgedDeclObj::getParent() const {
153159
return {unbridged()->getDeclContext()->getAsDecl()};
154160
}
155161

162+
BridgedDeclContext BridgedDeclObj::getDeclContext() const {
163+
return {unbridged()->getDeclContext()};
164+
}
165+
156166
BridgedStringRef BridgedDeclObj::Type_getName() const {
157167
return getAs<swift::TypeDecl>()->getName().str();
158168
}
@@ -223,6 +233,14 @@ bool BridgedDeclObj::EnumElementDecl_hasAssociatedValues() const {
223233
return getAs<swift::EnumElementDecl>()->hasAssociatedValues();
224234
}
225235

236+
BridgedParameterList BridgedDeclObj::EnumElementDecl_getParameterList() const {
237+
return getAs<swift::EnumElementDecl>()->getParameterList();
238+
}
239+
240+
BridgedStringRef BridgedDeclObj::EnumElementDecl_getNameStr() const {
241+
return getAs<swift::EnumElementDecl>()->getNameStr();
242+
}
243+
226244
//===----------------------------------------------------------------------===//
227245
// MARK: BridgedASTNode
228246
//===----------------------------------------------------------------------===//
@@ -326,20 +344,41 @@ swift::ParamSpecifier unbridge(BridgedParamSpecifier specifier) {
326344
}
327345
}
328346

347+
BridgedParamDecl
348+
BridgedParamDecl_cloneWithoutType(BridgedParamDecl cDecl) {
349+
return swift::ParamDecl::cloneWithoutType(cDecl.unbridged()->getASTContext(),
350+
cDecl.unbridged());
351+
}
352+
329353
void BridgedParamDecl_setTypeRepr(BridgedParamDecl cDecl,
330354
BridgedTypeRepr cType) {
331355
cDecl.unbridged()->setTypeRepr(cType.unbridged());
332356
}
333357

358+
void BridgedParamDecl_setInterfaceType(BridgedParamDecl cDecl,
359+
BridgedASTType cType) {
360+
cDecl.unbridged()->setInterfaceType(cType.unbridged());
361+
}
362+
334363
void BridgedParamDecl_setSpecifier(BridgedParamDecl cDecl,
335364
BridgedParamSpecifier cSpecifier) {
336365
cDecl.unbridged()->setSpecifier(unbridge(cSpecifier));
337366
}
338367

339-
void BridgedParamDecl_setImplicit(BridgedParamDecl cDecl) {
368+
void BridgedDecl_setImplicit(BridgedDecl cDecl) {
340369
cDecl.unbridged()->setImplicit();
341370
}
342371

372+
void BridgedGenericContext_setGenericSignature(
373+
BridgedGenericContext cDecl, BridgedGenericSignature cGenSig) {
374+
cDecl.unbridged()->setGenericSignature(cGenSig.unbridged());
375+
}
376+
377+
void BridgedNominalTypeDecl_addMember(BridgedNominalTypeDecl cDecl,
378+
BridgedDecl member) {
379+
cDecl.unbridged()->addMember(member.unbridged());
380+
}
381+
343382
//===----------------------------------------------------------------------===//
344383
// MARK: BridgedSubscriptDecl
345384
//===----------------------------------------------------------------------===//
@@ -607,6 +646,10 @@ BridgedConformance BridgedASTType::checkConformance(BridgedDeclObj proto) const
607646
return swift::checkConformance(unbridged(), proto.getAs<swift::ProtocolDecl>(), /*allowMissing=*/ false);
608647
}
609648

649+
BridgedASTType BridgedASTType::mapTypeOutOfContext() const {
650+
return {unbridged()->mapTypeOutOfContext().getPointer()};
651+
}
652+
610653
static_assert((int)BridgedASTType::TraitResult::IsNot == (int)swift::TypeTraitResult::IsNot);
611654
static_assert((int)BridgedASTType::TraitResult::CanBe == (int)swift::TypeTraitResult::CanBe);
612655
static_assert((int)BridgedASTType::TraitResult::Is == (int)swift::TypeTraitResult::Is);
@@ -824,6 +867,20 @@ BridgedASTType BridgedGenericSignature::mapTypeIntoContext(BridgedASTType type)
824867
return {unbridged().getGenericEnvironment()->mapTypeIntoContext(type.unbridged()).getPointer()};
825868
}
826869

870+
BridgedCanGenericSignature
871+
BridgedGenericSignature::getCanonicalSignature() const {
872+
return BridgedCanGenericSignature{impl};
873+
}
874+
875+
swift::CanGenericSignature BridgedCanGenericSignature::unbridged() const {
876+
return swift::GenericSignature(impl).getCanonicalSignature();
877+
}
878+
879+
BridgedGenericSignature
880+
BridgedCanGenericSignature::getGenericSignature() const {
881+
return BridgedGenericSignature{impl};
882+
}
883+
827884
//===----------------------------------------------------------------------===//
828885
// MARK: BridgedFingerprint
829886
//===----------------------------------------------------------------------===//

include/swift/AST/ASTBridgingWrappers.def

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@
9595
// optional parameters.
9696
AST_BRIDGING_WRAPPER_NULLABLE(Decl)
9797
AST_BRIDGING_WRAPPER_NONNULL(DeclContext)
98+
AST_BRIDGING_WRAPPER_NONNULL(GenericContext)
9899
AST_BRIDGING_WRAPPER_NONNULL(SourceFile)
99100
AST_BRIDGING_WRAPPER_NULLABLE(Stmt)
100101
AST_BRIDGING_WRAPPER_NULLABLE(Expr)

0 commit comments

Comments
 (0)