2222#include " llvm/ADT/StringExtras.h"
2323#include " llvm/ADT/StringRef.h"
2424#include " llvm/Demangle/Demangle.h"
25+ #include " llvm/Demangle/Utility.h"
2526#include " llvm/Support/Compiler.h"
2627
2728#include < mutex>
@@ -152,16 +153,21 @@ static char *GetMSVCDemangledStr(llvm::StringRef M) {
152153 return demangled_cstr;
153154}
154155
155- static char *GetItaniumDemangledStr (const char *M) {
156+ static std::pair<char *, Mangled::DemangledInfo>
157+ GetItaniumDemangledStr (const char *M) {
156158 char *demangled_cstr = nullptr ;
157159
160+ Mangled::DemangledInfo info;
158161 llvm::ItaniumPartialDemangler ipd;
159162 bool err = ipd.partialDemangle (M);
160163 if (!err) {
161164 // Default buffer and size (will realloc in case it's too small).
162165 size_t demangled_size = 80 ;
163166 demangled_cstr = static_cast <char *>(std::malloc (demangled_size));
164- demangled_cstr = ipd.finishDemangle (demangled_cstr, &demangled_size);
167+
168+ llvm::itanium_demangle::OutputBuffer OB (demangled_cstr, demangled_size);
169+ demangled_cstr = ipd.finishDemangle (&OB, &demangled_size);
170+ info = std::move (OB.FunctionInfo );
165171
166172 assert (demangled_cstr &&
167173 " finishDemangle must always succeed if partialDemangle did" );
@@ -174,9 +180,14 @@ static char *GetItaniumDemangledStr(const char *M) {
174180 LLDB_LOGF (log, " demangled itanium: %s -> \" %s\" " , M, demangled_cstr);
175181 else
176182 LLDB_LOGF (log, " demangled itanium: %s -> error: failed to demangle" , M);
183+
184+ if (!info.hasBasename ())
185+ LLDB_LOGF (log,
186+ " demangled itanium: %s -> error: failed to retrieve name info" ,
187+ M);
177188 }
178189
179- return demangled_cstr;
190+ return { demangled_cstr, std::move (info)} ;
180191}
181192
182193static char *GetRustV0DemangledStr (llvm::StringRef M) {
@@ -269,6 +280,16 @@ ConstString Mangled::GetDemangledName() const {
269280 return GetDemangledNameImpl (/* force=*/ false );
270281}
271282
283+ const Mangled::DemangledInfo &Mangled::GetDemangledInfo () const {
284+ // TODO: if setting m_demangled_info previously failed
285+ // we still end up re-demangling. If m_demangled_info
286+ // was an optional we could prevent that.
287+ if (!m_demangled_info.hasBasename ())
288+ GetDemangledNameImpl (/* force=*/ true );
289+
290+ return m_demangled_info;
291+ }
292+
272293// Generate the demangled name on demand using this accessor. Code in this
273294// class will need to use this accessor if it wishes to decode the demangled
274295// name. The result is cached and will be kept until a new string value is
@@ -293,7 +314,10 @@ ConstString Mangled::GetDemangledNameImpl(bool force) const {
293314 demangled_name = GetMSVCDemangledStr (m_mangled);
294315 break ;
295316 case eManglingSchemeItanium: {
296- demangled_name = GetItaniumDemangledStr (m_mangled.GetCString ());
317+ std::pair<char *, Mangled::DemangledInfo> demangled =
318+ GetItaniumDemangledStr (m_mangled.GetCString ());
319+ demangled_name = demangled.first ;
320+ m_demangled_info = std::move (demangled.second );
297321 break ;
298322 }
299323 case eManglingSchemeRustV0:
0 commit comments