@@ -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