@@ -236,199 +236,140 @@ static bool PrettyPrintFunctionNameWithArgs(Stream &out_stream,
236
236
return true ;
237
237
}
238
238
239
- static std::optional <llvm::StringRef>
240
- GetDemangledBasename (const SymbolContext &sc) {
239
+ static llvm::Expected< std::pair <llvm::StringRef, DemangledNameInfo> >
240
+ GetAndValidateInfo (const SymbolContext &sc) {
241
241
Mangled mangled = sc.GetPossiblyInlinedFunctionName ();
242
242
if (!mangled)
243
- return std::nullopt ;
243
+ return llvm::createStringError ( " Function does not have a mangled name. " ) ;
244
244
245
245
auto demangled_name = mangled.GetDemangledName ().GetStringRef ();
246
246
if (demangled_name.empty ())
247
- return std::nullopt ;
247
+ return llvm::createStringError ( " Function does not have a demangled name. " ) ;
248
248
249
249
const std::optional<DemangledNameInfo> &info = mangled.GetDemangledInfo ();
250
250
if (!info)
251
- return std::nullopt ;
251
+ return llvm::createStringError ( " Function does not have demangled info. " ) ;
252
252
253
253
// Function without a basename is nonsense.
254
254
if (!info->hasBasename ())
255
- return std::nullopt ;
255
+ return llvm::createStringError ( " Info do not have basename range. " ) ;
256
256
257
- return demangled_name.slice (info->BasenameRange .first ,
258
- info->BasenameRange .second );
257
+ return std::make_pair (demangled_name, *info);
259
258
}
260
259
261
- static std::optional <llvm::StringRef>
262
- GetDemangledTemplateArguments (const SymbolContext &sc) {
263
- Mangled mangled = sc. GetPossiblyInlinedFunctionName ( );
264
- if (!mangled )
265
- return std::nullopt ;
260
+ static llvm::Expected <llvm::StringRef>
261
+ GetDemangledBasename (const SymbolContext &sc) {
262
+ auto info_or_err = GetAndValidateInfo (sc );
263
+ if (!info_or_err )
264
+ return info_or_err. takeError () ;
266
265
267
- auto demangled_name = mangled.GetDemangledName ().GetStringRef ();
268
- if (demangled_name.empty ())
269
- return std::nullopt;
266
+ auto [demangled_name, info] = *info_or_err;
270
267
271
- const std::optional<DemangledNameInfo> &info = mangled. GetDemangledInfo ();
272
- if (! info)
273
- return std::nullopt;
268
+ return demangled_name. slice (info. BasenameRange . first ,
269
+ info. BasenameRange . second );
270
+ }
274
271
275
- // Function without a basename is nonsense.
276
- if (!info->hasBasename ())
277
- return std::nullopt;
272
+ static llvm::Expected<llvm::StringRef>
273
+ GetDemangledTemplateArguments (const SymbolContext &sc) {
274
+ auto info_or_err = GetAndValidateInfo (sc);
275
+ if (!info_or_err)
276
+ return info_or_err.takeError ();
277
+
278
+ auto [demangled_name, info] = *info_or_err;
278
279
279
- if (info-> ArgumentsRange .first < info-> BasenameRange .second )
280
- return std::nullopt ;
280
+ if (info. ArgumentsRange .first < info. BasenameRange .second )
281
+ return llvm::createStringError ( " Arguments in info are invalid. " ) ;
281
282
282
- return demangled_name.slice (info-> BasenameRange .second ,
283
- info-> ArgumentsRange .first );
283
+ return demangled_name.slice (info. BasenameRange .second ,
284
+ info. ArgumentsRange .first );
284
285
}
285
286
286
- static std::optional <llvm::StringRef>
287
+ static llvm::Expected <llvm::StringRef>
287
288
GetDemangledReturnTypeLHS (const SymbolContext &sc) {
288
- Mangled mangled = sc. GetPossiblyInlinedFunctionName ( );
289
- if (!mangled )
290
- return std::nullopt ;
289
+ auto info_or_err = GetAndValidateInfo (sc );
290
+ if (!info_or_err )
291
+ return info_or_err. takeError () ;
291
292
292
- auto demangled_name = mangled.GetDemangledName ().GetStringRef ();
293
- if (demangled_name.empty ())
294
- return std::nullopt;
293
+ auto [demangled_name, info] = *info_or_err;
295
294
296
- const std::optional<DemangledNameInfo> &info = mangled.GetDemangledInfo ();
297
- if (!info)
298
- return std::nullopt;
295
+ if (info.ScopeRange .first >= demangled_name.size ())
296
+ return llvm::createStringError (" Scope range is invalid." );
299
297
300
- // Function without a basename is nonsense.
301
- if (!info->hasBasename ())
302
- return std::nullopt;
303
-
304
- if (info->ScopeRange .first >= demangled_name.size ())
305
- return std::nullopt;
306
-
307
- return demangled_name.substr (0 , info->ScopeRange .first );
298
+ return demangled_name.substr (0 , info.ScopeRange .first );
308
299
}
309
300
310
- static std::optional <llvm::StringRef>
301
+ static llvm::Expected <llvm::StringRef>
311
302
GetDemangledFunctionQualifiers (const SymbolContext &sc) {
312
- Mangled mangled = sc. GetPossiblyInlinedFunctionName ( );
313
- if (!mangled )
314
- return std::nullopt ;
303
+ auto info_or_err = GetAndValidateInfo (sc );
304
+ if (!info_or_err )
305
+ return info_or_err. takeError () ;
315
306
316
- auto demangled_name = mangled.GetDemangledName ().GetStringRef ();
317
- if (demangled_name.empty ())
318
- return std::nullopt;
307
+ auto [demangled_name, info] = *info_or_err;
319
308
320
- const std::optional<DemangledNameInfo> &info = mangled.GetDemangledInfo ();
321
- if (!info)
322
- return std::nullopt;
323
-
324
- // Function without a basename is nonsense.
325
- if (!info->hasBasename ())
326
- return std::nullopt;
309
+ if (info.QualifiersRange .second < info.QualifiersRange .first )
310
+ return llvm::createStringError (" Qualifiers range is invalid." );
327
311
328
- if (info->QualifiersRange .second < info->QualifiersRange .first )
329
- return std::nullopt;
330
-
331
- return demangled_name.slice (info->QualifiersRange .first ,
332
- info->QualifiersRange .second );
312
+ return demangled_name.slice (info.QualifiersRange .first ,
313
+ info.QualifiersRange .second );
333
314
}
334
315
335
- static std::optional <llvm::StringRef>
316
+ static llvm::Expected <llvm::StringRef>
336
317
GetDemangledReturnTypeRHS (const SymbolContext &sc) {
337
- Mangled mangled = sc.GetPossiblyInlinedFunctionName ();
338
- if (!mangled)
339
- return std::nullopt;
340
-
341
- auto demangled_name = mangled.GetDemangledName ().GetStringRef ();
342
- if (demangled_name.empty ())
343
- return std::nullopt;
318
+ auto info_or_err = GetAndValidateInfo (sc);
319
+ if (!info_or_err)
320
+ return info_or_err.takeError ();
344
321
345
- const std::optional<DemangledNameInfo> &info = mangled.GetDemangledInfo ();
346
- if (!info)
347
- return std::nullopt;
348
-
349
- // Function without a basename is nonsense.
350
- if (!info->hasBasename ())
351
- return std::nullopt;
322
+ auto [demangled_name, info] = *info_or_err;
352
323
353
- if (info-> QualifiersRange .first < info-> ArgumentsRange .second )
354
- return std::nullopt ;
324
+ if (info. QualifiersRange .first < info. ArgumentsRange .second )
325
+ return llvm::createStringError ( " Qualifiers range is invalid. " ) ;
355
326
356
- return demangled_name.slice (info-> ArgumentsRange .second ,
357
- info-> QualifiersRange .first );
327
+ return demangled_name.slice (info. ArgumentsRange .second ,
328
+ info. QualifiersRange .first );
358
329
}
359
330
360
- static std::optional <llvm::StringRef>
331
+ static llvm::Expected <llvm::StringRef>
361
332
GetDemangledScope (const SymbolContext &sc) {
362
- Mangled mangled = sc.GetPossiblyInlinedFunctionName ();
363
- if (!mangled)
364
- return std::nullopt;
365
-
366
- auto demangled_name = mangled.GetDemangledName ().GetStringRef ();
367
- if (demangled_name.empty ())
368
- return std::nullopt;
333
+ auto info_or_err = GetAndValidateInfo (sc);
334
+ if (!info_or_err)
335
+ return info_or_err.takeError ();
369
336
370
- const std::optional<DemangledNameInfo> &info = mangled.GetDemangledInfo ();
371
- if (!info)
372
- return std::nullopt;
373
-
374
- // Function without a basename is nonsense.
375
- if (!info->hasBasename ())
376
- return std::nullopt;
337
+ auto [demangled_name, info] = *info_or_err;
377
338
378
- if (info-> ScopeRange .second < info-> ScopeRange .first )
379
- return std::nullopt ;
339
+ if (info. ScopeRange .second < info. ScopeRange .first )
340
+ return llvm::createStringError ( " Info do not have basename range. " ) ;
380
341
381
- return demangled_name.slice (info-> ScopeRange .first , info-> ScopeRange .second );
342
+ return demangled_name.slice (info. ScopeRange .first , info. ScopeRange .second );
382
343
}
383
344
384
345
// / Handles anything printed after the FunctionEncoding ItaniumDemangle
385
346
// / node. Most notably the DotSUffix node.
386
- static std::optional <llvm::StringRef>
347
+ static llvm::Expected <llvm::StringRef>
387
348
GetDemangledFunctionSuffix (const SymbolContext &sc) {
388
- Mangled mangled = sc. GetPossiblyInlinedFunctionName ( );
389
- if (!mangled )
390
- return std::nullopt ;
349
+ auto info_or_err = GetAndValidateInfo (sc );
350
+ if (!info_or_err )
351
+ return info_or_err. takeError () ;
391
352
392
- auto demangled_name = mangled.GetDemangledName ().GetStringRef ();
393
- if (demangled_name.empty ())
394
- return std::nullopt;
353
+ auto [demangled_name, info] = *info_or_err;
395
354
396
- const std::optional<DemangledNameInfo> &info = mangled.GetDemangledInfo ();
397
- if (!info)
398
- return std::nullopt;
399
-
400
- // Function without a basename is nonsense.
401
- if (!info->hasBasename ())
402
- return std::nullopt;
403
-
404
- return demangled_name.slice (info->SuffixRange .first ,
405
- info->SuffixRange .second );
355
+ return demangled_name.slice (info.SuffixRange .first , info.SuffixRange .second );
406
356
}
407
357
408
358
static bool PrintDemangledArgumentList (Stream &s, const SymbolContext &sc) {
409
359
assert (sc.symbol );
410
360
411
- Mangled mangled = sc.GetPossiblyInlinedFunctionName ();
412
- if (!mangled)
413
- return false ;
414
-
415
- auto demangled_name = mangled.GetDemangledName ().GetStringRef ();
416
- if (demangled_name.empty ())
417
- return false ;
418
-
419
- const std::optional<DemangledNameInfo> &info = mangled.GetDemangledInfo ();
420
- if (!info)
421
- return false ;
422
-
423
- // Function without a basename is nonsense.
424
- if (!info->hasBasename ())
361
+ auto info_or_err = GetAndValidateInfo (sc);
362
+ if (!info_or_err) {
363
+ info_or_err.takeError ();
425
364
return false ;
365
+ }
366
+ auto [demangled_name, info] = *info_or_err;
426
367
427
- if (info-> ArgumentsRange .second < info-> ArgumentsRange .first )
368
+ if (info. ArgumentsRange .second < info. ArgumentsRange .first )
428
369
return false ;
429
370
430
- s << demangled_name.slice (info-> ArgumentsRange .first ,
431
- info-> ArgumentsRange .second );
371
+ s << demangled_name.slice (info. ArgumentsRange .first ,
372
+ info. ArgumentsRange .second );
432
373
433
374
return true ;
434
375
}
@@ -1954,32 +1895,37 @@ bool CPlusPlusLanguage::HandleFrameFormatVariable(
1954
1895
FormatEntity::Entry::Type type, Stream &s) {
1955
1896
switch (type) {
1956
1897
case FormatEntity::Entry::Type::FunctionScope: {
1957
- std::optional<llvm::StringRef> scope = GetDemangledScope (sc);
1958
- if (!scope)
1898
+ auto scope_or_err = GetDemangledScope (sc);
1899
+ if (!scope_or_err) {
1900
+ llvm::consumeError (scope_or_err.takeError ());
1959
1901
return false ;
1902
+ }
1960
1903
1961
- s << *scope ;
1904
+ s << *scope_or_err ;
1962
1905
1963
1906
return true ;
1964
1907
}
1965
1908
1966
1909
case FormatEntity::Entry::Type::FunctionBasename: {
1967
- std::optional<llvm::StringRef> name = GetDemangledBasename (sc);
1968
- if (!name)
1910
+ auto name_or_err = GetDemangledBasename (sc);
1911
+ if (!name_or_err) {
1912
+ llvm::consumeError (name_or_err.takeError ());
1969
1913
return false ;
1914
+ }
1970
1915
1971
- s << *name ;
1916
+ s << *name_or_err ;
1972
1917
1973
1918
return true ;
1974
1919
}
1975
1920
1976
1921
case FormatEntity::Entry::Type::FunctionTemplateArguments: {
1977
- std::optional<llvm::StringRef> template_args =
1978
- GetDemangledTemplateArguments (sc);
1979
- if (!template_args)
1922
+ auto template_args_or_err = GetDemangledTemplateArguments (sc);
1923
+ if (!template_args_or_err) {
1924
+ llvm::consumeError (template_args_or_err. takeError ());
1980
1925
return false ;
1926
+ }
1981
1927
1982
- s << *template_args ;
1928
+ s << *template_args_or_err ;
1983
1929
1984
1930
return true ;
1985
1931
}
@@ -2008,38 +1954,46 @@ bool CPlusPlusLanguage::HandleFrameFormatVariable(
2008
1954
return true ;
2009
1955
}
2010
1956
case FormatEntity::Entry::Type::FunctionReturnRight: {
2011
- std::optional<llvm::StringRef> return_rhs = GetDemangledReturnTypeRHS (sc);
2012
- if (!return_rhs)
1957
+ auto return_rhs_or_err = GetDemangledReturnTypeRHS (sc);
1958
+ if (!return_rhs_or_err) {
1959
+ llvm::consumeError (return_rhs_or_err.takeError ());
2013
1960
return false ;
1961
+ }
2014
1962
2015
- s << *return_rhs ;
1963
+ s << *return_rhs_or_err ;
2016
1964
2017
1965
return true ;
2018
1966
}
2019
1967
case FormatEntity::Entry::Type::FunctionReturnLeft: {
2020
- std::optional<llvm::StringRef> return_lhs = GetDemangledReturnTypeLHS (sc);
2021
- if (!return_lhs)
1968
+ auto return_lhs_or_err = GetDemangledReturnTypeLHS (sc);
1969
+ if (!return_lhs_or_err) {
1970
+ llvm::consumeError (return_lhs_or_err.takeError ());
2022
1971
return false ;
1972
+ }
2023
1973
2024
- s << *return_lhs ;
1974
+ s << *return_lhs_or_err ;
2025
1975
2026
1976
return true ;
2027
1977
}
2028
1978
case FormatEntity::Entry::Type::FunctionQualifiers: {
2029
- std::optional<llvm::StringRef> quals = GetDemangledFunctionQualifiers (sc);
2030
- if (!quals)
1979
+ auto quals_or_err = GetDemangledFunctionQualifiers (sc);
1980
+ if (!quals_or_err) {
1981
+ llvm::consumeError (quals_or_err.takeError ());
2031
1982
return false ;
1983
+ }
2032
1984
2033
- s << *quals ;
1985
+ s << *quals_or_err ;
2034
1986
2035
1987
return true ;
2036
1988
}
2037
1989
case FormatEntity::Entry::Type::FunctionSuffix: {
2038
- std::optional<llvm::StringRef> suffix = GetDemangledFunctionSuffix (sc);
2039
- if (!suffix)
1990
+ auto suffix_or_err = GetDemangledFunctionSuffix (sc);
1991
+ if (!suffix_or_err) {
1992
+ llvm::consumeError (suffix_or_err.takeError ());
2040
1993
return false ;
1994
+ }
2041
1995
2042
- s << *suffix ;
1996
+ s << *suffix_or_err ;
2043
1997
2044
1998
return true ;
2045
1999
}
0 commit comments