99#include " lldb/Core/Mangled.h"
1010
1111#include " lldb/Core/DataFileCache.h"
12+ #include " lldb/Core/DemangledNameInfo.h"
1213#include " lldb/Core/RichManglingContext.h"
1314#include " lldb/Target/Language.h"
1415#include " lldb/Utility/ConstString.h"
@@ -111,6 +112,7 @@ Mangled::operator bool() const { return m_mangled || m_demangled; }
111112void Mangled::Clear () {
112113 m_mangled.Clear ();
113114 m_demangled.Clear ();
115+ m_demangled_info.reset ();
114116}
115117
116118// Compare the string values.
@@ -124,13 +126,16 @@ void Mangled::SetValue(ConstString name) {
124126 if (cstring_is_mangled (name.GetStringRef ())) {
125127 m_demangled.Clear ();
126128 m_mangled = name;
129+ m_demangled_info.reset ();
127130 } else {
128131 m_demangled = name;
129132 m_mangled.Clear ();
133+ m_demangled_info.reset ();
130134 }
131135 } else {
132136 m_demangled.Clear ();
133137 m_mangled.Clear ();
138+ m_demangled_info.reset ();
134139 }
135140}
136141
@@ -152,20 +157,26 @@ static char *GetMSVCDemangledStr(llvm::StringRef M) {
152157 return demangled_cstr;
153158}
154159
155- static char *GetItaniumDemangledStr (const char *M) {
160+ static std::pair<char *, DemangledNameInfo>
161+ GetItaniumDemangledStr (const char *M) {
156162 char *demangled_cstr = nullptr ;
157163
164+ DemangledNameInfo info;
158165 llvm::ItaniumPartialDemangler ipd;
159166 bool err = ipd.partialDemangle (M);
160167 if (!err) {
161- // Default buffer and size (will realloc in case it's too small).
168+ // Default buffer and size (OutputBuffer will realloc in case it's too
169+ // small).
162170 size_t demangled_size = 80 ;
163- demangled_cstr = static_cast <char *>(std::malloc (demangled_size));
164- demangled_cstr = ipd.finishDemangle (demangled_cstr, &demangled_size);
171+ demangled_cstr = static_cast <char *>(std::malloc (80 ));
172+
173+ TrackingOutputBuffer OB (demangled_cstr, demangled_size);
174+ demangled_cstr = ipd.finishDemangle (&OB);
175+ info = std::move (OB.NameInfo );
165176
166177 assert (demangled_cstr &&
167178 " finishDemangle must always succeed if partialDemangle did" );
168- assert (demangled_cstr[demangled_size - 1 ] == ' \0 ' &&
179+ assert (demangled_cstr[OB. getCurrentPosition () - 1 ] == ' \0 ' &&
169180 " Expected demangled_size to return length including trailing null" );
170181 }
171182
@@ -174,9 +185,14 @@ static char *GetItaniumDemangledStr(const char *M) {
174185 LLDB_LOGF (log, " demangled itanium: %s -> \" %s\" " , M, demangled_cstr);
175186 else
176187 LLDB_LOGF (log, " demangled itanium: %s -> error: failed to demangle" , M);
188+
189+ if (!info.hasBasename ())
190+ LLDB_LOGF (log,
191+ " demangled itanium: %s -> error: failed to retrieve name info" ,
192+ M);
177193 }
178194
179- return demangled_cstr;
195+ return { demangled_cstr, std::move (info)} ;
180196}
181197
182198static char *GetRustV0DemangledStr (llvm::StringRef M) {
@@ -269,6 +285,13 @@ ConstString Mangled::GetDemangledName() const {
269285 return GetDemangledNameImpl (/* force=*/ false );
270286}
271287
288+ std::optional<DemangledNameInfo> const &Mangled::GetDemangledInfo () const {
289+ if (!m_demangled_info)
290+ GetDemangledNameImpl (/* force=*/ true );
291+
292+ return m_demangled_info;
293+ }
294+
272295// Generate the demangled name on demand using this accessor. Code in this
273296// class will need to use this accessor if it wishes to decode the demangled
274297// name. The result is cached and will be kept until a new string value is
@@ -293,7 +316,10 @@ ConstString Mangled::GetDemangledNameImpl(bool force) const {
293316 demangled_name = GetMSVCDemangledStr (m_mangled);
294317 break ;
295318 case eManglingSchemeItanium: {
296- demangled_name = GetItaniumDemangledStr (m_mangled.GetCString ());
319+ std::pair<char *, DemangledNameInfo> demangled =
320+ GetItaniumDemangledStr (m_mangled.GetCString ());
321+ demangled_name = demangled.first ;
322+ m_demangled_info.emplace (std::move (demangled.second ));
297323 break ;
298324 }
299325 case eManglingSchemeRustV0:
@@ -452,6 +478,7 @@ bool Mangled::Decode(const DataExtractor &data, lldb::offset_t *offset_ptr,
452478 const StringTableReader &strtab) {
453479 m_mangled.Clear ();
454480 m_demangled.Clear ();
481+ m_demangled_info.reset ();
455482 MangledEncoding encoding = (MangledEncoding)data.GetU8 (offset_ptr);
456483 switch (encoding) {
457484 case Empty:
0 commit comments