Skip to content

Commit 968aa79

Browse files
authored
Merge pull request #16085 from slavapestov/reflection-cleanup
Clean up reflection metadata emission
2 parents 0168fa4 + ea293c0 commit 968aa79

File tree

11 files changed

+33
-77
lines changed

11 files changed

+33
-77
lines changed

include/swift/Runtime/RuntimeFunctions.def

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -827,7 +827,7 @@ FUNCTION(AllocateGenericValueMetadata, swift_allocateGenericValueMetadata,
827827
ATTRS(NoUnwind))
828828

829829
// MetadataResponse swift_checkMetadataState(MetadataRequest request,
830-
// cosnt Metadata *type);
830+
// const Metadata *type);
831831
FUNCTION(CheckMetadataState, swift_checkMetadataState, SwiftCC,
832832
RETURNS(TypeMetadataResponseTy),
833833
ARGS(SizeTy, TypeMetadataPtrTy),

lib/IRGen/GenMeta.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -365,8 +365,8 @@ namespace {
365365
}
366366

367367
void addExtendedContext() {
368-
auto string = getTypeRef(IGM,
369-
E->getSelfInterfaceType()->getCanonicalType());
368+
auto string = IGM.getTypeRef(
369+
E->getSelfInterfaceType()->getCanonicalType());
370370
B.addRelativeAddress(string);
371371
}
372372

@@ -3841,7 +3841,7 @@ GenericRequirementsMetadata irgen::addGenericRequirements(
38413841

38423842
auto flags = GenericRequirementFlags(abiKind, false, false);
38433843
auto typeName =
3844-
getTypeRef(IGM, requirement.getSecondType()->getCanonicalType());
3844+
IGM.getTypeRef(requirement.getSecondType()->getCanonicalType());
38453845

38463846
addGenericRequirement(IGM, B, metadata, sig, flags,
38473847
requirement.getFirstType(),

lib/IRGen/GenReflection.cpp

Lines changed: 21 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,12 @@ class PrintMetadataSource
164164
}
165165
};
166166

167+
llvm::Constant *IRGenModule::getTypeRef(CanType type) {
168+
IRGenMangler Mangler;
169+
auto SymbolicName = Mangler.mangleTypeForReflection(*this, type);
170+
return getAddrOfStringForTypeRef(SymbolicName);
171+
}
172+
167173
class ReflectionMetadataBuilder {
168174
protected:
169175
IRGenModule &IGM;
@@ -203,46 +209,23 @@ class ReflectionMetadataBuilder {
203209

204210
/// Add a 32-bit relative offset to a mangled typeref string
205211
/// in the typeref reflection section.
206-
void addTypeRef(ModuleDecl *ModuleContext, CanType type,
207-
CanGenericSignature Context = {}) {
208-
assert(type);
209-
210-
// Generic parameters should be written in terms of interface types
211-
// for the purposes of reflection metadata
212-
assert(!type->hasArchetype() && "Forgot to map typeref out of context");
213-
214-
// TODO: As a compatibility hack, mangle single-field boxes with the legacy
215-
// mangling in reflection metadata.
216-
bool isSingleFieldOfBox = false;
217-
auto boxTy = dyn_cast<SILBoxType>(type);
218-
if (boxTy && boxTy->getLayout()->getFields().size() == 1) {
219-
GenericContextScope scope(IGM, Context);
220-
type = boxTy->getFieldLoweredType(IGM.getSILModule(), 0);
221-
isSingleFieldOfBox = true;
222-
}
223-
IRGenMangler mangler;
224-
auto MangledStr = mangler.mangleTypeForReflection(IGM, type,
225-
ModuleContext,
226-
isSingleFieldOfBox);
227-
auto mangledName = IGM.getAddrOfStringForTypeRef(MangledStr);
228-
B.addRelativeAddress(mangledName);
212+
void addTypeRef(CanType type) {
213+
B.addRelativeAddress(IGM.getTypeRef(type));
229214
}
230215

231216
/// Add a 32-bit relative offset to a mangled nominal type string
232217
/// in the typeref reflection section.
233218
void addNominalRef(const NominalTypeDecl *nominal) {
234-
IRGenMangler mangler;
235-
SymbolicMangling mangledStr;
236219
if (auto proto = dyn_cast<ProtocolDecl>(nominal)) {
220+
IRGenMangler mangler;
221+
SymbolicMangling mangledStr;
237222
mangledStr.String = mangler.mangleBareProtocol(proto);
223+
auto mangledName = IGM.getAddrOfStringForTypeRef(mangledStr);
224+
B.addRelativeAddress(mangledName);
238225
} else {
239226
CanType type = nominal->getDeclaredType()->getCanonicalType();
240-
mangledStr =
241-
mangler.mangleTypeForReflection(IGM, type, nominal->getModuleContext(),
242-
/*isSingleFieldOfBox=*/false);
227+
B.addRelativeAddress(IGM.getTypeRef(type));
243228
}
244-
auto mangledName = IGM.getAddrOfStringForTypeRef(mangledStr);
245-
B.addRelativeAddress(mangledName);
246229
}
247230

248231
llvm::GlobalVariable *emit(Optional<LinkEntity> entity,
@@ -296,9 +279,7 @@ class AssociatedTypeMetadataBuilder : public ReflectionMetadataBuilder {
296279
PrettyStackTraceDecl DebugStack("emitting associated type metadata",
297280
Nominal);
298281

299-
auto *M = IGM.getSILModule().getSwiftModule();
300-
301-
addTypeRef(M, Nominal->getDeclaredType()->getCanonicalType());
282+
addTypeRef(Nominal->getDeclaredType()->getCanonicalType());
302283
addNominalRef(Conformance->getProtocol());
303284

304285
B.addInt32(AssociatedTypes.size());
@@ -308,7 +289,7 @@ class AssociatedTypeMetadataBuilder : public ReflectionMetadataBuilder {
308289
auto NameGlobal = IGM.getAddrOfFieldName(AssocTy.first);
309290
B.addRelativeAddress(NameGlobal);
310291
addBuiltinTypeRefs(AssocTy.second);
311-
addTypeRef(M, AssocTy.second);
292+
addTypeRef(AssocTy.second);
312293
}
313294
}
314295

@@ -342,7 +323,7 @@ class FieldTypeMetadataBuilder : public ReflectionMetadataBuilder {
342323
if (!type) {
343324
B.addInt32(0);
344325
} else {
345-
addTypeRef(value->getModuleContext(), type);
326+
addTypeRef(type);
346327
addBuiltinTypeRefs(type);
347328
}
348329

@@ -448,8 +429,7 @@ class FieldTypeMetadataBuilder : public ReflectionMetadataBuilder {
448429

449430
auto *CD = dyn_cast<ClassDecl>(NTD);
450431
if (CD && CD->getSuperclass()) {
451-
addTypeRef(NTD->getModuleContext(),
452-
CD->getSuperclass()->getCanonicalType());
432+
addTypeRef(CD->getSuperclass()->getCanonicalType());
453433
} else {
454434
B.addInt32(0);
455435
}
@@ -511,7 +491,7 @@ class FixedTypeMetadataBuilder : public ReflectionMetadataBuilder {
511491
}
512492

513493
void layout() override {
514-
addTypeRef(module, type);
494+
addTypeRef(type);
515495

516496
B.addInt32(ti->getFixedSize().getValue());
517497
B.addInt32(ti->getFixedAlignment().getValue());
@@ -561,7 +541,7 @@ class BoxDescriptorBuilder : public ReflectionMetadataBuilder {
561541
B.addInt32(0); // Number of sources
562542
B.addInt32(0); // Number of generic bindings
563543

564-
addTypeRef(IGM.getSILModule().getSwiftModule(), BoxedType);
544+
addTypeRef(BoxedType);
565545
addBuiltinTypeRefs(BoxedType);
566546
}
567547

@@ -754,8 +734,7 @@ class CaptureDescriptorBuilder : public ReflectionMetadataBuilder {
754734

755735
// Now add typerefs of all of the captures.
756736
for (auto CaptureType : CaptureTypes) {
757-
addTypeRef(IGM.getSILModule().getSwiftModule(), CaptureType,
758-
OrigCalleeType->getGenericSignature());
737+
addTypeRef(CaptureType);
759738
addBuiltinTypeRefs(CaptureType);
760739
}
761740

@@ -765,7 +744,7 @@ class CaptureDescriptorBuilder : public ReflectionMetadataBuilder {
765744
auto GenericParam = GenericAndSource.first->getCanonicalType();
766745
auto Source = GenericAndSource.second;
767746

768-
addTypeRef(nullptr, GenericParam);
747+
addTypeRef(GenericParam);
769748
addMetadataSource(Source);
770749
}
771750
}

lib/IRGen/IRGenMangler.cpp

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -81,10 +81,8 @@ std::string IRGenMangler::manglePartialApplyForwarder(StringRef FuncName) {
8181

8282
SymbolicMangling
8383
IRGenMangler::mangleTypeForReflection(IRGenModule &IGM,
84-
Type Ty,
85-
ModuleDecl *Module,
86-
bool isSingleFieldOfBox) {
87-
Mod = Module;
84+
Type Ty) {
85+
Mod = IGM.getSwiftModule();
8886
OptimizeProtocolNames = false;
8987

9088
llvm::SaveAndRestore<std::function<bool (const DeclContext *)>>
@@ -109,8 +107,6 @@ IRGenMangler::mangleTypeForReflection(IRGenModule &IGM,
109107
SymbolicReferences.clear();
110108

111109
appendType(Ty);
112-
if (isSingleFieldOfBox)
113-
appendOperator("Xb");
114110

115111
return {finalize(), std::move(SymbolicReferences)};
116112
}

lib/IRGen/IRGenMangler.h

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -354,9 +354,7 @@ class IRGenMangler : public Mangle::ASTMangler {
354354
}
355355

356356
SymbolicMangling mangleTypeForReflection(IRGenModule &IGM,
357-
Type Ty,
358-
ModuleDecl *Module,
359-
bool isSingleFieldOfBox);
357+
Type Ty);
360358

361359
std::string mangleTypeForLLVMTypeName(CanType Ty);
362360

lib/IRGen/IRGenModule.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -970,6 +970,7 @@ class IRGenModule {
970970
/// reflection metadata.
971971
llvm::SetVector<const StructDecl *> ImportedStructs;
972972

973+
llvm::Constant *getTypeRef(CanType type);
973974
llvm::Constant *getAddrOfStringForTypeRef(StringRef mangling);
974975
llvm::Constant *getAddrOfStringForTypeRef(const SymbolicMangling &mangling);
975976
llvm::Constant *getAddrOfFieldName(StringRef Name);

lib/IRGen/MetadataRequest.cpp

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -297,18 +297,6 @@ llvm::Constant *IRGenModule::getAddrOfStringForTypeRef(
297297
return addr;
298298
}
299299

300-
// FIXME: willBeRelativelyAddressed is only needed to work around an ld64 bug
301-
// resolving relative references to coalesceable symbols.
302-
// It should be removed when fixed. rdar://problem/22674524
303-
llvm::Constant *irgen::getTypeRef(IRGenModule &IGM, CanType type) {
304-
IRGenMangler Mangler;
305-
auto SymbolicName = Mangler.mangleTypeForReflection(IGM, type,
306-
IGM.getSwiftModule(),
307-
/*single-field box*/ false);
308-
309-
return IGM.getAddrOfStringForTypeRef(SymbolicName);
310-
}
311-
312300
llvm::Value *irgen::emitObjCMetadataRefForMetadata(IRGenFunction &IGF,
313301
llvm::Value *classPtr) {
314302
assert(IGF.IGM.Context.LangOpts.EnableObjCInterop);

lib/IRGen/MetadataRequest.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -503,8 +503,6 @@ emitInPlaceTypeMetadataAccessFunctionBody(IRGenFunction &IGF,
503503
llvm::Value *uniqueForeignTypeMetadataRef(IRGenFunction &IGF,
504504
llvm::Value *candidate);
505505

506-
llvm::Constant *getTypeRef(IRGenModule &IGM, CanType type);
507-
508506
using LazyCacheEmitter =
509507
llvm::function_ref<MetadataResponse(IRGenFunction &IGF, Explosion &params)>;
510508

test/Reflection/capture_descriptors.sil

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,7 @@ bb0(%i: $Int, %p: $@thick P.Type):
4141

4242
// CHECK: - Capture types:
4343
// CHECK-NEXT: (struct Swift.Int)
44-
// CHECK-NEXT: (sil_box
45-
// CHECK-NEXT: (struct Swift.Int))
44+
// CHECK-NEXT: (builtin Builtin.NativeObject)
4645
// CHECK-NEXT: (existential_metatype
4746
// CHECK-NEXT: (protocol_composition
4847
// CHECK-NEXT: (protocol capture_descriptors.P)))
@@ -76,8 +75,7 @@ bb0:
7675

7776
// CHECK: - Capture types:
7877
// CHECK-NEXT: (struct Swift.Int)
79-
// CHECK-NEXT: (sil_box
80-
// CHECK-NEXT: (struct Swift.String))
78+
// CHECK-NEXT: (builtin Builtin.NativeObject)
8179
// CHECK-NEXT: - Metadata sources:
8280

8381

test/Reflection/typeref_decoding.swift

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -708,8 +708,7 @@
708708
// CHECK: CAPTURE DESCRIPTORS:
709709
// CHECK: ====================
710710
// CHECK: - Capture types:
711-
// CHECK: (sil_box
712-
// CHECK: (generic_type_parameter depth=0 index=0))
711+
// CHECK: (builtin Builtin.NativeObject)
713712
// CHECK: - Metadata sources:
714713
// CHECK: (generic_type_parameter depth=0 index=0)
715714
// CHECK: (closure_binding index=0)

test/Reflection/typeref_decoding_asan.swift

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -708,8 +708,7 @@
708708
// CHECK: CAPTURE DESCRIPTORS:
709709
// CHECK: ====================
710710
// CHECK: - Capture types:
711-
// CHECK: (sil_box
712-
// CHECK: (generic_type_parameter depth=0 index=0))
711+
// CHECK: (builtin Builtin.NativeObject)
713712
// CHECK: - Metadata sources:
714713
// CHECK: (generic_type_parameter depth=0 index=0)
715714
// CHECK: (closure_binding index=0)

0 commit comments

Comments
 (0)