Skip to content

Commit 6ca5716

Browse files
authored
Merge pull request #62879 from al45tair/eng/PR-103950409
[Runtime] Make the swift_getTypeByMangled... functions emit error messages.
2 parents c9e533e + f0200bc commit 6ca5716

File tree

2 files changed

+61
-8
lines changed

2 files changed

+61
-8
lines changed

stdlib/public/runtime/EnvironmentVariables.def

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,4 +78,7 @@ VARIABLE(SWIFT_DEBUG_RUNTIME_EXCLUSIVITY_LOGGING, bool, false,
7878
VARIABLE(SWIFT_BINARY_COMPATIBILITY_VERSION, uint32_t, 0,
7979
"Set the binary compatibility level of the Swift Standard Library")
8080

81+
VARIABLE(SWIFT_DEBUG_FAILED_TYPE_LOOKUP, bool, false,
82+
"Enable warnings when we fail to look up a type by name.")
83+
8184
#undef VARIABLE

stdlib/public/runtime/MetadataLookup.cpp

Lines changed: 58 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
#include "swift/Runtime/Casting.h"
2626
#include "swift/Runtime/Concurrent.h"
2727
#include "swift/Runtime/Debug.h"
28+
#include "swift/Runtime/EnvironmentVariables.h"
2829
#include "swift/Runtime/HeapObject.h"
2930
#include "swift/Runtime/Metadata.h"
3031
#include "swift/Strings.h"
@@ -1942,14 +1943,26 @@ swift_getTypeByMangledNameInEnvironment(
19421943
const void * const *genericArgs) {
19431944
llvm::StringRef typeName(typeNameStart, typeNameLength);
19441945
SubstGenericParametersFromMetadata substitutions(environment, genericArgs);
1945-
return swift_getTypeByMangledName(MetadataState::Complete, typeName,
1946+
TypeLookupErrorOr<TypeInfo> result = swift_getTypeByMangledName(
1947+
MetadataState::Complete, typeName,
19461948
genericArgs,
19471949
[&substitutions](unsigned depth, unsigned index) {
19481950
return substitutions.getMetadata(depth, index);
19491951
},
19501952
[&substitutions](const Metadata *type, unsigned index) {
19511953
return substitutions.getWitnessTable(type, index);
1952-
}).getType().getMetadata();
1954+
});
1955+
if (result.isError()
1956+
&& runtime::environment::SWIFT_DEBUG_FAILED_TYPE_LOOKUP()) {
1957+
TypeLookupError *error = result.getError();
1958+
char *errorString = error->copyErrorString();
1959+
swift::warning(0, "failed type lookup for %.*s: %s\n",
1960+
(int)typeNameLength, typeNameStart,
1961+
errorString);
1962+
error->freeErrorString(errorString);
1963+
return nullptr;
1964+
}
1965+
return result.getType().getMetadata();
19531966
}
19541967

19551968
SWIFT_CC(swift) SWIFT_RUNTIME_EXPORT
@@ -1962,14 +1975,26 @@ swift_getTypeByMangledNameInEnvironmentInMetadataState(
19621975
const void * const *genericArgs) {
19631976
llvm::StringRef typeName(typeNameStart, typeNameLength);
19641977
SubstGenericParametersFromMetadata substitutions(environment, genericArgs);
1965-
return swift_getTypeByMangledName((MetadataState)metadataState, typeName,
1978+
TypeLookupErrorOr<TypeInfo> result = swift_getTypeByMangledName(
1979+
(MetadataState)metadataState, typeName,
19661980
genericArgs,
19671981
[&substitutions](unsigned depth, unsigned index) {
19681982
return substitutions.getMetadata(depth, index);
19691983
},
19701984
[&substitutions](const Metadata *type, unsigned index) {
19711985
return substitutions.getWitnessTable(type, index);
1972-
}).getType().getMetadata();
1986+
});
1987+
if (result.isError()
1988+
&& runtime::environment::SWIFT_DEBUG_FAILED_TYPE_LOOKUP()) {
1989+
TypeLookupError *error = result.getError();
1990+
char *errorString = error->copyErrorString();
1991+
swift::warning(0, "failed type lookup for %.*s: %s\n",
1992+
(int)typeNameLength, typeNameStart,
1993+
errorString);
1994+
error->freeErrorString(errorString);
1995+
return nullptr;
1996+
}
1997+
return result.getType().getMetadata();
19731998
}
19741999

19752000
SWIFT_CC(swift) SWIFT_RUNTIME_EXPORT
@@ -1981,14 +2006,26 @@ swift_getTypeByMangledNameInContext(
19812006
const void * const *genericArgs) {
19822007
llvm::StringRef typeName(typeNameStart, typeNameLength);
19832008
SubstGenericParametersFromMetadata substitutions(context, genericArgs);
1984-
return swift_getTypeByMangledName(MetadataState::Complete, typeName,
2009+
TypeLookupErrorOr<TypeInfo> result = swift_getTypeByMangledName(
2010+
MetadataState::Complete, typeName,
19852011
genericArgs,
19862012
[&substitutions](unsigned depth, unsigned index) {
19872013
return substitutions.getMetadata(depth, index);
19882014
},
19892015
[&substitutions](const Metadata *type, unsigned index) {
19902016
return substitutions.getWitnessTable(type, index);
1991-
}).getType().getMetadata();
2017+
});
2018+
if (result.isError()
2019+
&& runtime::environment::SWIFT_DEBUG_FAILED_TYPE_LOOKUP()) {
2020+
TypeLookupError *error = result.getError();
2021+
char *errorString = error->copyErrorString();
2022+
swift::warning(0, "failed type lookup for %.*s: %s\n",
2023+
(int)typeNameLength, typeNameStart,
2024+
errorString);
2025+
error->freeErrorString(errorString);
2026+
return nullptr;
2027+
}
2028+
return result.getType().getMetadata();
19922029
}
19932030

19942031
SWIFT_CC(swift) SWIFT_RUNTIME_EXPORT
@@ -2001,14 +2038,27 @@ swift_getTypeByMangledNameInContextInMetadataState(
20012038
const void * const *genericArgs) {
20022039
llvm::StringRef typeName(typeNameStart, typeNameLength);
20032040
SubstGenericParametersFromMetadata substitutions(context, genericArgs);
2004-
return swift_getTypeByMangledName((MetadataState)metadataState, typeName,
2041+
TypeLookupErrorOr<TypeInfo> result = swift_getTypeByMangledName(
2042+
(MetadataState)metadataState, typeName,
20052043
genericArgs,
20062044
[&substitutions](unsigned depth, unsigned index) {
20072045
return substitutions.getMetadata(depth, index);
20082046
},
20092047
[&substitutions](const Metadata *type, unsigned index) {
20102048
return substitutions.getWitnessTable(type, index);
2011-
}).getType().getMetadata();
2049+
});
2050+
if (result.isError()
2051+
&& runtime::environment::SWIFT_DEBUG_FAILED_TYPE_LOOKUP()) {
2052+
TypeLookupError *error = result.getError();
2053+
char *errorString = error->copyErrorString();
2054+
swift::warning(0, "failed type lookup for %.*s: %s\n",
2055+
(int)typeNameLength, typeNameStart,
2056+
errorString);
2057+
error->freeErrorString(errorString);
2058+
return nullptr;
2059+
}
2060+
return result.getType().getMetadata();
2061+
20122062
}
20132063

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

0 commit comments

Comments
 (0)