@@ -270,50 +270,51 @@ bool Mangled::GetRichManglingInfo(RichManglingContext &context,
270
270
// name. The result is cached and will be kept until a new string value is
271
271
// supplied to this object, or until the end of the object's lifetime.
272
272
ConstString Mangled::GetDemangledName () const {
273
- // Check to make sure we have a valid mangled name and that we haven't
274
- // already decoded our mangled name.
275
- if (m_mangled && m_demangled.IsNull ()) {
276
- // Don't bother running anything that isn't mangled
277
- const char *mangled_name = m_mangled.GetCString ();
278
- ManglingScheme mangling_scheme =
279
- GetManglingScheme (m_mangled.GetStringRef ());
280
- if (mangling_scheme != eManglingSchemeNone &&
281
- !m_mangled.GetMangledCounterpart (m_demangled)) {
282
- // We didn't already mangle this name, demangle it and if all goes well
283
- // add it to our map.
284
- char *demangled_name = nullptr ;
285
- switch (mangling_scheme) {
286
- case eManglingSchemeMSVC:
287
- demangled_name = GetMSVCDemangledStr (mangled_name);
288
- break ;
289
- case eManglingSchemeItanium: {
290
- demangled_name = GetItaniumDemangledStr (mangled_name);
291
- break ;
292
- }
293
- case eManglingSchemeRustV0:
294
- demangled_name = GetRustV0DemangledStr (m_mangled);
295
- break ;
296
- case eManglingSchemeD:
297
- demangled_name = GetDLangDemangledStr (m_mangled);
298
- break ;
299
- case eManglingSchemeSwift:
300
- // Demangling a swift name requires the swift compiler. This is
301
- // explicitly unsupported on llvm.org.
302
- break ;
303
- case eManglingSchemeNone:
304
- llvm_unreachable (" eManglingSchemeNone was handled already" );
305
- }
306
- if (demangled_name) {
307
- m_demangled.SetStringWithMangledCounterpart (
308
- llvm::StringRef (demangled_name), m_mangled);
309
- free (demangled_name);
310
- }
311
- }
312
- if (m_demangled.IsNull ()) {
313
- // Set the demangled string to the empty string to indicate we tried to
314
- // parse it once and failed.
315
- m_demangled.SetCString (" " );
316
- }
273
+ if (!m_mangled)
274
+ return m_demangled;
275
+
276
+ // Re-use previously demangled names.
277
+ if (!m_demangled.IsNull ())
278
+ return m_demangled;
279
+
280
+ if (m_mangled.GetMangledCounterpart (m_demangled) && !m_demangled.IsNull ())
281
+ return m_demangled;
282
+
283
+ // We didn't already mangle this name, demangle it and if all goes well
284
+ // add it to our map.
285
+ char *demangled_name = nullptr ;
286
+ switch (GetManglingScheme (m_mangled.GetStringRef ())) {
287
+ case eManglingSchemeMSVC:
288
+ demangled_name = GetMSVCDemangledStr (m_mangled);
289
+ break ;
290
+ case eManglingSchemeItanium: {
291
+ demangled_name = GetItaniumDemangledStr (m_mangled.GetCString ());
292
+ break ;
293
+ }
294
+ case eManglingSchemeRustV0:
295
+ demangled_name = GetRustV0DemangledStr (m_mangled);
296
+ break ;
297
+ case eManglingSchemeD:
298
+ demangled_name = GetDLangDemangledStr (m_mangled);
299
+ break ;
300
+ case eManglingSchemeSwift:
301
+ // Demangling a swift name requires the swift compiler. This is
302
+ // explicitly unsupported on llvm.org.
303
+ break ;
304
+ case eManglingSchemeNone:
305
+ // Don't bother demangling anything that isn't mangled.
306
+ break ;
307
+ }
308
+
309
+ if (demangled_name) {
310
+ m_demangled.SetStringWithMangledCounterpart (demangled_name, m_mangled);
311
+ free (demangled_name);
312
+ }
313
+
314
+ if (m_demangled.IsNull ()) {
315
+ // Set the demangled string to the empty string to indicate we tried to
316
+ // parse it once and failed.
317
+ m_demangled.SetCString (" " );
317
318
}
318
319
319
320
return m_demangled;
0 commit comments