Skip to content

Commit d9db40d

Browse files
committed
Make the swift_getTypeByMangled... functions emit error messages.
When type lookups fail, these functions should at least generate a warning. rdar://103950409
1 parent e5e9827 commit d9db40d

File tree

1 file changed

+53
-8
lines changed

1 file changed

+53
-8
lines changed

stdlib/public/runtime/MetadataLookup.cpp

Lines changed: 53 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1942,14 +1942,25 @@ swift_getTypeByMangledNameInEnvironment(
19421942
const void * const *genericArgs) {
19431943
llvm::StringRef typeName(typeNameStart, typeNameLength);
19441944
SubstGenericParametersFromMetadata substitutions(environment, genericArgs);
1945-
return swift_getTypeByMangledName(MetadataState::Complete, typeName,
1945+
TypeLookupErrorOr<TypeInfo> result = swift_getTypeByMangledName(
1946+
MetadataState::Complete, typeName,
19461947
genericArgs,
19471948
[&substitutions](unsigned depth, unsigned index) {
19481949
return substitutions.getMetadata(depth, index);
19491950
},
19501951
[&substitutions](const Metadata *type, unsigned index) {
19511952
return substitutions.getWitnessTable(type, index);
1952-
}).getType().getMetadata();
1953+
});
1954+
if (result.isError()) {
1955+
TypeLookupError *error = result.getError();
1956+
char *errorString = error->copyErrorString();
1957+
swift::warning(0, "failed type lookup for %.*s: %s\n",
1958+
(int)typeNameLength, typeNameStart,
1959+
errorString);
1960+
error->freeErrorString(errorString);
1961+
return nullptr;
1962+
}
1963+
return result.getType().getMetadata();
19531964
}
19541965

19551966
SWIFT_CC(swift) SWIFT_RUNTIME_EXPORT
@@ -1962,14 +1973,25 @@ swift_getTypeByMangledNameInEnvironmentInMetadataState(
19621973
const void * const *genericArgs) {
19631974
llvm::StringRef typeName(typeNameStart, typeNameLength);
19641975
SubstGenericParametersFromMetadata substitutions(environment, genericArgs);
1965-
return swift_getTypeByMangledName((MetadataState)metadataState, typeName,
1976+
TypeLookupErrorOr<TypeInfo> result = swift_getTypeByMangledName(
1977+
(MetadataState)metadataState, typeName,
19661978
genericArgs,
19671979
[&substitutions](unsigned depth, unsigned index) {
19681980
return substitutions.getMetadata(depth, index);
19691981
},
19701982
[&substitutions](const Metadata *type, unsigned index) {
19711983
return substitutions.getWitnessTable(type, index);
1972-
}).getType().getMetadata();
1984+
});
1985+
if (result.isError()) {
1986+
TypeLookupError *error = result.getError();
1987+
char *errorString = error->copyErrorString();
1988+
swift::warning(0, "failed type lookup for %.*s: %s\n",
1989+
(int)typeNameLength, typeNameStart,
1990+
errorString);
1991+
error->freeErrorString(errorString);
1992+
return nullptr;
1993+
}
1994+
return result.getType().getMetadata();
19731995
}
19741996

19751997
SWIFT_CC(swift) SWIFT_RUNTIME_EXPORT
@@ -1981,14 +2003,25 @@ swift_getTypeByMangledNameInContext(
19812003
const void * const *genericArgs) {
19822004
llvm::StringRef typeName(typeNameStart, typeNameLength);
19832005
SubstGenericParametersFromMetadata substitutions(context, genericArgs);
1984-
return swift_getTypeByMangledName(MetadataState::Complete, typeName,
2006+
TypeLookupErrorOr<TypeInfo> result = swift_getTypeByMangledName(
2007+
MetadataState::Complete, typeName,
19852008
genericArgs,
19862009
[&substitutions](unsigned depth, unsigned index) {
19872010
return substitutions.getMetadata(depth, index);
19882011
},
19892012
[&substitutions](const Metadata *type, unsigned index) {
19902013
return substitutions.getWitnessTable(type, index);
1991-
}).getType().getMetadata();
2014+
});
2015+
if (result.isError()) {
2016+
TypeLookupError *error = result.getError();
2017+
char *errorString = error->copyErrorString();
2018+
swift::warning(0, "failed type lookup for %.*s: %s\n",
2019+
(int)typeNameLength, typeNameStart,
2020+
errorString);
2021+
error->freeErrorString(errorString);
2022+
return nullptr;
2023+
}
2024+
return result.getType().getMetadata();
19922025
}
19932026

19942027
SWIFT_CC(swift) SWIFT_RUNTIME_EXPORT
@@ -2001,14 +2034,26 @@ swift_getTypeByMangledNameInContextInMetadataState(
20012034
const void * const *genericArgs) {
20022035
llvm::StringRef typeName(typeNameStart, typeNameLength);
20032036
SubstGenericParametersFromMetadata substitutions(context, genericArgs);
2004-
return swift_getTypeByMangledName((MetadataState)metadataState, typeName,
2037+
TypeLookupErrorOr<TypeInfo> result = swift_getTypeByMangledName(
2038+
(MetadataState)metadataState, typeName,
20052039
genericArgs,
20062040
[&substitutions](unsigned depth, unsigned index) {
20072041
return substitutions.getMetadata(depth, index);
20082042
},
20092043
[&substitutions](const Metadata *type, unsigned index) {
20102044
return substitutions.getWitnessTable(type, index);
2011-
}).getType().getMetadata();
2045+
});
2046+
if (result.isError()) {
2047+
TypeLookupError *error = result.getError();
2048+
char *errorString = error->copyErrorString();
2049+
swift::warning(0, "failed type lookup for %.*s: %s\n",
2050+
(int)typeNameLength, typeNameStart,
2051+
errorString);
2052+
error->freeErrorString(errorString);
2053+
return nullptr;
2054+
}
2055+
return result.getType().getMetadata();
2056+
20122057
}
20132058

20142059
/// Demangle a mangled name, but don't allow symbolic references.

0 commit comments

Comments
 (0)