Skip to content

Commit c91da9c

Browse files
Merge pull request #4883 from adrian-prantl/92571418
Adapt Swift mangled name handling to upstream changes
2 parents 6f27d14 + 73be39a commit c91da9c

File tree

4 files changed

+51
-38
lines changed

4 files changed

+51
-38
lines changed

lldb/include/lldb/Core/Mangled.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,10 @@ class Mangled {
4444
eManglingSchemeMSVC,
4545
eManglingSchemeItanium,
4646
eManglingSchemeRustV0,
47-
eManglingSchemeD
47+
eManglingSchemeD,
48+
#ifdef LLDB_ENABLE_SWIFT
49+
eManglingSchemeSwift
50+
#endif // LLDB_ENABLE_SWIFT
4851
};
4952

5053
/// Default constructor.

lldb/source/Core/Mangled.cpp

Lines changed: 32 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -41,11 +41,7 @@
4141
using namespace lldb_private;
4242

4343
static inline bool cstring_is_mangled(llvm::StringRef s) {
44-
return Mangled::GetManglingScheme(s) != Mangled::eManglingSchemeNone
45-
#ifdef LLDB_ENABLE_SWIFT
46-
|| SwiftLanguageRuntime::IsSwiftMangledName(s)
47-
#endif // LLDB_ENABLE_SWIFT
48-
;
44+
return Mangled::GetManglingScheme(s) != Mangled::eManglingSchemeNone;
4945
}
5046

5147
// BEGIN SWIFT
@@ -91,6 +87,11 @@ Mangled::ManglingScheme Mangled::GetManglingScheme(llvm::StringRef const name) {
9187
if (name.startswith("___Z"))
9288
return Mangled::eManglingSchemeItanium;
9389

90+
#ifdef LLDB_ENABLE_SWIFT
91+
if (SwiftLanguageRuntime::IsSwiftMangledName(name))
92+
return Mangled::eManglingSchemeSwift;
93+
#endif // LLDB_ENABLE_SWIFT
94+
9495
return Mangled::eManglingSchemeNone;
9596
}
9697

@@ -278,6 +279,9 @@ bool Mangled::GetRichManglingInfo(RichManglingContext &context,
278279

279280
case eManglingSchemeRustV0:
280281
case eManglingSchemeD:
282+
#ifdef LLDB_ENABLE_SWIFT
283+
case eManglingSchemeSwift:
284+
#endif
281285
// Rich demangling scheme is not supported
282286
return false;
283287
}
@@ -318,6 +322,29 @@ ConstString Mangled::GetDemangledName(// BEGIN SWIFT
318322
case eManglingSchemeD:
319323
demangled_name = GetDLangDemangledStr(mangled_name);
320324
break;
325+
#ifdef LLDB_ENABLE_SWIFT
326+
case eManglingSchemeSwift: {
327+
Log *log = GetLog(LLDBLog::Demangle);
328+
LLDB_LOGF(log, "demangle swift: %s", mangled_name);
329+
std::string demangled(SwiftLanguageRuntime::DemangleSymbolAsString(
330+
mangled_name, SwiftLanguageRuntime::eTypeName, sc));
331+
// Don't cache the demangled name the function isn't available yet.
332+
if (!sc || !sc->function) {
333+
LLDB_LOGF(log, "demangle swift: %s -> \"%s\" (not cached)",
334+
mangled_name, demangled.c_str());
335+
return ConstString(demangled);
336+
}
337+
if (demangled.empty()) {
338+
LLDB_LOGF(log, "demangle swift: %s -> error: failed to demangle",
339+
mangled_name);
340+
} else {
341+
LLDB_LOGF(log, "demangle swift: %s -> \"%s\"", mangled_name,
342+
demangled.c_str());
343+
m_demangled.SetStringWithMangledCounterpart(demangled, m_mangled);
344+
}
345+
return m_demangled;
346+
}
347+
#endif // LLDB_ENABLE_SWIFT
321348
case eManglingSchemeNone:
322349
llvm_unreachable("eManglingSchemeNone was handled already");
323350
}
@@ -327,31 +354,6 @@ ConstString Mangled::GetDemangledName(// BEGIN SWIFT
327354
free(demangled_name);
328355
}
329356
}
330-
#ifdef LLDB_ENABLE_SWIFT
331-
else if (mangling_scheme == eManglingSchemeNone &&
332-
!m_mangled.GetMangledCounterpart(m_demangled) &&
333-
SwiftLanguageRuntime::IsSwiftMangledName(m_mangled.GetStringRef())) {
334-
Log *log = GetLog(LLDBLog::Demangle);
335-
if (log)
336-
log->Printf("demangle swift: %s", mangled_name);
337-
std::string demangled(SwiftLanguageRuntime::DemangleSymbolAsString(
338-
mangled_name, SwiftLanguageRuntime::eTypeName, sc));
339-
// Don't cache the demangled name the function isn't available yet.
340-
if (!sc || !sc->function)
341-
return ConstString(demangled);
342-
if (!demangled.empty()) {
343-
m_demangled.SetStringWithMangledCounterpart(demangled,
344-
m_mangled);
345-
if (log)
346-
log->Printf("demangle swift: %s -> \"%s\"", mangled_name,
347-
demangled.c_str());
348-
} else {
349-
if (log)
350-
log->Printf("demangle swift: %s -> error: failed to demangle",
351-
mangled_name);
352-
}
353-
}
354-
#endif // LLDB_ENABLE_SWIFT
355357
if (m_demangled.IsNull()) {
356358
// Set the demangled string to the empty string to indicate we tried to
357359
// parse it once and failed.

lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -269,15 +269,19 @@ std::string CPlusPlusLanguage::MethodName::GetScopeQualifiedName() {
269269
}
270270

271271
bool CPlusPlusLanguage::IsCPPMangledName(llvm::StringRef name) {
272-
// FIXME!! we should really run through all the known C++ Language plugins
273-
// and ask each one if this is a C++ mangled name
274-
275272
Mangled::ManglingScheme scheme = Mangled::GetManglingScheme(name);
276-
277-
if (scheme == Mangled::eManglingSchemeNone)
273+
switch (scheme) {
274+
case Mangled::eManglingSchemeMSVC:
275+
case Mangled::eManglingSchemeItanium:
276+
return true;
277+
case Mangled::eManglingSchemeNone:
278+
case Mangled::eManglingSchemeRustV0:
279+
case Mangled::eManglingSchemeD:
280+
#ifdef LLDB_ENABLE_SWIFT
281+
case Mangled::eManglingSchemeSwift:
282+
#endif
278283
return false;
279-
280-
return true;
284+
}
281285
}
282286

283287
bool CPlusPlusLanguage::ExtractContextAndIdentifier(

lldb/source/Symbol/Symtab.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,10 @@ static bool lldb_skip_name(llvm::StringRef mangled,
263263
case Mangled::eManglingSchemeD:
264264
return false;
265265

266+
#ifdef LLDB_ENABLE_SWIFT
267+
case Mangled::eManglingSchemeSwift:
268+
// This is handled separately.
269+
#endif // LLDB_ENABLE_SWIFT
266270
// Don't try and demangle things we can't categorize.
267271
case Mangled::eManglingSchemeNone:
268272
return true;

0 commit comments

Comments
 (0)