================ @@ -236,199 +236,140 @@ static bool PrettyPrintFunctionNameWithArgs(Stream &out_stream, return true; } -static std::optional<llvm::StringRef> -GetDemangledBasename(const SymbolContext &sc) { +static llvm::Expected<std::pair<llvm::StringRef, DemangledNameInfo>> +GetAndValidateInfo(const SymbolContext &sc) { Mangled mangled = sc.GetPossiblyInlinedFunctionName(); if (!mangled) - return std::nullopt; + return llvm::createStringError("Function does not have a mangled name."); auto demangled_name = mangled.GetDemangledName().GetStringRef(); if (demangled_name.empty()) - return std::nullopt; + return llvm::createStringError("Function does not have a demangled name."); const std::optional<DemangledNameInfo> &info = mangled.GetDemangledInfo(); if (!info) - return std::nullopt; + return llvm::createStringError("Function does not have demangled info."); // Function without a basename is nonsense. if (!info->hasBasename()) - return std::nullopt; + return llvm::createStringError("Info do not have basename range."); - return demangled_name.slice(info->BasenameRange.first, - info->BasenameRange.second); + return std::make_pair(demangled_name, *info); } -static std::optional<llvm::StringRef> -GetDemangledTemplateArguments(const SymbolContext &sc) { - Mangled mangled = sc.GetPossiblyInlinedFunctionName(); - if (!mangled) - return std::nullopt; +static llvm::Expected<llvm::StringRef> +GetDemangledBasename(const SymbolContext &sc) { + auto info_or_err = GetAndValidateInfo(sc); + if (!info_or_err) + return info_or_err.takeError(); - auto demangled_name = mangled.GetDemangledName().GetStringRef(); - if (demangled_name.empty()) - return std::nullopt; + auto [demangled_name, info] = *info_or_err; - const std::optional<DemangledNameInfo> &info = mangled.GetDemangledInfo(); - if (!info) - return std::nullopt; + return demangled_name.slice(info.BasenameRange.first, + info.BasenameRange.second); +} - // Function without a basename is nonsense. - if (!info->hasBasename()) - return std::nullopt; +static llvm::Expected<llvm::StringRef> +GetDemangledTemplateArguments(const SymbolContext &sc) { + auto info_or_err = GetAndValidateInfo(sc); + if (!info_or_err) + return info_or_err.takeError(); + + auto [demangled_name, info] = *info_or_err; - if (info->ArgumentsRange.first < info->BasenameRange.second) - return std::nullopt; + if (info.ArgumentsRange.first < info.BasenameRange.second) + return llvm::createStringError("Arguments in info are invalid."); - return demangled_name.slice(info->BasenameRange.second, - info->ArgumentsRange.first); + return demangled_name.slice(info.BasenameRange.second, + info.ArgumentsRange.first); } -static std::optional<llvm::StringRef> +static llvm::Expected<llvm::StringRef> GetDemangledReturnTypeLHS(const SymbolContext &sc) { - Mangled mangled = sc.GetPossiblyInlinedFunctionName(); - if (!mangled) - return std::nullopt; + auto info_or_err = GetAndValidateInfo(sc); + if (!info_or_err) + return info_or_err.takeError(); - auto demangled_name = mangled.GetDemangledName().GetStringRef(); - if (demangled_name.empty()) - return std::nullopt; + auto [demangled_name, info] = *info_or_err; - const std::optional<DemangledNameInfo> &info = mangled.GetDemangledInfo(); - if (!info) - return std::nullopt; + if (info.ScopeRange.first >= demangled_name.size()) + return llvm::createStringError("Scope range is invalid."); - // Function without a basename is nonsense. - if (!info->hasBasename()) - return std::nullopt; - - if (info->ScopeRange.first >= demangled_name.size()) - return std::nullopt; - - return demangled_name.substr(0, info->ScopeRange.first); + return demangled_name.substr(0, info.ScopeRange.first); } -static std::optional<llvm::StringRef> +static llvm::Expected<llvm::StringRef> GetDemangledFunctionQualifiers(const SymbolContext &sc) { - Mangled mangled = sc.GetPossiblyInlinedFunctionName(); - if (!mangled) - return std::nullopt; + auto info_or_err = GetAndValidateInfo(sc); + if (!info_or_err) + return info_or_err.takeError(); - auto demangled_name = mangled.GetDemangledName().GetStringRef(); - if (demangled_name.empty()) - return std::nullopt; + auto [demangled_name, info] = *info_or_err; - const std::optional<DemangledNameInfo> &info = mangled.GetDemangledInfo(); - if (!info) - return std::nullopt; - - // Function without a basename is nonsense. - if (!info->hasBasename()) - return std::nullopt; + if (info.QualifiersRange.second < info.QualifiersRange.first) + return llvm::createStringError("Qualifiers range is invalid."); - if (info->QualifiersRange.second < info->QualifiersRange.first) - return std::nullopt; - - return demangled_name.slice(info->QualifiersRange.first, - info->QualifiersRange.second); + return demangled_name.slice(info.QualifiersRange.first, + info.QualifiersRange.second); } -static std::optional<llvm::StringRef> +static llvm::Expected<llvm::StringRef> GetDemangledReturnTypeRHS(const SymbolContext &sc) { - Mangled mangled = sc.GetPossiblyInlinedFunctionName(); - if (!mangled) - return std::nullopt; - - auto demangled_name = mangled.GetDemangledName().GetStringRef(); - if (demangled_name.empty()) - return std::nullopt; + auto info_or_err = GetAndValidateInfo(sc); + if (!info_or_err) + return info_or_err.takeError(); - const std::optional<DemangledNameInfo> &info = mangled.GetDemangledInfo(); - if (!info) - return std::nullopt; - - // Function without a basename is nonsense. - if (!info->hasBasename()) - return std::nullopt; + auto [demangled_name, info] = *info_or_err; - if (info->QualifiersRange.first < info->ArgumentsRange.second) - return std::nullopt; + if (info.QualifiersRange.first < info.ArgumentsRange.second) + return llvm::createStringError("Qualifiers range is invalid."); - return demangled_name.slice(info->ArgumentsRange.second, - info->QualifiersRange.first); + return demangled_name.slice(info.ArgumentsRange.second, + info.QualifiersRange.first); } -static std::optional<llvm::StringRef> +static llvm::Expected<llvm::StringRef> GetDemangledScope(const SymbolContext &sc) { - Mangled mangled = sc.GetPossiblyInlinedFunctionName(); - if (!mangled) - return std::nullopt; - - auto demangled_name = mangled.GetDemangledName().GetStringRef(); - if (demangled_name.empty()) - return std::nullopt; + auto info_or_err = GetAndValidateInfo(sc); + if (!info_or_err) + return info_or_err.takeError(); - const std::optional<DemangledNameInfo> &info = mangled.GetDemangledInfo(); - if (!info) - return std::nullopt; - - // Function without a basename is nonsense. - if (!info->hasBasename()) - return std::nullopt; + auto [demangled_name, info] = *info_or_err; - if (info->ScopeRange.second < info->ScopeRange.first) - return std::nullopt; + if (info.ScopeRange.second < info.ScopeRange.first) + return llvm::createStringError("Info do not have basename range."); - return demangled_name.slice(info->ScopeRange.first, info->ScopeRange.second); + return demangled_name.slice(info.ScopeRange.first, info.ScopeRange.second); } /// Handles anything printed after the FunctionEncoding ItaniumDemangle /// node. Most notably the DotSUffix node. -static std::optional<llvm::StringRef> +static llvm::Expected<llvm::StringRef> GetDemangledFunctionSuffix(const SymbolContext &sc) { - Mangled mangled = sc.GetPossiblyInlinedFunctionName(); - if (!mangled) - return std::nullopt; + auto info_or_err = GetAndValidateInfo(sc); + if (!info_or_err) + return info_or_err.takeError(); - auto demangled_name = mangled.GetDemangledName().GetStringRef(); - if (demangled_name.empty()) - return std::nullopt; + auto [demangled_name, info] = *info_or_err; - const std::optional<DemangledNameInfo> &info = mangled.GetDemangledInfo(); - if (!info) - return std::nullopt; - - // Function without a basename is nonsense. - if (!info->hasBasename()) - return std::nullopt; - - return demangled_name.slice(info->SuffixRange.first, - info->SuffixRange.second); + return demangled_name.slice(info.SuffixRange.first, info.SuffixRange.second); } static bool PrintDemangledArgumentList(Stream &s, const SymbolContext &sc) { assert(sc.symbol); - Mangled mangled = sc.GetPossiblyInlinedFunctionName(); - if (!mangled) - return false; - - auto demangled_name = mangled.GetDemangledName().GetStringRef(); - if (demangled_name.empty()) - return false; - - const std::optional<DemangledNameInfo> &info = mangled.GetDemangledInfo(); - if (!info) - return false; - - // Function without a basename is nonsense. - if (!info->hasBasename()) + auto info_or_err = GetAndValidateInfo(sc); + if (!info_or_err) { + llvm::consumeError(info_or_err.takeError()); ---------------- charles-zablit wrote:
Fixed, thanks! `LLDB_LOG_ERROR` seems to be reasonable for now, I did not encounter an error message while testing on a small C++ program. https://github.com/llvm/llvm-project/pull/144731 _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits