Skip to content

Commit 8e5e1b2

Browse files
committed
[lldb][Mangled] Add API to force re-demangling a Mangled object (llvm#131836)
Add version of GetDemangledName that will force re-demangling. This is required because LLDB will SetDemangledName without going through the demangler. So we need a way to force demangling to set the m_demangled_info member when we need it. llvm#131836 (cherry picked from commit f220ea2)
1 parent 0226820 commit 8e5e1b2

File tree

2 files changed

+91
-72
lines changed

2 files changed

+91
-72
lines changed

lldb/include/lldb/Core/Mangled.h

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -277,10 +277,19 @@ class Mangled {
277277
void Encode(DataEncoder &encoder, ConstStringTable &strtab) const;
278278

279279
private:
280-
/// Mangled member variables.
281-
ConstString m_mangled; ///< The mangled version of the name
282-
mutable ConstString m_demangled; ///< Mutable so we can get it on demand with
283-
///a const version of this object
280+
/// If \c force is \c false, this function will re-use the previously
281+
/// demangled name (if any). If \c force is \c true (or the mangled name
282+
/// on this object was not previously demangled), demangle and cache the
283+
/// name.
284+
ConstString GetDemangledNameImpl(bool force,
285+
const SymbolContext *sc = nullptr) const;
286+
287+
/// The mangled version of the name.
288+
ConstString m_mangled;
289+
290+
/// Mutable so we can get it on demand with
291+
/// a const version of this object.
292+
mutable ConstString m_demangled;
284293
};
285294

286295
Stream &operator<<(Stream &s, const Mangled &obj);

lldb/source/Core/Mangled.cpp

Lines changed: 78 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -274,81 +274,91 @@ bool Mangled::GetRichManglingInfo(RichManglingContext &context,
274274
llvm_unreachable("Fully covered switch above!");
275275
}
276276

277+
ConstString Mangled::GetDemangledName( // BEGIN SWIFT
278+
const SymbolContext *sc
279+
// END SWIFT
280+
) const {
281+
return GetDemangledNameImpl(/*force=*/false, sc);
282+
}
283+
277284
// Generate the demangled name on demand using this accessor. Code in this
278285
// class will need to use this accessor if it wishes to decode the demangled
279286
// name. The result is cached and will be kept until a new string value is
280287
// supplied to this object, or until the end of the object's lifetime.
281-
ConstString Mangled::GetDemangledName(// BEGIN SWIFT
282-
const SymbolContext *sc
283-
// END SWIFT
284-
) const {
285-
// Check to make sure we have a valid mangled name and that we haven't
286-
// already decoded our mangled name.
287-
if (m_mangled && m_demangled.IsNull()) {
288-
// Don't bother running anything that isn't mangled
289-
const char *mangled_name = m_mangled.GetCString();
290-
ManglingScheme mangling_scheme =
291-
GetManglingScheme(m_mangled.GetStringRef());
292-
if (mangling_scheme != eManglingSchemeNone &&
293-
!m_mangled.GetMangledCounterpart(m_demangled)) {
294-
// We didn't already mangle this name, demangle it and if all goes well
295-
// add it to our map.
296-
char *demangled_name = nullptr;
297-
switch (mangling_scheme) {
298-
case eManglingSchemeMSVC:
299-
demangled_name = GetMSVCDemangledStr(mangled_name);
300-
break;
301-
case eManglingSchemeItanium: {
302-
demangled_name = GetItaniumDemangledStr(mangled_name);
303-
break;
304-
}
305-
case eManglingSchemeRustV0:
306-
demangled_name = GetRustV0DemangledStr(m_mangled);
307-
break;
308-
case eManglingSchemeD:
309-
demangled_name = GetDLangDemangledStr(m_mangled);
310-
break;
311-
case eManglingSchemeSwift:
312-
// Demangling a swift name requires the swift compiler. This is
313-
// explicitly unsupported on llvm.org.
288+
ConstString Mangled::GetDemangledNameImpl(bool force, // BEGIN SWIFT
289+
const SymbolContext *sc
290+
// END SWIFT
291+
) const {
292+
if (!m_mangled)
293+
return m_demangled;
294+
295+
// Re-use previously demangled names.
296+
if (!force && !m_demangled.IsNull())
297+
return m_demangled;
298+
299+
if (!force && m_mangled.GetMangledCounterpart(m_demangled) &&
300+
!m_demangled.IsNull())
301+
return m_demangled;
302+
303+
// We didn't already mangle this name, demangle it and if all goes well
304+
// add it to our map.
305+
char *demangled_name = nullptr;
306+
switch (GetManglingScheme(m_mangled.GetStringRef())) {
307+
case eManglingSchemeMSVC:
308+
demangled_name = GetMSVCDemangledStr(m_mangled);
309+
break;
310+
case eManglingSchemeItanium: {
311+
demangled_name = GetItaniumDemangledStr(m_mangled.GetCString());
312+
break;
313+
}
314+
case eManglingSchemeRustV0:
315+
demangled_name = GetRustV0DemangledStr(m_mangled);
316+
break;
317+
case eManglingSchemeD:
318+
demangled_name = GetDLangDemangledStr(m_mangled);
319+
break;
320+
case eManglingSchemeSwift:
321+
// Demangling a swift name requires the swift compiler. This is
322+
// explicitly unsupported on llvm.org.
314323
#ifdef LLDB_ENABLE_SWIFT
315-
{
316-
Log *log = GetLog(LLDBLog::Demangle);
317-
LLDB_LOGF(log, "demangle swift: %s", mangled_name);
318-
std::string demangled(SwiftLanguageRuntime::DemangleSymbolAsString(
319-
mangled_name, SwiftLanguageRuntime::eTypeName, sc));
320-
// Don't cache the demangled name the function isn't available yet.
321-
if (!sc || !sc->function) {
322-
LLDB_LOGF(log, "demangle swift: %s -> \"%s\" (not cached)",
323-
mangled_name, demangled.c_str());
324-
return ConstString(demangled);
325-
}
326-
if (demangled.empty()) {
327-
LLDB_LOGF(log, "demangle swift: %s -> error: failed to demangle",
328-
mangled_name);
329-
} else {
330-
LLDB_LOGF(log, "demangle swift: %s -> \"%s\"", mangled_name,
331-
demangled.c_str());
332-
m_demangled.SetStringWithMangledCounterpart(demangled, m_mangled);
333-
}
334-
return m_demangled;
335-
}
336-
#endif // LLDB_ENABLE_SWIFT
337-
break;
338-
case eManglingSchemeNone:
339-
llvm_unreachable("eManglingSchemeNone was handled already");
340-
}
341-
if (demangled_name) {
342-
m_demangled.SetStringWithMangledCounterpart(
343-
llvm::StringRef(demangled_name), m_mangled);
344-
free(demangled_name);
345-
}
324+
{
325+
const char *mangled_name = m_mangled.GetCString();
326+
Log *log = GetLog(LLDBLog::Demangle);
327+
LLDB_LOGF(log, "demangle swift: %s", mangled_name);
328+
std::string demangled(SwiftLanguageRuntime::DemangleSymbolAsString(
329+
mangled_name, SwiftLanguageRuntime::eTypeName, sc));
330+
// Don't cache the demangled name the function isn't available yet.
331+
if (!sc || !sc->function) {
332+
LLDB_LOGF(log, "demangle swift: %s -> \"%s\" (not cached)", mangled_name,
333+
demangled.c_str());
334+
return ConstString(demangled);
346335
}
347-
if (m_demangled.IsNull()) {
348-
// Set the demangled string to the empty string to indicate we tried to
349-
// parse it once and failed.
350-
m_demangled.SetCString("");
336+
if (demangled.empty()) {
337+
LLDB_LOGF(log, "demangle swift: %s -> error: failed to demangle",
338+
mangled_name);
339+
} else {
340+
LLDB_LOGF(log, "demangle swift: %s -> \"%s\"", mangled_name,
341+
demangled.c_str());
342+
m_demangled.SetStringWithMangledCounterpart(demangled, m_mangled);
351343
}
344+
return m_demangled;
345+
}
346+
#endif // LLDB_ENABLE_SWIFT
347+
break;
348+
case eManglingSchemeNone:
349+
// Don't bother demangling anything that isn't mangled.
350+
break;
351+
}
352+
353+
if (demangled_name) {
354+
m_demangled.SetStringWithMangledCounterpart(demangled_name, m_mangled);
355+
free(demangled_name);
356+
}
357+
358+
if (m_demangled.IsNull()) {
359+
// Set the demangled string to the empty string to indicate we tried to
360+
// parse it once and failed.
361+
m_demangled.SetCString("");
352362
}
353363

354364
return m_demangled;

0 commit comments

Comments
 (0)