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"
@@ -120,6 +121,7 @@ Mangled::operator bool() const { return m_mangled || m_demangled; }
120
121
void Mangled::Clear () {
121
122
m_mangled.Clear ();
122
123
m_demangled.Clear ();
124
+ m_demangled_info.reset ();
123
125
}
124
126
125
127
// Compare the string values.
@@ -133,13 +135,16 @@ void Mangled::SetValue(ConstString name) {
133
135
if (cstring_is_mangled (name.GetStringRef ())) {
134
136
m_demangled.Clear ();
135
137
m_mangled = name;
138
+ m_demangled_info.reset ();
136
139
} else {
137
140
m_demangled = name;
138
141
m_mangled.Clear ();
142
+ m_demangled_info.reset ();
139
143
}
140
144
} else {
141
145
m_demangled.Clear ();
142
146
m_mangled.Clear ();
147
+ m_demangled_info.reset ();
143
148
}
144
149
}
145
150
@@ -161,20 +166,26 @@ static char *GetMSVCDemangledStr(llvm::StringRef M) {
161
166
return demangled_cstr;
162
167
}
163
168
164
- static char *GetItaniumDemangledStr (const char *M) {
169
+ static std::pair<char *, DemangledNameInfo>
170
+ GetItaniumDemangledStr (const char *M) {
165
171
char *demangled_cstr = nullptr ;
166
172
173
+ DemangledNameInfo info;
167
174
llvm::ItaniumPartialDemangler ipd;
168
175
bool err = ipd.partialDemangle (M);
169
176
if (!err) {
170
- // Default buffer and size (will realloc in case it's too small).
177
+ // Default buffer and size (OutputBuffer will realloc in case it's too
178
+ // small).
171
179
size_t demangled_size = 80 ;
172
- demangled_cstr = static_cast <char *>(std::malloc (demangled_size));
173
- demangled_cstr = ipd.finishDemangle (demangled_cstr, &demangled_size);
180
+ demangled_cstr = static_cast <char *>(std::malloc (80 ));
181
+
182
+ TrackingOutputBuffer OB (demangled_cstr, demangled_size);
183
+ demangled_cstr = ipd.finishDemangle (&OB);
184
+ info = std::move (OB.NameInfo );
174
185
175
186
assert (demangled_cstr &&
176
187
" finishDemangle must always succeed if partialDemangle did" );
177
- assert (demangled_cstr[demangled_size - 1 ] == ' \0 ' &&
188
+ assert (demangled_cstr[OB. getCurrentPosition () - 1 ] == ' \0 ' &&
178
189
" Expected demangled_size to return length including trailing null" );
179
190
}
180
191
@@ -183,9 +194,14 @@ static char *GetItaniumDemangledStr(const char *M) {
183
194
LLDB_LOGF (log, " demangled itanium: %s -> \" %s\" " , M, demangled_cstr);
184
195
else
185
196
LLDB_LOGF (log, " demangled itanium: %s -> error: failed to demangle" , M);
197
+
198
+ if (!info.hasBasename ())
199
+ LLDB_LOGF (log,
200
+ " demangled itanium: %s -> error: failed to retrieve name info" ,
201
+ M);
186
202
}
187
203
188
- return demangled_cstr;
204
+ return { demangled_cstr, std::move (info)} ;
189
205
}
190
206
191
207
static char *GetRustV0DemangledStr (llvm::StringRef M) {
@@ -281,6 +297,13 @@ ConstString Mangled::GetDemangledName( // BEGIN SWIFT
281
297
return GetDemangledNameImpl (/* force=*/ false , sc);
282
298
}
283
299
300
+ std::optional<DemangledNameInfo> const &Mangled::GetDemangledInfo () const {
301
+ if (!m_demangled_info)
302
+ GetDemangledNameImpl (/* force=*/ true );
303
+
304
+ return m_demangled_info;
305
+ }
306
+
284
307
// Generate the demangled name on demand using this accessor. Code in this
285
308
// class will need to use this accessor if it wishes to decode the demangled
286
309
// name. The result is cached and will be kept until a new string value is
@@ -308,7 +331,10 @@ ConstString Mangled::GetDemangledNameImpl(bool force, // BEGIN SWIFT
308
331
demangled_name = GetMSVCDemangledStr (m_mangled);
309
332
break ;
310
333
case eManglingSchemeItanium: {
311
- demangled_name = GetItaniumDemangledStr (m_mangled.GetCString ());
334
+ std::pair<char *, DemangledNameInfo> demangled =
335
+ GetItaniumDemangledStr (m_mangled.GetCString ());
336
+ demangled_name = demangled.first ;
337
+ m_demangled_info.emplace (std::move (demangled.second ));
312
338
break ;
313
339
}
314
340
case eManglingSchemeRustV0:
@@ -506,6 +532,7 @@ bool Mangled::Decode(const DataExtractor &data, lldb::offset_t *offset_ptr,
506
532
const StringTableReader &strtab) {
507
533
m_mangled.Clear ();
508
534
m_demangled.Clear ();
535
+ m_demangled_info.reset ();
509
536
MangledEncoding encoding = (MangledEncoding)data.GetU8 (offset_ptr);
510
537
switch (encoding) {
511
538
case Empty:
0 commit comments