19
19
#include " llvm/ADT/StringRef.h"
20
20
#include " llvm/Demangle/ItaniumDemangle.h"
21
21
22
+ #include " lldb/Core/DemangledNameInfo.h"
22
23
#include " lldb/Core/Mangled.h"
23
24
#include " lldb/Core/Module.h"
24
25
#include " lldb/Core/PluginManager.h"
@@ -271,8 +272,25 @@ GetDemangledBasename(const SymbolContext &sc) {
271
272
272
273
auto [demangled_name, info] = *info_or_err;
273
274
274
- return demangled_name.slice (info.BasenameRange .first ,
275
- info.BasenameRange .second );
275
+ return CPlusPlusLanguage::GetDemangledBasename (demangled_name, info);
276
+ }
277
+
278
+ llvm::StringRef
279
+ CPlusPlusLanguage::GetDemangledBasename (llvm::StringRef demangled,
280
+ const DemangledNameInfo &info) {
281
+ assert (info.hasBasename ());
282
+ return demangled.slice (info.BasenameRange .first , info.BasenameRange .second );
283
+ }
284
+
285
+ llvm::Expected<llvm::StringRef>
286
+ CPlusPlusLanguage::GetDemangledTemplateArguments (
287
+ llvm::StringRef demangled, const DemangledNameInfo &info) {
288
+ if (!info.hasTemplateArguments ())
289
+ return llvm::createStringError (
290
+ " Template arguments range for '%s' is invalid." , demangled.data ());
291
+
292
+ return demangled.slice (info.TemplateArgumentsRange .first ,
293
+ info.TemplateArgumentsRange .second );
276
294
}
277
295
278
296
static llvm::Expected<llvm::StringRef>
@@ -283,12 +301,17 @@ GetDemangledTemplateArguments(const SymbolContext &sc) {
283
301
284
302
auto [demangled_name, info] = *info_or_err;
285
303
286
- if (!info.hasTemplateArguments ())
304
+ return CPlusPlusLanguage::GetDemangledTemplateArguments (demangled_name, info);
305
+ }
306
+
307
+ llvm::Expected<llvm::StringRef>
308
+ CPlusPlusLanguage::GetDemangledReturnTypeLHS (llvm::StringRef demangled,
309
+ const DemangledNameInfo &info) {
310
+ if (info.ScopeRange .first >= demangled.size ())
287
311
return llvm::createStringError (
288
- " Template arguments range for '%s' is invalid." , demangled_name .data ());
312
+ " Scope range for '%s' LHS return type is invalid." , demangled .data ());
289
313
290
- return demangled_name.slice (info.TemplateArgumentsRange .first ,
291
- info.TemplateArgumentsRange .second );
314
+ return demangled.substr (0 , info.ScopeRange .first );
292
315
}
293
316
294
317
static llvm::Expected<llvm::StringRef>
@@ -299,12 +322,18 @@ GetDemangledReturnTypeLHS(const SymbolContext &sc) {
299
322
300
323
auto [demangled_name, info] = *info_or_err;
301
324
302
- if (info.ScopeRange .first >= demangled_name.size ())
303
- return llvm::createStringError (
304
- " Scope range for '%s' LHS return type is invalid." ,
305
- demangled_name.data ());
325
+ return CPlusPlusLanguage::GetDemangledReturnTypeLHS (demangled_name, info);
326
+ }
327
+
328
+ llvm::Expected<llvm::StringRef>
329
+ CPlusPlusLanguage::GetDemangledFunctionQualifiers (
330
+ llvm::StringRef demangled, const DemangledNameInfo &info) {
331
+ if (!info.hasQualifiers ())
332
+ return llvm::createStringError (" Qualifiers range for '%s' is invalid." ,
333
+ demangled.data ());
306
334
307
- return demangled_name.substr (0 , info.ScopeRange .first );
335
+ return demangled.slice (info.QualifiersRange .first ,
336
+ info.QualifiersRange .second );
308
337
}
309
338
310
339
static llvm::Expected<llvm::StringRef>
@@ -315,12 +344,20 @@ GetDemangledFunctionQualifiers(const SymbolContext &sc) {
315
344
316
345
auto [demangled_name, info] = *info_or_err;
317
346
318
- if (!info. hasQualifiers ())
319
- return llvm::createStringError ( " Qualifiers range for '%s' is invalid. " ,
320
- demangled_name. data ());
347
+ return CPlusPlusLanguage::GetDemangledFunctionQualifiers (demangled_name,
348
+ info);
349
+ }
321
350
322
- return demangled_name.slice (info.QualifiersRange .first ,
323
- info.QualifiersRange .second );
351
+ llvm::Expected<llvm::StringRef>
352
+ CPlusPlusLanguage::GetDemangledReturnTypeRHS (llvm::StringRef demangled,
353
+ const DemangledNameInfo &info) {
354
+ if (info.QualifiersRange .first < info.ArgumentsRange .second )
355
+ return llvm::createStringError (
356
+ " Qualifiers range for '%s' RHS return type is invalid." ,
357
+ demangled.data ());
358
+
359
+ return demangled.slice (info.ArgumentsRange .second ,
360
+ info.QualifiersRange .first );
324
361
}
325
362
326
363
static llvm::Expected<llvm::StringRef>
@@ -331,13 +368,17 @@ GetDemangledReturnTypeRHS(const SymbolContext &sc) {
331
368
332
369
auto [demangled_name, info] = *info_or_err;
333
370
334
- if (info.QualifiersRange .first < info.ArgumentsRange .second )
335
- return llvm::createStringError (
336
- " Qualifiers range for '%s' RHS return type is invalid." ,
337
- demangled_name.data ());
371
+ return CPlusPlusLanguage::GetDemangledReturnTypeRHS (demangled_name, info);
372
+ }
338
373
339
- return demangled_name.slice (info.ArgumentsRange .second ,
340
- info.QualifiersRange .first );
374
+ llvm::Expected<llvm::StringRef>
375
+ CPlusPlusLanguage::GetDemangledScope (llvm::StringRef demangled,
376
+ const DemangledNameInfo &info) {
377
+ if (!info.hasScope ())
378
+ return llvm::createStringError (" Scope range for '%s' is invalid." ,
379
+ demangled.data ());
380
+
381
+ return demangled.slice (info.ScopeRange .first , info.ScopeRange .second );
341
382
}
342
383
343
384
static llvm::Expected<llvm::StringRef>
@@ -348,15 +389,16 @@ GetDemangledScope(const SymbolContext &sc) {
348
389
349
390
auto [demangled_name, info] = *info_or_err;
350
391
351
- if (!info.hasScope ())
352
- return llvm::createStringError (" Scope range for '%s' is invalid." ,
353
- demangled_name.data ());
354
-
355
- return demangled_name.slice (info.ScopeRange .first , info.ScopeRange .second );
392
+ return CPlusPlusLanguage::GetDemangledScope (demangled_name, info);
356
393
}
357
394
358
395
// / Handles anything printed after the FunctionEncoding ItaniumDemangle
359
- // / node. Most notably the DotSUffix node.
396
+ // / node. Most notably the DotSuffix node.
397
+ // /
398
+ // / FIXME: the suffix should also have an associated
399
+ // / CPlusPlusLanguage::GetDemangledFunctionSuffix
400
+ // / once we start setting the `DemangledNameInfo::SuffixRange`
401
+ // / from inside the `TrackingOutputBuffer`.
360
402
static llvm::Expected<llvm::StringRef>
361
403
GetDemangledFunctionSuffix (const SymbolContext &sc) {
362
404
auto info_or_err = GetAndValidateInfo (sc);
@@ -372,6 +414,16 @@ GetDemangledFunctionSuffix(const SymbolContext &sc) {
372
414
return demangled_name.slice (info.SuffixRange .first , info.SuffixRange .second );
373
415
}
374
416
417
+ llvm::Expected<llvm::StringRef>
418
+ CPlusPlusLanguage::GetDemangledFunctionArguments (
419
+ llvm::StringRef demangled, const DemangledNameInfo &info) {
420
+ if (!info.hasArguments ())
421
+ return llvm::createStringError (
422
+ " Function arguments range for '%s' is invalid." , demangled.data ());
423
+
424
+ return demangled.slice (info.ArgumentsRange .first , info.ArgumentsRange .second );
425
+ }
426
+
375
427
static bool PrintDemangledArgumentList (Stream &s, const SymbolContext &sc) {
376
428
assert (sc.symbol );
377
429
@@ -382,13 +434,19 @@ static bool PrintDemangledArgumentList(Stream &s, const SymbolContext &sc) {
382
434
" frame-format variable: {0}" );
383
435
return false ;
384
436
}
437
+
385
438
auto [demangled_name, info] = *info_or_err;
386
439
387
- if (!info.hasArguments ())
440
+ auto args_or_err =
441
+ CPlusPlusLanguage::GetDemangledFunctionArguments (demangled_name, info);
442
+ if (!args_or_err) {
443
+ LLDB_LOG_ERROR (GetLog (LLDBLog::Language), args_or_err.takeError (),
444
+ " Failed to handle ${{function.formatted-arguments}} "
445
+ " frame-format variable: {0}" );
388
446
return false ;
447
+ }
389
448
390
- s << demangled_name.slice (info.ArgumentsRange .first ,
391
- info.ArgumentsRange .second );
449
+ s << *args_or_err;
392
450
393
451
return true ;
394
452
}
@@ -2261,7 +2319,7 @@ bool CPlusPlusLanguage::HandleFrameFormatVariable(
2261
2319
FormatEntity::Entry::Type type, Stream &s) {
2262
2320
switch (type) {
2263
2321
case FormatEntity::Entry::Type::FunctionScope: {
2264
- auto scope_or_err = GetDemangledScope (sc);
2322
+ auto scope_or_err = :: GetDemangledScope (sc);
2265
2323
if (!scope_or_err) {
2266
2324
LLDB_LOG_ERROR (
2267
2325
GetLog (LLDBLog::Language), scope_or_err.takeError (),
@@ -2275,7 +2333,7 @@ bool CPlusPlusLanguage::HandleFrameFormatVariable(
2275
2333
}
2276
2334
2277
2335
case FormatEntity::Entry::Type::FunctionBasename: {
2278
- auto name_or_err = GetDemangledBasename (sc);
2336
+ auto name_or_err = :: GetDemangledBasename (sc);
2279
2337
if (!name_or_err) {
2280
2338
LLDB_LOG_ERROR (
2281
2339
GetLog (LLDBLog::Language), name_or_err.takeError (),
@@ -2289,7 +2347,7 @@ bool CPlusPlusLanguage::HandleFrameFormatVariable(
2289
2347
}
2290
2348
2291
2349
case FormatEntity::Entry::Type::FunctionTemplateArguments: {
2292
- auto template_args_or_err = GetDemangledTemplateArguments (sc);
2350
+ auto template_args_or_err = :: GetDemangledTemplateArguments (sc);
2293
2351
if (!template_args_or_err) {
2294
2352
LLDB_LOG_ERROR (GetLog (LLDBLog::Language),
2295
2353
template_args_or_err.takeError (),
@@ -2327,7 +2385,7 @@ bool CPlusPlusLanguage::HandleFrameFormatVariable(
2327
2385
return true ;
2328
2386
}
2329
2387
case FormatEntity::Entry::Type::FunctionReturnRight: {
2330
- auto return_rhs_or_err = GetDemangledReturnTypeRHS (sc);
2388
+ auto return_rhs_or_err = :: GetDemangledReturnTypeRHS (sc);
2331
2389
if (!return_rhs_or_err) {
2332
2390
LLDB_LOG_ERROR (GetLog (LLDBLog::Language), return_rhs_or_err.takeError (),
2333
2391
" Failed to handle ${{function.return-right}} frame-format "
@@ -2340,7 +2398,7 @@ bool CPlusPlusLanguage::HandleFrameFormatVariable(
2340
2398
return true ;
2341
2399
}
2342
2400
case FormatEntity::Entry::Type::FunctionReturnLeft: {
2343
- auto return_lhs_or_err = GetDemangledReturnTypeLHS (sc);
2401
+ auto return_lhs_or_err = :: GetDemangledReturnTypeLHS (sc);
2344
2402
if (!return_lhs_or_err) {
2345
2403
LLDB_LOG_ERROR (GetLog (LLDBLog::Language), return_lhs_or_err.takeError (),
2346
2404
" Failed to handle ${{function.return-left}} frame-format "
@@ -2353,7 +2411,7 @@ bool CPlusPlusLanguage::HandleFrameFormatVariable(
2353
2411
return true ;
2354
2412
}
2355
2413
case FormatEntity::Entry::Type::FunctionQualifiers: {
2356
- auto quals_or_err = GetDemangledFunctionQualifiers (sc);
2414
+ auto quals_or_err = :: GetDemangledFunctionQualifiers (sc);
2357
2415
if (!quals_or_err) {
2358
2416
LLDB_LOG_ERROR (GetLog (LLDBLog::Language), quals_or_err.takeError (),
2359
2417
" Failed to handle ${{function.qualifiers}} frame-format "
0 commit comments