@@ -270,50 +270,51 @@ bool Mangled::GetRichManglingInfo(RichManglingContext &context,
270270// name. The result is cached and will be kept until a new string value is
271271// supplied to this object, or until the end of the object's lifetime.
272272ConstString 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 (" " );
317318 }
318319
319320 return m_demangled;
0 commit comments