Skip to content

Commit d07efd3

Browse files
committed
Requestify the mangling-to-metadata APIs.
Note that I've called out a couple of suspicious places where we are requesting abstract metadata for superclasses but probably need to be requesting something more complete.
1 parent de45648 commit d07efd3

File tree

7 files changed

+90
-68
lines changed

7 files changed

+90
-68
lines changed

stdlib/public/runtime/CompatibilityOverride.def

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -145,17 +145,19 @@ OVERRIDE_KEYPATH(getKeyPath, const HeapObject *, , , swift::,
145145
(const void *pattern, const void *arguments),
146146
(pattern, arguments))
147147

148-
OVERRIDE_METADATALOOKUP(getTypeByMangledNode, TypeInfo, , , swift::,
149-
(Demangler &demangler,
148+
OVERRIDE_METADATALOOKUP(getTypeByMangledNode, TypeInfo, , SWIFT_CC(swift), swift::,
149+
(MetadataRequest request,
150+
Demangler &demangler,
150151
Demangle::NodePointer node,
151152
SubstGenericParameterFn substGenericParam,
152153
SubstDependentWitnessTableFn substWitnessTable),
153-
(demangler, node, substGenericParam, substWitnessTable))
154-
OVERRIDE_METADATALOOKUP(getTypeByMangledName, TypeInfo, , , swift::,
155-
(StringRef typeName,
154+
(request, demangler, node, substGenericParam, substWitnessTable))
155+
OVERRIDE_METADATALOOKUP(getTypeByMangledName, TypeInfo, , SWIFT_CC(swift), swift::,
156+
(MetadataRequest request,
157+
StringRef typeName,
156158
SubstGenericParameterFn substGenericParam,
157159
SubstDependentWitnessTableFn substWitnessTable),
158-
(typeName, substGenericParam, substWitnessTable))
160+
(request, typeName, substGenericParam, substWitnessTable))
159161

160162
OVERRIDE_WITNESSTABLE(getAssociatedTypeWitnessSlow, MetadataResponse,
161163
SWIFT_RUNTIME_STDLIB_INTERNAL, SWIFT_CC(swift), swift::,

stdlib/public/runtime/Metadata.cpp

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2596,8 +2596,12 @@ swift::swift_initClassMetadata(ClassMetadata *self,
25962596
StringRef superclassName =
25972597
Demangle::makeSymbolicMangledNameStringRef(superclassNameBase);
25982598
SubstGenericParametersFromMetadata substitutions(self);
2599-
const Metadata *superclass =
2600-
swift_getTypeByMangledName(superclassName, substitutions, substitutions);
2599+
MetadataRequest request(/*FIXME*/MetadataState::Abstract,
2600+
/*non-blocking*/ false);
2601+
MetadataResponse response =
2602+
swift_getTypeByMangledName(request, superclassName,
2603+
substitutions, substitutions).getResponse();
2604+
auto superclass = response.Value;
26012605
if (!superclass) {
26022606
fatalError(0,
26032607
"failed to demangle superclass of %s from mangled name '%s'\n",
@@ -2686,8 +2690,12 @@ swift::swift_updateClassMetadata(ClassMetadata *self,
26862690
StringRef superclassName =
26872691
Demangle::makeSymbolicMangledNameStringRef(superclassNameBase);
26882692
SubstGenericParametersFromMetadata substitutions(self);
2689-
const Metadata *superclass =
2690-
swift_getTypeByMangledName(superclassName, substitutions, substitutions);
2693+
MetadataRequest request(/*FIXME*/MetadataState::Abstract,
2694+
/*non-blocking*/ false);
2695+
MetadataResponse response =
2696+
swift_getTypeByMangledName(request, superclassName,
2697+
substitutions, substitutions).getResponse();
2698+
const Metadata *superclass = response.Value;
26912699
if (!superclass) {
26922700
fatalError(0,
26932701
"failed to demangle superclass of %s from mangled name '%s'\n",
@@ -4192,12 +4200,12 @@ swift_getAssociatedTypeWitnessSlowImpl(
41924200
Demangle::makeSymbolicMangledNameStringRef(mangledNameBase);
41934201

41944202
// Demangle the associated type.
4195-
const Metadata *assocTypeMetadata;
4203+
MetadataResponse response;
41964204
if (inProtocolContext) {
41974205
// The protocol's Self is the only generic parameter that can occur in the
41984206
// type.
4199-
assocTypeMetadata =
4200-
swift_getTypeByMangledName(mangledName,
4207+
response =
4208+
swift_getTypeByMangledName(request, mangledName,
42014209
[conformingType](unsigned depth, unsigned index) -> const Metadata * {
42024210
if (depth == 0 && index == 0)
42034211
return conformingType;
@@ -4214,7 +4222,7 @@ swift_getAssociatedTypeWitnessSlowImpl(
42144222
return swift_getAssociatedConformanceWitness(wtable, conformingType,
42154223
type, reqBase,
42164224
dependentDescriptor);
4217-
});
4225+
}).getResponse();
42184226
} else {
42194227
// The generic parameters in the associated type name are those of the
42204228
// conforming type.
@@ -4224,9 +4232,10 @@ swift_getAssociatedTypeWitnessSlowImpl(
42244232
auto originalConformingType = findConformingSuperclass(conformingType,
42254233
conformance);
42264234
SubstGenericParametersFromMetadata substitutions(originalConformingType);
4227-
assocTypeMetadata = swift_getTypeByMangledName(mangledName, substitutions,
4228-
substitutions);
4235+
response = swift_getTypeByMangledName(request, mangledName, substitutions,
4236+
substitutions).getResponse();
42294237
}
4238+
auto assocTypeMetadata = response.Value;
42304239

42314240
if (!assocTypeMetadata) {
42324241
auto conformingTypeNameInfo = swift_getTypeName(conformingType, true);
@@ -4242,13 +4251,9 @@ swift_getAssociatedTypeWitnessSlowImpl(
42424251
mangledName.str().c_str());
42434252
}
42444253

4245-
42464254
assert((uintptr_t(assocTypeMetadata) &
42474255
ProtocolRequirementFlags::AssociatedTypeMangledNameBit) == 0);
42484256

4249-
// Check the metadata state.
4250-
auto response = swift_checkMetadataState(request, assocTypeMetadata);
4251-
42524257
// If the metadata was completed, record it in the witness table.
42534258
if (response.State == MetadataState::Complete) {
42544259
reinterpret_cast<const void**>(wtable)[witnessIndex] = assocTypeMetadata;
@@ -4970,10 +4975,11 @@ void swift::verifyMangledNameRoundtrip(const Metadata *metadata) {
49704975

49714976
auto mangledName = Demangle::mangleNode(node);
49724977
auto result =
4973-
swift_getTypeByMangledName(
4978+
swift_getTypeByMangledName(MetadataState::Abstract,
49744979
mangledName,
49754980
[](unsigned, unsigned){ return nullptr; },
4976-
[](const Metadata *, unsigned) { return nullptr; });
4981+
[](const Metadata *, unsigned) { return nullptr; })
4982+
.getMetadata();
49774983
if (metadata != result)
49784984
swift::warning(RuntimeErrorFlagNone,
49794985
"Metadata mangled name failed to roundtrip: %p -> %s -> %p\n",

stdlib/public/runtime/MetadataLookup.cpp

Lines changed: 24 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1246,18 +1246,30 @@ class DecodedMetadataBuilder {
12461246

12471247
}
12481248

1249+
SWIFT_CC(swift)
12491250
static TypeInfo swift_getTypeByMangledNodeImpl(
1251+
MetadataRequest request,
12501252
Demangler &demangler,
12511253
Demangle::NodePointer node,
12521254
SubstGenericParameterFn substGenericParam,
12531255
SubstDependentWitnessTableFn substWitnessTable) {
1256+
// TODO: propagate the request down to the builder instead of calling
1257+
// swift_checkMetadataState after the fact.
12541258
DecodedMetadataBuilder builder(demangler, substGenericParam,
12551259
substWitnessTable);
12561260
auto type = Demangle::decodeMangledType(builder, node);
1257-
return {type, builder.getReferenceOwnership()};
1261+
if (!type) {
1262+
return {MetadataResponse{nullptr, MetadataState::Complete},
1263+
TypeReferenceOwnership()};
1264+
}
1265+
1266+
return {swift_checkMetadataState(request, type),
1267+
builder.getReferenceOwnership()};
12581268
}
12591269

1260-
TypeInfo swift_getTypeByMangledNameImpl(
1270+
SWIFT_CC(swift)
1271+
static TypeInfo swift_getTypeByMangledNameImpl(
1272+
MetadataRequest request,
12611273
StringRef typeName,
12621274
SubstGenericParameterFn substGenericParam,
12631275
SubstDependentWitnessTableFn substWitnessTable) {
@@ -1305,7 +1317,7 @@ TypeInfo swift_getTypeByMangledNameImpl(
13051317
return TypeInfo();
13061318
}
13071319

1308-
return swift_getTypeByMangledNode(demangler, node, substGenericParam,
1320+
return swift_getTypeByMangledNode(request, demangler, node, substGenericParam,
13091321
substWitnessTable);
13101322
}
13111323

@@ -1318,11 +1330,8 @@ swift_getTypeByMangledNameInEnvironment(
13181330
const void * const *genericArgs) {
13191331
llvm::StringRef typeName(typeNameStart, typeNameLength);
13201332
SubstGenericParametersFromMetadata substitutions(environment, genericArgs);
1321-
auto metadata = swift_getTypeByMangledName(typeName, substitutions,
1322-
substitutions);
1323-
if (!metadata) return nullptr;
1324-
1325-
return swift_checkMetadataState(MetadataState::Complete, metadata).Value;
1333+
return swift_getTypeByMangledName(MetadataState::Complete, typeName,
1334+
substitutions, substitutions).getMetadata();
13261335
}
13271336

13281337
SWIFT_CC(swift) SWIFT_RUNTIME_EXPORT
@@ -1334,11 +1343,8 @@ swift_getTypeByMangledNameInContext(
13341343
const void * const *genericArgs) {
13351344
llvm::StringRef typeName(typeNameStart, typeNameLength);
13361345
SubstGenericParametersFromMetadata substitutions(context, genericArgs);
1337-
auto metadata = swift_getTypeByMangledName(typeName, substitutions,
1338-
substitutions);
1339-
if (!metadata) return nullptr;
1340-
1341-
return swift_checkMetadataState(MetadataState::Complete, metadata).Value;
1346+
return swift_getTypeByMangledName(MetadataState::Complete, typeName,
1347+
substitutions, substitutions).getMetadata();
13421348
}
13431349

13441350
/// Demangle a mangled name, but don't allow symbolic references.
@@ -1352,10 +1358,8 @@ swift_stdlib_getTypeByMangledNameUntrusted(const char *typeNameStart,
13521358
return nullptr;
13531359
}
13541360

1355-
auto metadata = swift_getTypeByMangledName(typeName, {}, {});
1356-
if (!metadata) return nullptr;
1357-
1358-
return swift_checkMetadataState(MetadataState::Complete, metadata).Value;
1361+
return swift_getTypeByMangledName(MetadataState::Complete, typeName,
1362+
{}, {}).getMetadata();
13591363
}
13601364

13611365
#if SWIFT_OBJC_INTEROP
@@ -1675,8 +1679,9 @@ void swift::gatherWrittenGenericArgs(
16751679
SubstGenericParametersFromWrittenArgs substitutions(allGenericArgs,
16761680
genericParamCounts);
16771681
allGenericArgs[*lhsFlatIndex] =
1678-
swift_getTypeByMangledName(req.getMangledTypeName(), substitutions,
1679-
substitutions);
1682+
swift_getTypeByMangledName(MetadataState::Abstract,
1683+
req.getMangledTypeName(), substitutions,
1684+
substitutions).getMetadata();
16801685
continue;
16811686
}
16821687

stdlib/public/runtime/Private.h

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -55,16 +55,22 @@ class TypeReferenceOwnership {
5555
/// since we don't represent ownership attributes in the metadata
5656
/// itself related info has to be bundled with it.
5757
class TypeInfo {
58-
const Metadata *Type;
58+
MetadataResponse Response;
5959
TypeReferenceOwnership ReferenceOwnership;
6060

6161
public:
62-
TypeInfo() : Type(nullptr), ReferenceOwnership() {}
62+
TypeInfo()
63+
: Response{nullptr, MetadataState::Abstract}, ReferenceOwnership() {}
6364

65+
TypeInfo(MetadataResponse response, TypeReferenceOwnership ownership)
66+
: Response(response), ReferenceOwnership() {}
67+
68+
// FIXME: remove this constructor and require a response in all cases.
6469
TypeInfo(const Metadata *type, TypeReferenceOwnership ownership)
65-
: Type(type), ReferenceOwnership(ownership) {}
70+
: Response{type, MetadataState::Abstract}, ReferenceOwnership(ownership) {}
6671

67-
operator const Metadata *() { return Type; }
72+
const Metadata *getMetadata() const { return Response.Value; }
73+
MetadataResponse getResponse() const { return Response; }
6874

6975
bool isWeak() const { return ReferenceOwnership.isWeak(); }
7076
bool isUnowned() const { return ReferenceOwnership.isUnowned(); }
@@ -322,7 +328,9 @@ class TypeInfo {
322328
/// given a particular generic parameter specified by depth/index.
323329
/// \p substWitnessTable Function that provides witness tables given a
324330
/// particular dependent conformance index.
331+
SWIFT_CC(swift)
325332
TypeInfo swift_getTypeByMangledNode(
333+
MetadataRequest request,
326334
Demangler &demangler,
327335
Demangle::NodePointer node,
328336
SubstGenericParameterFn substGenericParam,
@@ -334,7 +342,9 @@ class TypeInfo {
334342
/// given a particular generic parameter specified by depth/index.
335343
/// \p substWitnessTable Function that provides witness tables given a
336344
/// particular dependent conformance index.
345+
SWIFT_CC(swift)
337346
TypeInfo swift_getTypeByMangledName(
347+
MetadataRequest request,
338348
StringRef typeName,
339349
SubstGenericParameterFn substGenericParam,
340350
SubstDependentWitnessTableFn substWitnessTable);

stdlib/public/runtime/ProtocolConformance.cpp

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -635,8 +635,9 @@ bool swift::_checkGenericRequirements(
635635

636636
// Resolve the subject generic parameter.
637637
const Metadata *subjectType =
638-
swift_getTypeByMangledName(req.getParam(), substGenericParam,
639-
substWitnessTable);
638+
swift_getTypeByMangledName(MetadataState::Abstract,
639+
req.getParam(), substGenericParam,
640+
substWitnessTable).getMetadata();
640641
if (!subjectType)
641642
return true;
642643

@@ -660,8 +661,9 @@ bool swift::_checkGenericRequirements(
660661
case GenericRequirementKind::SameType: {
661662
// Demangle the second type under the given substitutions.
662663
auto otherType =
663-
swift_getTypeByMangledName(req.getMangledTypeName(), substGenericParam,
664-
substWitnessTable);
664+
swift_getTypeByMangledName(MetadataState::Abstract,
665+
req.getMangledTypeName(), substGenericParam,
666+
substWitnessTable).getMetadata();
665667
if (!otherType) return true;
666668

667669
assert(!req.getFlags().hasExtraArgument());
@@ -687,8 +689,9 @@ bool swift::_checkGenericRequirements(
687689
case GenericRequirementKind::BaseClass: {
688690
// Demangle the base type under the given substitutions.
689691
auto baseType =
690-
swift_getTypeByMangledName(req.getMangledTypeName(), substGenericParam,
691-
substWitnessTable);
692+
swift_getTypeByMangledName(MetadataState::Complete,
693+
req.getMangledTypeName(), substGenericParam,
694+
substWitnessTable).getMetadata();
692695
if (!baseType) return true;
693696

694697
// Check whether it's dynamically castable, which works as a superclass

stdlib/public/runtime/ReflectionMirror.mm

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -312,7 +312,7 @@ static bool _shouldReportMissingReflectionMetadataWarnings() {
312312
(int)typeName.length, typeName.data);
313313
return {"unknown",
314314
FieldType()
315-
.withType(TypeInfo(&METADATA_SYM(EMPTY_TUPLE_MANGLING), {}))
315+
.withType(&METADATA_SYM(EMPTY_TUPLE_MANGLING))
316316
.withIndirect(false)
317317
.withWeak(false)};
318318
};
@@ -336,20 +336,15 @@ static bool _shouldReportMissingReflectionMetadataWarnings() {
336336
auto typeName = field.getMangledTypeName(0);
337337

338338
SubstGenericParametersFromMetadata substitutions(base);
339-
auto typeInfo = swift_getTypeByMangledName(typeName, substitutions,
339+
auto typeInfo = swift_getTypeByMangledName(MetadataState::Complete,
340+
typeName, substitutions,
340341
substitutions);
341342

342-
// Complete the type metadata before returning it to the caller.
343-
if (typeInfo) {
344-
typeInfo = TypeInfo(swift_checkMetadataState(MetadataState::Complete,
345-
typeInfo).Value,
346-
typeInfo.getReferenceOwnership());
347-
}
348-
349343
// If demangling the type failed, pretend it's an empty type instead with
350344
// a log message.
351-
if (typeInfo == nullptr) {
352-
typeInfo = TypeInfo(&METADATA_SYM(EMPTY_TUPLE_MANGLING), {});
345+
if (!typeInfo.getMetadata()) {
346+
typeInfo = TypeInfo({&METADATA_SYM(EMPTY_TUPLE_MANGLING),
347+
MetadataState::Complete}, {});
353348
missing_reflection_metadata_warning(
354349
"warning: the Swift runtime was unable to demangle the type "
355350
"of field '%*s'. the mangled type name is '%*s'. this field will "
@@ -359,7 +354,7 @@ static bool _shouldReportMissingReflectionMetadataWarnings() {
359354
}
360355

361356
return {name, FieldType()
362-
.withType(typeInfo)
357+
.withType(typeInfo.getMetadata())
363358
.withIndirect(field.isIndirectCase())
364359
.withWeak(typeInfo.isWeak())};
365360
}

unittests/runtime/CompatibilityOverride.cpp

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -175,14 +175,15 @@ TEST_F(CompatibilityOverrideTest, test_swift_conformsToSwiftProtocol) {
175175

176176
TEST_F(CompatibilityOverrideTest, test_swift_getTypeByMangledNode) {
177177
Demangler demangler;
178-
auto Result = swift_getTypeByMangledNode(demangler, nullptr, nullptr,
179-
nullptr);
180-
ASSERT_EQ((const Metadata *)Result, nullptr);
178+
auto Result = swift_getTypeByMangledNode(MetadataState::Abstract,
179+
demangler, nullptr, nullptr,nullptr);
180+
ASSERT_EQ(Result.getMetadata(), nullptr);
181181
}
182182

183183
TEST_F(CompatibilityOverrideTest, test_swift_getTypeByMangledName) {
184-
auto Result = swift_getTypeByMangledName("", nullptr, nullptr);
185-
ASSERT_EQ((const Metadata *)Result, nullptr);
184+
auto Result = swift_getTypeByMangledName(MetadataState::Abstract,
185+
"", nullptr, nullptr);
186+
ASSERT_EQ(Result.getMetadata(), nullptr);
186187
}
187188

188189
TEST_F(CompatibilityOverrideTest, test_swift_getAssociatedTypeWitnessSlow) {

0 commit comments

Comments
 (0)