Skip to content

Commit fdff64c

Browse files
[lldb] upgrade HandleFrameFormatVariable callees to llvm::Expected
1 parent 3e24dad commit fdff64c

File tree

1 file changed

+110
-156
lines changed

1 file changed

+110
-156
lines changed

lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp

Lines changed: 110 additions & 156 deletions
Original file line numberDiff line numberDiff line change
@@ -236,199 +236,140 @@ static bool PrettyPrintFunctionNameWithArgs(Stream &out_stream,
236236
return true;
237237
}
238238

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) {
241241
Mangled mangled = sc.GetPossiblyInlinedFunctionName();
242242
if (!mangled)
243-
return std::nullopt;
243+
return llvm::createStringError("Function does not have a mangled name.");
244244

245245
auto demangled_name = mangled.GetDemangledName().GetStringRef();
246246
if (demangled_name.empty())
247-
return std::nullopt;
247+
return llvm::createStringError("Function does not have a demangled name.");
248248

249249
const std::optional<DemangledNameInfo> &info = mangled.GetDemangledInfo();
250250
if (!info)
251-
return std::nullopt;
251+
return llvm::createStringError("Function does not have demangled info.");
252252

253253
// Function without a basename is nonsense.
254254
if (!info->hasBasename())
255-
return std::nullopt;
255+
return llvm::createStringError("Info do not have basename range.");
256256

257-
return demangled_name.slice(info->BasenameRange.first,
258-
info->BasenameRange.second);
257+
return std::make_pair(demangled_name, *info);
259258
}
260259

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();
266265

267-
auto demangled_name = mangled.GetDemangledName().GetStringRef();
268-
if (demangled_name.empty())
269-
return std::nullopt;
266+
auto [demangled_name, info] = *info_or_err;
270267

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+
}
274271

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;
278279

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.");
281282

282-
return demangled_name.slice(info->BasenameRange.second,
283-
info->ArgumentsRange.first);
283+
return demangled_name.slice(info.BasenameRange.second,
284+
info.ArgumentsRange.first);
284285
}
285286

286-
static std::optional<llvm::StringRef>
287+
static llvm::Expected<llvm::StringRef>
287288
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();
291292

292-
auto demangled_name = mangled.GetDemangledName().GetStringRef();
293-
if (demangled_name.empty())
294-
return std::nullopt;
293+
auto [demangled_name, info] = *info_or_err;
295294

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.");
299297

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);
308299
}
309300

310-
static std::optional<llvm::StringRef>
301+
static llvm::Expected<llvm::StringRef>
311302
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();
315306

316-
auto demangled_name = mangled.GetDemangledName().GetStringRef();
317-
if (demangled_name.empty())
318-
return std::nullopt;
307+
auto [demangled_name, info] = *info_or_err;
319308

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.");
327311

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);
333314
}
334315

335-
static std::optional<llvm::StringRef>
316+
static llvm::Expected<llvm::StringRef>
336317
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();
344321

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;
352323

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.");
355326

356-
return demangled_name.slice(info->ArgumentsRange.second,
357-
info->QualifiersRange.first);
327+
return demangled_name.slice(info.ArgumentsRange.second,
328+
info.QualifiersRange.first);
358329
}
359330

360-
static std::optional<llvm::StringRef>
331+
static llvm::Expected<llvm::StringRef>
361332
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();
369336

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;
377338

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.");
380341

381-
return demangled_name.slice(info->ScopeRange.first, info->ScopeRange.second);
342+
return demangled_name.slice(info.ScopeRange.first, info.ScopeRange.second);
382343
}
383344

384345
/// Handles anything printed after the FunctionEncoding ItaniumDemangle
385346
/// node. Most notably the DotSUffix node.
386-
static std::optional<llvm::StringRef>
347+
static llvm::Expected<llvm::StringRef>
387348
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();
391352

392-
auto demangled_name = mangled.GetDemangledName().GetStringRef();
393-
if (demangled_name.empty())
394-
return std::nullopt;
353+
auto [demangled_name, info] = *info_or_err;
395354

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);
406356
}
407357

408358
static bool PrintDemangledArgumentList(Stream &s, const SymbolContext &sc) {
409359
assert(sc.symbol);
410360

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();
425364
return false;
365+
}
366+
auto [demangled_name, info] = *info_or_err;
426367

427-
if (info->ArgumentsRange.second < info->ArgumentsRange.first)
368+
if (info.ArgumentsRange.second < info.ArgumentsRange.first)
428369
return false;
429370

430-
s << demangled_name.slice(info->ArgumentsRange.first,
431-
info->ArgumentsRange.second);
371+
s << demangled_name.slice(info.ArgumentsRange.first,
372+
info.ArgumentsRange.second);
432373

433374
return true;
434375
}
@@ -1954,32 +1895,37 @@ bool CPlusPlusLanguage::HandleFrameFormatVariable(
19541895
FormatEntity::Entry::Type type, Stream &s) {
19551896
switch (type) {
19561897
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());
19591901
return false;
1902+
}
19601903

1961-
s << *scope;
1904+
s << *scope_or_err;
19621905

19631906
return true;
19641907
}
19651908

19661909
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());
19691913
return false;
1914+
}
19701915

1971-
s << *name;
1916+
s << *name_or_err;
19721917

19731918
return true;
19741919
}
19751920

19761921
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());
19801925
return false;
1926+
}
19811927

1982-
s << *template_args;
1928+
s << *template_args_or_err;
19831929

19841930
return true;
19851931
}
@@ -2008,38 +1954,46 @@ bool CPlusPlusLanguage::HandleFrameFormatVariable(
20081954
return true;
20091955
}
20101956
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());
20131960
return false;
1961+
}
20141962

2015-
s << *return_rhs;
1963+
s << *return_rhs_or_err;
20161964

20171965
return true;
20181966
}
20191967
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());
20221971
return false;
1972+
}
20231973

2024-
s << *return_lhs;
1974+
s << *return_lhs_or_err;
20251975

20261976
return true;
20271977
}
20281978
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());
20311982
return false;
1983+
}
20321984

2033-
s << *quals;
1985+
s << *quals_or_err;
20341986

20351987
return true;
20361988
}
20371989
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());
20401993
return false;
1994+
}
20411995

2042-
s << *suffix;
1996+
s << *suffix_or_err;
20431997

20441998
return true;
20451999
}

0 commit comments

Comments
 (0)