@@ -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>
19541959GetDemangledFunctionSuffix (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
19751969static 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