Demangler: support the final mangling prefix _$s

rdar://problem/37681432
This commit is contained in:
Erik Eckstein
2018-02-19 13:45:57 -08:00
parent 29788f6245
commit f0ef4007b6
4 changed files with 16 additions and 6 deletions

View File

@@ -140,7 +140,10 @@ swift::Demangle::makeSymbolicMangledNameStringRef(const char *base) {
int swift::Demangle::getManglingPrefixLength(llvm::StringRef mangledName) { int swift::Demangle::getManglingPrefixLength(llvm::StringRef mangledName) {
if (mangledName.empty()) return 0; if (mangledName.empty()) return 0;
llvm::StringRef prefixes[] = {/*Swift 4*/ "_T0", /*Swift > 4*/ "$S", "_$S"}; llvm::StringRef prefixes[] = {
/*Swift 4*/ "_T0",
/*Swift 4.x*/ "$S", "_$S",
/*Swift 5+*/ "$s", "_$s"};
// Look for any of the known prefixes // Look for any of the known prefixes
for (auto prefix : prefixes) { for (auto prefix : prefixes) {

View File

@@ -82,12 +82,12 @@ _TToFC3foo3bar3basfT3zimCS_3zim_T_ ---> {T:_TFC3foo3bar3basfT3zimCS_3zim_T_,C} @
_TTOFSC3fooFTSdSd_Sd ---> {T:_TFSC3fooFTSdSd_Sd} @nonobjc __C_Synthesized.foo(Swift.Double, Swift.Double) -> Swift.Double _TTOFSC3fooFTSdSd_Sd ---> {T:_TFSC3fooFTSdSd_Sd} @nonobjc __C_Synthesized.foo(Swift.Double, Swift.Double) -> Swift.Double
_T03foo3barC3basyAA3zimCAE_tFTo ---> {T:_T03foo3barC3basyAA3zimCAE_tF,C} @objc foo.bar.bas(zim: foo.zim) -> () _T03foo3barC3basyAA3zimCAE_tFTo ---> {T:_T03foo3barC3basyAA3zimCAE_tF,C} @objc foo.bar.bas(zim: foo.zim) -> ()
_T0SC3fooS2d_SdtFTO ---> {T:_T0SC3fooS2d_SdtF} @nonobjc __C_Synthesized.foo(Swift.Double, Swift.Double) -> Swift.Double _T0SC3fooS2d_SdtFTO ---> {T:_T0SC3fooS2d_SdtF} @nonobjc __C_Synthesized.foo(Swift.Double, Swift.Double) -> Swift.Double
__$S3foo3barC3bas3zimyAaEC_tFTo ---> {T:_$S3foo3barC3bas3zimyAaEC_tF,C} @objc foo.bar.bas(zim: foo.zim) -> () _$s3foo3barC3bas3zimyAaEC_tFTo ---> {T:_$s3foo3barC3bas3zimyAaEC_tF,C} @objc foo.bar.bas(zim: foo.zim) -> ()
__$SSC3fooyS2d_SdtFTO ---> {T:_$SSC3fooyS2d_SdtF} @nonobjc __C_Synthesized.foo(Swift.Double, Swift.Double) -> Swift.Double _$sSC3fooyS2d_SdtFTO ---> {T:_$sSC3fooyS2d_SdtF} @nonobjc __C_Synthesized.foo(Swift.Double, Swift.Double) -> Swift.Double
_$S3foo3barC3bas3zimyAaEC_tFTo ---> {T:_$S3foo3barC3bas3zimyAaEC_tF,C} @objc foo.bar.bas(zim: foo.zim) -> ()
_$SSC3fooyS2d_SdtFTO ---> {T:_$SSC3fooyS2d_SdtF} @nonobjc __C_Synthesized.foo(Swift.Double, Swift.Double) -> Swift.Double
_$S3foo3barC3bas3zimyAaEC_tFTo ---> {T:_$S3foo3barC3bas3zimyAaEC_tF,C} @objc foo.bar.bas(zim: foo.zim) -> () _$S3foo3barC3bas3zimyAaEC_tFTo ---> {T:_$S3foo3barC3bas3zimyAaEC_tF,C} @objc foo.bar.bas(zim: foo.zim) -> ()
_$SSC3fooyS2d_SdtFTO ---> {T:_$SSC3fooyS2d_SdtF} @nonobjc __C_Synthesized.foo(Swift.Double, Swift.Double) -> Swift.Double _$SSC3fooyS2d_SdtFTO ---> {T:_$SSC3fooyS2d_SdtF} @nonobjc __C_Synthesized.foo(Swift.Double, Swift.Double) -> Swift.Double
$S3foo3barC3bas3zimyAaEC_tFTo ---> {T:$S3foo3barC3bas3zimyAaEC_tF,C} @objc foo.bar.bas(zim: foo.zim) -> ()
$SSC3fooyS2d_SdtFTO ---> {T:$SSC3fooyS2d_SdtF} @nonobjc __C_Synthesized.foo(Swift.Double, Swift.Double) -> Swift.Double
_TTDFC3foo3bar3basfT3zimCS_3zim_T_ ---> dynamic foo.bar.bas(zim: foo.zim) -> () _TTDFC3foo3bar3basfT3zimCS_3zim_T_ ---> dynamic foo.bar.bas(zim: foo.zim) -> ()
_TFC3foo3bar3basfT3zimCS_3zim_T_ ---> foo.bar.bas(zim: foo.zim) -> () _TFC3foo3bar3basfT3zimCS_3zim_T_ ---> foo.bar.bas(zim: foo.zim) -> ()
_TF3foooi1pFTCS_3barVS_3bas_OS_3zim ---> foo.+ infix(foo.bar, foo.bas) -> foo.zim _TF3foooi1pFTCS_3barVS_3bas_OS_3zim ---> foo.+ infix(foo.bar, foo.bas) -> foo.zim

View File

@@ -175,7 +175,7 @@ static int demangleSTDIN(const swift::Demangle::DemangleOptions &options) {
// This doesn't handle Unicode symbols, but maybe that's okay. // This doesn't handle Unicode symbols, but maybe that's okay.
// Also accept the future mangling prefix. // Also accept the future mangling prefix.
// TODO: remove the "_S" as soon as MANGLING_PREFIX_STR gets "_S". // TODO: remove the "_S" as soon as MANGLING_PREFIX_STR gets "_S".
llvm::Regex maybeSymbol("(_T|_*\\$S|" MANGLING_PREFIX_STR ")[_a-zA-Z0-9$.]+"); llvm::Regex maybeSymbol("(_T|_?\\$[Ss])[_a-zA-Z0-9$.]+");
swift::Demangle::Context DCtx; swift::Demangle::Context DCtx;
for (std::string mangled; std::getline(std::cin, mangled);) { for (std::string mangled; std::getline(std::cin, mangled);) {

View File

@@ -42,6 +42,7 @@ TEST(FunctionNameDemangleTests, NewManglingPrefix) {
char OutputBuffer[128]; char OutputBuffer[128];
const char *FunctionName = "$S1a10run_MatMulyySiF"; const char *FunctionName = "$S1a10run_MatMulyySiF";
const char *FunctionNameNew = "$s1a10run_MatMulyySiF";
const char *DemangledName = "a.run_MatMul(Swift.Int) -> ()"; const char *DemangledName = "a.run_MatMul(Swift.Int) -> ()";
const char *SimplifiedName = "run_MatMul(_:)"; const char *SimplifiedName = "run_MatMul(_:)";
@@ -51,6 +52,12 @@ TEST(FunctionNameDemangleTests, NewManglingPrefix) {
EXPECT_STREQ(DemangledName, OutputBuffer); EXPECT_STREQ(DemangledName, OutputBuffer);
EXPECT_EQ(Result, strlen(DemangledName)); EXPECT_EQ(Result, strlen(DemangledName));
Result = swift_demangle_getDemangledName(FunctionNameNew, OutputBuffer,
sizeof(OutputBuffer));
EXPECT_STREQ(DemangledName, OutputBuffer);
EXPECT_EQ(Result, strlen(DemangledName));
Result = swift_demangle_getSimplifiedDemangledName(FunctionName, OutputBuffer, Result = swift_demangle_getSimplifiedDemangledName(FunctionName, OutputBuffer,
sizeof(OutputBuffer)); sizeof(OutputBuffer));