99#include " lldb/Core/Mangled.h"
1010
1111#include " lldb/Core/DataFileCache.h"
12+ #include " lldb/Core/Demangle.h"
1213#include " lldb/Core/RichManglingContext.h"
1314#include " lldb/Target/Language.h"
1415#include " lldb/Utility/ConstString.h"
2223#include " llvm/ADT/StringExtras.h"
2324#include " llvm/ADT/StringRef.h"
2425#include " llvm/Demangle/Demangle.h"
26+ #include " llvm/Demangle/Utility.h"
2527#include " llvm/Support/Compiler.h"
2628
2729#include < mutex>
@@ -152,16 +154,21 @@ static char *GetMSVCDemangledStr(llvm::StringRef M) {
152154 return demangled_cstr;
153155}
154156
155- static char *GetItaniumDemangledStr (const char *M) {
157+ static std::pair<char *, FunctionNameInfo>
158+ GetItaniumDemangledStr (const char *M) {
156159 char *demangled_cstr = nullptr ;
157160
161+ FunctionNameInfo info;
158162 llvm::ItaniumPartialDemangler ipd;
159163 bool err = ipd.partialDemangle (M);
160164 if (!err) {
161165 // Default buffer and size (will realloc in case it's too small).
162166 size_t demangled_size = 80 ;
163167 demangled_cstr = static_cast <char *>(std::malloc (demangled_size));
164- demangled_cstr = ipd.finishDemangle (demangled_cstr, &demangled_size);
168+
169+ TrackingOutputBuffer OB (demangled_cstr, demangled_size);
170+ demangled_cstr = ipd.finishDemangle (&OB, &demangled_size);
171+ info = std::move (OB.FunctionInfo );
165172
166173 assert (demangled_cstr &&
167174 " finishDemangle must always succeed if partialDemangle did" );
@@ -174,9 +181,14 @@ static char *GetItaniumDemangledStr(const char *M) {
174181 LLDB_LOGF (log, " demangled itanium: %s -> \" %s\" " , M, demangled_cstr);
175182 else
176183 LLDB_LOGF (log, " demangled itanium: %s -> error: failed to demangle" , M);
184+
185+ if (!info.hasBasename ())
186+ LLDB_LOGF (log,
187+ " demangled itanium: %s -> error: failed to retrieve name info" ,
188+ M);
177189 }
178190
179- return demangled_cstr;
191+ return { demangled_cstr, std::move (info)} ;
180192}
181193
182194static char *GetRustV0DemangledStr (llvm::StringRef M) {
@@ -269,6 +281,13 @@ ConstString Mangled::GetDemangledName() const {
269281 return GetDemangledNameImpl (/* force=*/ false );
270282}
271283
284+ std::optional<FunctionNameInfo> const &Mangled::GetDemangledInfo () const {
285+ if (!m_demangled_info)
286+ GetDemangledNameImpl (/* force=*/ true );
287+
288+ return m_demangled_info;
289+ }
290+
272291// Generate the demangled name on demand using this accessor. Code in this
273292// class will need to use this accessor if it wishes to decode the demangled
274293// name. The result is cached and will be kept until a new string value is
@@ -293,7 +312,10 @@ ConstString Mangled::GetDemangledNameImpl(bool force) const {
293312 demangled_name = GetMSVCDemangledStr (m_mangled);
294313 break ;
295314 case eManglingSchemeItanium: {
296- demangled_name = GetItaniumDemangledStr (m_mangled.GetCString ());
315+ std::pair<char *, FunctionNameInfo> demangled =
316+ GetItaniumDemangledStr (m_mangled.GetCString ());
317+ demangled_name = demangled.first ;
318+ m_demangled_info = std::move (demangled.second );
297319 break ;
298320 }
299321 case eManglingSchemeRustV0:
0 commit comments