@@ -1906,96 +1906,83 @@ SwiftLanguage::GetDemangledFunctionNameWithoutArguments(Mangled mangled) const {
1906
1906
return mangled_name;
1907
1907
}
1908
1908
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) {
1911
1911
Mangled mangled = sc.GetPossiblyInlinedFunctionName ();
1912
1912
if (!mangled)
1913
- return std::nullopt ;
1913
+ return llvm::createStringError ( " Function does not have a mangled name. " ) ;
1914
1914
1915
1915
auto demangled_name = mangled.GetDemangledName ().GetStringRef ();
1916
1916
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 (" " ));
1918
1920
1919
1921
const std::optional<DemangledNameInfo> &info = mangled.GetDemangledInfo ();
1920
1922
if (!info)
1921
- return std::nullopt;
1923
+ return llvm::createStringError (
1924
+ " Function '%s' does not have demangled info." , demangled_name.data ());
1922
1925
1923
1926
// Function without a basename is nonsense.
1924
1927
if (!info->hasBasename ())
1925
- return std::nullopt;
1928
+ return llvm::createStringError (
1929
+ " DemangledInfo for '%s does not have basename range." ,
1930
+ demangled_name.data ());
1926
1931
1927
- return demangled_name.slice (info->BasenameRange .first ,
1928
- info->BasenameRange .second );
1932
+ return std::make_pair (demangled_name, *info);
1929
1933
}
1930
1934
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 () ;
1936
1940
1937
- auto demangled_name = mangled.GetDemangledName ().GetStringRef ();
1938
- if (demangled_name.empty ())
1939
- return std::nullopt;
1941
+ auto [demangled_name, info] = *info_or_err;
1940
1942
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
+ }
1944
1946
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;
1948
1954
1949
- return demangled_name.slice (info->PrefixRange .first ,
1950
- info->PrefixRange .second );
1955
+ return demangled_name.slice (info.PrefixRange .first , info.PrefixRange .second );
1951
1956
}
1952
1957
1953
- static std::optional <llvm::StringRef>
1958
+ static llvm::Expected <llvm::StringRef>
1954
1959
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 ();
1966
1963
1967
- // Function without a basename is nonsense.
1968
- if (!info->hasBasename ())
1969
- return std::nullopt;
1964
+ auto [demangled_name, info] = *info_or_err;
1970
1965
1971
- return demangled_name.slice (info->SuffixRange .first ,
1972
- info->SuffixRange .second );
1966
+ return demangled_name.slice (info.SuffixRange .first , info.SuffixRange .second );
1973
1967
}
1974
1968
1975
1969
static bool PrintDemangledArgumentList (Stream &s, const SymbolContext &sc) {
1976
1970
assert (sc.symbol );
1977
1971
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}" );
1992
1977
return false ;
1978
+ }
1979
+ auto [demangled_name, info] = *info_or_err;
1993
1980
1994
- if (info-> ArgumentsRange . second < info-> ArgumentsRange . first )
1981
+ if (! info. hasArguments () )
1995
1982
return false ;
1996
1983
1997
- s << demangled_name.slice (info-> ArgumentsRange .first ,
1998
- info-> ArgumentsRange .second );
1984
+ s << demangled_name.slice (info. ArgumentsRange .first ,
1985
+ info. ArgumentsRange .second );
1999
1986
2000
1987
return true ;
2001
1988
}
@@ -2016,11 +2003,15 @@ bool SwiftLanguage::HandleFrameFormatVariable(const SymbolContext &sc,
2016
2003
Stream &s) {
2017
2004
switch (type) {
2018
2005
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}" );
2021
2011
return false ;
2012
+ }
2022
2013
2023
- s << *name ;
2014
+ s << *name_or_err ;
2024
2015
2025
2016
return true ;
2026
2017
}
@@ -2047,20 +2038,28 @@ bool SwiftLanguage::HandleFrameFormatVariable(const SymbolContext &sc,
2047
2038
return true ;
2048
2039
}
2049
2040
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}" );
2052
2046
return false ;
2047
+ }
2053
2048
2054
- s << *prefix ;
2049
+ s << *prefix_or_err ;
2055
2050
2056
2051
return true ;
2057
2052
}
2058
2053
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}" );
2061
2059
return false ;
2060
+ }
2062
2061
2063
- s << *suffix ;
2062
+ s << *suffix_or_err ;
2064
2063
2065
2064
return true ;
2066
2065
}
0 commit comments