@@ -1906,23 +1906,96 @@ SwiftLanguage::GetDemangledFunctionNameWithoutArguments(Mangled mangled) const {
1906
1906
return mangled_name;
1907
1907
}
1908
1908
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>
1910
1937
GetDemangledBasename (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 );
1912
1946
}
1913
1947
1914
- static std::optional <llvm::StringRef>
1948
+ static llvm::Expected <llvm::StringRef>
1915
1949
GetDemangledFunctionPrefix (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 );
1917
1962
}
1918
1963
1919
- static std::optional <llvm::StringRef>
1964
+ static llvm::Expected <llvm::StringRef>
1920
1965
GetDemangledFunctionSuffix (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 );
1922
1978
}
1923
1979
1924
1980
static 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 ;
1926
1999
}
1927
2000
1928
2001
static VariableListSP GetFunctionVariableList (const SymbolContext &sc) {
@@ -1941,11 +2014,15 @@ bool SwiftLanguage::HandleFrameFormatVariable(const SymbolContext &sc,
1941
2014
Stream &s) {
1942
2015
switch (type) {
1943
2016
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}" );
1946
2022
return false ;
2023
+ }
1947
2024
1948
- s << *name ;
2025
+ s << *name_or_err ;
1949
2026
1950
2027
return true ;
1951
2028
}
@@ -1972,20 +2049,28 @@ bool SwiftLanguage::HandleFrameFormatVariable(const SymbolContext &sc,
1972
2049
return true ;
1973
2050
}
1974
2051
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}" );
1977
2057
return false ;
2058
+ }
1978
2059
1979
- s << *prefix ;
2060
+ s << *prefix_or_err ;
1980
2061
1981
2062
return true ;
1982
2063
}
1983
2064
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}" );
1986
2070
return false ;
2071
+ }
1987
2072
1988
- s << *suffix ;
2073
+ s << *suffix_or_err ;
1989
2074
1990
2075
return true ;
1991
2076
}
@@ -2019,7 +2104,7 @@ class PluginProperties : public Properties {
2019
2104
}
2020
2105
2021
2106
FormatEntity::Entry GetFunctionNameFormat () const {
2022
- return GetPropertyAtIndexAs<const FormatEntity::Entry>(
2107
+ return GetPropertyAtIndexAs<FormatEntity::Entry>(
2023
2108
ePropertyFunctionNameFormat, {});
2024
2109
}
2025
2110
};
0 commit comments