@@ -1906,23 +1906,96 @@ SwiftLanguage::GetDemangledFunctionNameWithoutArguments(Mangled mangled) const {
19061906 return mangled_name;
19071907}
19081908
1909- static std::optional<llvm::StringRef>
1909+ static llvm::Expected<std::pair<llvm::StringRef, DemangledNameInfo>>
1910+ GetAndValidateInfo (const SymbolContext &sc) {
1911+ Mangled mangled = sc.GetPossiblyInlinedFunctionName ();
1912+ if (!mangled)
1913+ return llvm::createStringError (" Function does not have a mangled name." );
1914+
1915+ auto demangled_name =
1916+ mangled.GetDemangledName (nullptr , Mangled::eCompactName).GetStringRef ();
1917+ if (demangled_name.empty ())
1918+ return llvm::createStringError (
1919+ " Function '%s' does not have a demangled name." ,
1920+ mangled.GetMangledName ().AsCString (" " ));
1921+
1922+ const std::optional<DemangledNameInfo> &info = mangled.GetDemangledInfo ();
1923+ if (!info)
1924+ return llvm::createStringError (
1925+ " Function '%s' does not have demangled info." , demangled_name.data ());
1926+
1927+ // Function without a basename is nonsense.
1928+ if (!info->hasBasename ())
1929+ return llvm::createStringError (
1930+ " DemangledInfo for '%s does not have basename range." ,
1931+ demangled_name.data ());
1932+
1933+ return std::make_pair (demangled_name, *info);
1934+ }
1935+
1936+ static llvm::Expected<llvm::StringRef>
19101937GetDemangledBasename (const SymbolContext &sc) {
1911- return std::nullopt ;
1938+ auto info_or_err = GetAndValidateInfo (sc);
1939+ if (!info_or_err)
1940+ return info_or_err.takeError ();
1941+
1942+ auto [demangled_name, info] = *info_or_err;
1943+
1944+ return demangled_name.slice (info.BasenameRange .first ,
1945+ info.BasenameRange .second );
19121946}
19131947
1914- static std::optional <llvm::StringRef>
1948+ static llvm::Expected <llvm::StringRef>
19151949GetDemangledFunctionPrefix (const SymbolContext &sc) {
1916- return std::nullopt ;
1950+ auto info_or_err = GetAndValidateInfo (sc);
1951+ if (!info_or_err)
1952+ return info_or_err.takeError ();
1953+
1954+ auto [demangled_name, info] = *info_or_err;
1955+
1956+ if (!info.hasPrefix ())
1957+ return llvm::createStringError (
1958+ " DemangledInfo for '%s does not have suffix range." ,
1959+ demangled_name.data ());
1960+
1961+ return demangled_name.slice (info.PrefixRange .first , info.PrefixRange .second );
19171962}
19181963
1919- static std::optional <llvm::StringRef>
1964+ static llvm::Expected <llvm::StringRef>
19201965GetDemangledFunctionSuffix (const SymbolContext &sc) {
1921- return std::nullopt ;
1966+ auto info_or_err = GetAndValidateInfo (sc);
1967+ if (!info_or_err)
1968+ return info_or_err.takeError ();
1969+
1970+ auto [demangled_name, info] = *info_or_err;
1971+
1972+ if (!info.hasSuffix ())
1973+ return llvm::createStringError (
1974+ " DemangledInfo for '%s does not have suffix range." ,
1975+ demangled_name.data ());
1976+
1977+ return demangled_name.slice (info.SuffixRange .first , info.SuffixRange .second );
19221978}
19231979
19241980static bool PrintDemangledArgumentList (Stream &s, const SymbolContext &sc) {
1925- return false ;
1981+ assert (sc.symbol );
1982+
1983+ auto info_or_err = GetAndValidateInfo (sc);
1984+ if (!info_or_err) {
1985+ LLDB_LOG_ERROR (GetLog (LLDBLog::Language), info_or_err.takeError (),
1986+ " Failed to handle ${{function.formatted-arguments}} "
1987+ " frame-format variable: {0}" );
1988+ return false ;
1989+ }
1990+ auto [demangled_name, info] = *info_or_err;
1991+
1992+ if (!info.hasArguments ())
1993+ return false ;
1994+
1995+ s << demangled_name.slice (info.ArgumentsRange .first ,
1996+ info.ArgumentsRange .second );
1997+
1998+ return true ;
19261999}
19272000
19282001static VariableListSP GetFunctionVariableList (const SymbolContext &sc) {
@@ -1941,11 +2014,15 @@ bool SwiftLanguage::HandleFrameFormatVariable(const SymbolContext &sc,
19412014 Stream &s) {
19422015 switch (type) {
19432016 case FormatEntity::Entry::Type::FunctionBasename: {
1944- std::optional<llvm::StringRef> name = GetDemangledBasename (sc);
1945- if (!name)
2017+ auto name_or_err = GetDemangledBasename (sc);
2018+ if (!name_or_err) {
2019+ LLDB_LOG_ERROR (
2020+ GetLog (LLDBLog::Language), name_or_err.takeError (),
2021+ " Failed to handle ${{function.basename}} frame-format variable: {0}" );
19462022 return false ;
2023+ }
19472024
1948- s << *name ;
2025+ s << *name_or_err ;
19492026
19502027 return true ;
19512028 }
@@ -1972,20 +2049,28 @@ bool SwiftLanguage::HandleFrameFormatVariable(const SymbolContext &sc,
19722049 return true ;
19732050 }
19742051 case FormatEntity::Entry::Type::FunctionPrefix: {
1975- std::optional<llvm::StringRef> prefix = GetDemangledFunctionPrefix (sc);
1976- if (!prefix)
2052+ auto prefix_or_err = GetDemangledFunctionPrefix (sc);
2053+ if (!prefix_or_err) {
2054+ LLDB_LOG_ERROR (
2055+ GetLog (LLDBLog::Language), prefix_or_err.takeError (),
2056+ " Failed to handle ${{function.prefix}} frame-format variable: {0}" );
19772057 return false ;
2058+ }
19782059
1979- s << *prefix ;
2060+ s << *prefix_or_err ;
19802061
19812062 return true ;
19822063 }
19832064 case FormatEntity::Entry::Type::FunctionSuffix: {
1984- std::optional<llvm::StringRef> suffix = GetDemangledFunctionSuffix (sc);
1985- if (!suffix)
2065+ auto suffix_or_err = GetDemangledFunctionSuffix (sc);
2066+ if (!suffix_or_err) {
2067+ LLDB_LOG_ERROR (
2068+ GetLog (LLDBLog::Language), suffix_or_err.takeError (),
2069+ " Failed to handle ${{function.suffix}} frame-format variable: {0}" );
19862070 return false ;
2071+ }
19872072
1988- s << *suffix ;
2073+ s << *suffix_or_err ;
19892074
19902075 return true ;
19912076 }
@@ -2019,7 +2104,7 @@ class PluginProperties : public Properties {
20192104 }
20202105
20212106 FormatEntity::Entry GetFunctionNameFormat () const {
2022- return GetPropertyAtIndexAs<const FormatEntity::Entry>(
2107+ return GetPropertyAtIndexAs<FormatEntity::Entry>(
20232108 ePropertyFunctionNameFormat, {});
20242109 }
20252110};
0 commit comments