@@ -274,81 +274,91 @@ bool Mangled::GetRichManglingInfo(RichManglingContext &context,
274
274
llvm_unreachable (" Fully covered switch above!" );
275
275
}
276
276
277
+ ConstString Mangled::GetDemangledName ( // BEGIN SWIFT
278
+ const SymbolContext *sc
279
+ // END SWIFT
280
+ ) const {
281
+ return GetDemangledNameImpl (/* force=*/ false , sc);
282
+ }
283
+
277
284
// Generate the demangled name on demand using this accessor. Code in this
278
285
// class will need to use this accessor if it wishes to decode the demangled
279
286
// name. The result is cached and will be kept until a new string value is
280
287
// 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.
314
323
#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);
346
335
}
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);
351
343
}
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 (" " );
352
362
}
353
363
354
364
return m_demangled;
0 commit comments