Skip to content

Commit bf50a87

Browse files
upgrade to llvm::Expected
1 parent 4b848aa commit bf50a87

File tree

1 file changed

+66
-67
lines changed

1 file changed

+66
-67
lines changed

lldb/source/Plugins/Language/Swift/SwiftLanguage.cpp

Lines changed: 66 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -1906,96 +1906,83 @@ SwiftLanguage::GetDemangledFunctionNameWithoutArguments(Mangled mangled) const {
19061906
return mangled_name;
19071907
}
19081908

1909-
static std::optional<llvm::StringRef>
1910-
GetDemangledBasename(const SymbolContext &sc) {
1909+
static llvm::Expected<std::pair<llvm::StringRef, DemangledNameInfo>>
1910+
GetAndValidateInfo(const SymbolContext &sc) {
19111911
Mangled mangled = sc.GetPossiblyInlinedFunctionName();
19121912
if (!mangled)
1913-
return std::nullopt;
1913+
return llvm::createStringError("Function does not have a mangled name.");
19141914

19151915
auto demangled_name = mangled.GetDemangledName().GetStringRef();
19161916
if (demangled_name.empty())
1917-
return std::nullopt;
1917+
return llvm::createStringError(
1918+
"Function '%s' does not have a demangled name.",
1919+
mangled.GetMangledName().AsCString(""));
19181920

19191921
const std::optional<DemangledNameInfo> &info = mangled.GetDemangledInfo();
19201922
if (!info)
1921-
return std::nullopt;
1923+
return llvm::createStringError(
1924+
"Function '%s' does not have demangled info.", demangled_name.data());
19221925

19231926
// Function without a basename is nonsense.
19241927
if (!info->hasBasename())
1925-
return std::nullopt;
1928+
return llvm::createStringError(
1929+
"DemangledInfo for '%s does not have basename range.",
1930+
demangled_name.data());
19261931

1927-
return demangled_name.slice(info->BasenameRange.first,
1928-
info->BasenameRange.second);
1932+
return std::make_pair(demangled_name, *info);
19291933
}
19301934

1931-
static std::optional<llvm::StringRef>
1932-
GetDemangledFunctionPrefix(const SymbolContext &sc) {
1933-
Mangled mangled = sc.GetPossiblyInlinedFunctionName();
1934-
if (!mangled)
1935-
return std::nullopt;
1935+
static llvm::Expected<llvm::StringRef>
1936+
GetDemangledBasename(const SymbolContext &sc) {
1937+
auto info_or_err = GetAndValidateInfo(sc);
1938+
if (!info_or_err)
1939+
return info_or_err.takeError();
19361940

1937-
auto demangled_name = mangled.GetDemangledName().GetStringRef();
1938-
if (demangled_name.empty())
1939-
return std::nullopt;
1941+
auto [demangled_name, info] = *info_or_err;
19401942

1941-
const std::optional<DemangledNameInfo> &info = mangled.GetDemangledInfo();
1942-
if (!info)
1943-
return std::nullopt;
1943+
return demangled_name.slice(info.BasenameRange.first,
1944+
info.BasenameRange.second);
1945+
}
19441946

1945-
// Function without a basename is nonsense.
1946-
if (!info->hasBasename())
1947-
return std::nullopt;
1947+
static llvm::Expected<llvm::StringRef>
1948+
GetDemangledFunctionPrefix(const SymbolContext &sc) {
1949+
auto info_or_err = GetAndValidateInfo(sc);
1950+
if (!info_or_err)
1951+
return info_or_err.takeError();
1952+
1953+
auto [demangled_name, info] = *info_or_err;
19481954

1949-
return demangled_name.slice(info->PrefixRange.first,
1950-
info->PrefixRange.second);
1955+
return demangled_name.slice(info.PrefixRange.first, info.PrefixRange.second);
19511956
}
19521957

1953-
static std::optional<llvm::StringRef>
1958+
static llvm::Expected<llvm::StringRef>
19541959
GetDemangledFunctionSuffix(const SymbolContext &sc) {
1955-
Mangled mangled = sc.GetPossiblyInlinedFunctionName();
1956-
if (!mangled)
1957-
return std::nullopt;
1958-
1959-
auto demangled_name = mangled.GetDemangledName().GetStringRef();
1960-
if (demangled_name.empty())
1961-
return std::nullopt;
1962-
1963-
const std::optional<DemangledNameInfo> &info = mangled.GetDemangledInfo();
1964-
if (!info)
1965-
return std::nullopt;
1960+
auto info_or_err = GetAndValidateInfo(sc);
1961+
if (!info_or_err)
1962+
return info_or_err.takeError();
19661963

1967-
// Function without a basename is nonsense.
1968-
if (!info->hasBasename())
1969-
return std::nullopt;
1964+
auto [demangled_name, info] = *info_or_err;
19701965

1971-
return demangled_name.slice(info->SuffixRange.first,
1972-
info->SuffixRange.second);
1966+
return demangled_name.slice(info.SuffixRange.first, info.SuffixRange.second);
19731967
}
19741968

19751969
static bool PrintDemangledArgumentList(Stream &s, const SymbolContext &sc) {
19761970
assert(sc.symbol);
19771971

1978-
Mangled mangled = sc.GetPossiblyInlinedFunctionName();
1979-
if (!mangled)
1980-
return false;
1981-
1982-
auto demangled_name = mangled.GetDemangledName().GetStringRef();
1983-
if (demangled_name.empty())
1984-
return false;
1985-
1986-
const std::optional<DemangledNameInfo> &info = mangled.GetDemangledInfo();
1987-
if (!info)
1988-
return false;
1989-
1990-
// Function without a basename is nonsense.
1991-
if (!info->hasBasename())
1972+
auto info_or_err = GetAndValidateInfo(sc);
1973+
if (!info_or_err) {
1974+
LLDB_LOG_ERROR(
1975+
GetLog(LLDBLog::Language), info_or_err.takeError(),
1976+
"Failed to handle ${{function.basename}} frame-format variable: {0}");
19921977
return false;
1978+
}
1979+
auto [demangled_name, info] = *info_or_err;
19931980

1994-
if (info->ArgumentsRange.second < info->ArgumentsRange.first)
1981+
if (!info.hasArguments())
19951982
return false;
19961983

1997-
s << demangled_name.slice(info->ArgumentsRange.first,
1998-
info->ArgumentsRange.second);
1984+
s << demangled_name.slice(info.ArgumentsRange.first,
1985+
info.ArgumentsRange.second);
19991986

20001987
return true;
20011988
}
@@ -2016,11 +2003,15 @@ bool SwiftLanguage::HandleFrameFormatVariable(const SymbolContext &sc,
20162003
Stream &s) {
20172004
switch (type) {
20182005
case FormatEntity::Entry::Type::FunctionBasename: {
2019-
std::optional<llvm::StringRef> name = GetDemangledBasename(sc);
2020-
if (!name)
2006+
auto name_or_err = GetDemangledBasename(sc);
2007+
if (!name_or_err) {
2008+
LLDB_LOG_ERROR(
2009+
GetLog(LLDBLog::Language), name_or_err.takeError(),
2010+
"Failed to handle ${{function.basename}} frame-format variable: {0}");
20212011
return false;
2012+
}
20222013

2023-
s << *name;
2014+
s << *name_or_err;
20242015

20252016
return true;
20262017
}
@@ -2047,20 +2038,28 @@ bool SwiftLanguage::HandleFrameFormatVariable(const SymbolContext &sc,
20472038
return true;
20482039
}
20492040
case FormatEntity::Entry::Type::FunctionPrefix: {
2050-
std::optional<llvm::StringRef> prefix = GetDemangledFunctionPrefix(sc);
2051-
if (!prefix)
2041+
auto prefix_or_err = GetDemangledFunctionPrefix(sc);
2042+
if (!prefix_or_err) {
2043+
LLDB_LOG_ERROR(
2044+
GetLog(LLDBLog::Language), prefix_or_err.takeError(),
2045+
"Failed to handle ${{function.prefix}} frame-format variable: {0}");
20522046
return false;
2047+
}
20532048

2054-
s << *prefix;
2049+
s << *prefix_or_err;
20552050

20562051
return true;
20572052
}
20582053
case FormatEntity::Entry::Type::FunctionSuffix: {
2059-
std::optional<llvm::StringRef> suffix = GetDemangledFunctionSuffix(sc);
2060-
if (!suffix)
2054+
auto suffix_or_err = GetDemangledFunctionSuffix(sc);
2055+
if (!suffix_or_err) {
2056+
LLDB_LOG_ERROR(
2057+
GetLog(LLDBLog::Language), suffix_or_err.takeError(),
2058+
"Failed to handle ${{function.suffix}} frame-format variable: {0}");
20612059
return false;
2060+
}
20622061

2063-
s << *suffix;
2062+
s << *suffix_or_err;
20642063

20652064
return true;
20662065
}

0 commit comments

Comments
 (0)