9
9
#include " lldb/Core/Mangled.h"
10
10
11
11
#include " lldb/Core/DataFileCache.h"
12
+ #include " lldb/Core/DemangledNameInfo.h"
12
13
#include " lldb/Core/RichManglingContext.h"
13
14
#include " lldb/Target/Language.h"
14
15
#include " lldb/Utility/ConstString.h"
@@ -111,6 +112,7 @@ Mangled::operator bool() const { return m_mangled || m_demangled; }
111
112
void Mangled::Clear () {
112
113
m_mangled.Clear ();
113
114
m_demangled.Clear ();
115
+ m_demangled_info.reset ();
114
116
}
115
117
116
118
// Compare the string values.
@@ -124,13 +126,16 @@ void Mangled::SetValue(ConstString name) {
124
126
if (IsMangledName (name.GetStringRef ())) {
125
127
m_demangled.Clear ();
126
128
m_mangled = name;
129
+ m_demangled_info.reset ();
127
130
} else {
128
131
m_demangled = name;
129
132
m_mangled.Clear ();
133
+ m_demangled_info.reset ();
130
134
}
131
135
} else {
132
136
m_demangled.Clear ();
133
137
m_mangled.Clear ();
138
+ m_demangled_info.reset ();
134
139
}
135
140
}
136
141
@@ -152,20 +157,26 @@ static char *GetMSVCDemangledStr(llvm::StringRef M) {
152
157
return demangled_cstr;
153
158
}
154
159
155
- static char *GetItaniumDemangledStr (const char *M) {
160
+ static std::pair<char *, DemangledNameInfo>
161
+ GetItaniumDemangledStr (const char *M) {
156
162
char *demangled_cstr = nullptr ;
157
163
164
+ DemangledNameInfo info;
158
165
llvm::ItaniumPartialDemangler ipd;
159
166
bool err = ipd.partialDemangle (M);
160
167
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).
162
170
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 );
165
176
166
177
assert (demangled_cstr &&
167
178
" finishDemangle must always succeed if partialDemangle did" );
168
- assert (demangled_cstr[demangled_size - 1 ] == ' \0 ' &&
179
+ assert (demangled_cstr[OB. getCurrentPosition () - 1 ] == ' \0 ' &&
169
180
" Expected demangled_size to return length including trailing null" );
170
181
}
171
182
@@ -174,9 +185,14 @@ static char *GetItaniumDemangledStr(const char *M) {
174
185
LLDB_LOGF (log , " demangled itanium: %s -> \" %s\" " , M, demangled_cstr);
175
186
else
176
187
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);
177
193
}
178
194
179
- return demangled_cstr;
195
+ return { demangled_cstr, std::move (info)} ;
180
196
}
181
197
182
198
static char *GetRustV0DemangledStr (llvm::StringRef M) {
@@ -269,6 +285,13 @@ ConstString Mangled::GetDemangledName() const {
269
285
return GetDemangledNameImpl (/* force=*/ false );
270
286
}
271
287
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
+
272
295
// Generate the demangled name on demand using this accessor. Code in this
273
296
// class will need to use this accessor if it wishes to decode the demangled
274
297
// 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 {
293
316
demangled_name = GetMSVCDemangledStr (m_mangled);
294
317
break ;
295
318
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 ));
297
323
break ;
298
324
}
299
325
case eManglingSchemeRustV0:
@@ -452,6 +478,7 @@ bool Mangled::Decode(const DataExtractor &data, lldb::offset_t *offset_ptr,
452
478
const StringTableReader &strtab) {
453
479
m_mangled.Clear ();
454
480
m_demangled.Clear ();
481
+ m_demangled_info.reset ();
455
482
MangledEncoding encoding = (MangledEncoding)data.GetU8 (offset_ptr);
456
483
switch (encoding) {
457
484
case Empty:
0 commit comments