[libcxxabi] [lldb] [llvm] [lldb] Add frame-format option to highlight function names in backtraces (PR #131836)
Pavel Labath via llvm-commits
llvm-commits at lists.llvm.org
Fri Apr 11 04:49:50 PDT 2025
================
@@ -208,6 +209,152 @@ static bool PrettyPrintFunctionNameWithArgs(Stream &out_stream,
return true;
}
+static std::optional<llvm::StringRef> GetDemangledBasename(Function &function) {
+ auto demangled_name = function.GetName().GetStringRef();
+ if (demangled_name.empty())
+ return std::nullopt;
+
+ const std::optional<DemangledNameInfo> &info =
+ function.GetMangled().GetDemangledInfo();
+ if (!info)
+ return std::nullopt;
+
+ // Function without a basename is nonsense.
+ if (!info->hasBasename())
+ return std::nullopt;
+
+ assert(info->BasenameRange.first < demangled_name.size());
+ assert(info->BasenameRange.second < demangled_name.size());
+
+ return demangled_name.substr(info->BasenameRange.first,
+ info->BasenameRange.second -
+ info->BasenameRange.first);
+}
+
+static std::optional<llvm::StringRef>
+GetDemangledTemplateArguments(Function &function) {
+ auto demangled_name = function.GetName().GetStringRef();
+ if (demangled_name.empty())
+ return std::nullopt;
+
+ const std::optional<DemangledNameInfo> &info =
+ function.GetMangled().GetDemangledInfo();
+ if (!info)
+ return std::nullopt;
+
+ // Function without a basename is nonsense.
+ if (!info->hasBasename())
+ return std::nullopt;
+
+ assert(info->BasenameRange.second < demangled_name.size());
+ assert(info->ArgumentsRange.first < demangled_name.size());
+ assert(info->ArgumentsRange.first >= info->BasenameRange.second);
+
+ return demangled_name.substr(info->BasenameRange.second,
+ info->ArgumentsRange.first -
+ info->BasenameRange.second);
+}
+
+static std::optional<llvm::StringRef>
+GetDemangledReturnTypeLHS(Function &function) {
+ auto demangled_name = function.GetName().GetStringRef();
+ if (demangled_name.empty())
+ return std::nullopt;
+
+ const std::optional<DemangledNameInfo> &info =
+ function.GetMangled().GetDemangledInfo();
+ if (!info)
+ return std::nullopt;
+
+ // Function without a basename is nonsense.
+ if (!info->hasBasename())
+ return std::nullopt;
+
+ assert(info->ScopeRange.first < demangled_name.size());
+
+ return demangled_name.substr(0, info->ScopeRange.first);
+}
+
+static std::optional<llvm::StringRef>
+GetDemangledFunctionQualifiers(Function &function) {
+ auto demangled_name = function.GetName().GetStringRef();
+ if (demangled_name.empty())
+ return std::nullopt;
+
+ const std::optional<DemangledNameInfo> &info =
+ function.GetMangled().GetDemangledInfo();
+ if (!info)
+ return std::nullopt;
+
+ // Function without a basename is nonsense.
+ if (!info->hasBasename())
+ return std::nullopt;
+
+ assert(info->QualifiersRange.first <= demangled_name.size());
+ assert(info->QualifiersRange.second <= demangled_name.size());
+ assert(info->QualifiersRange.second >= info->QualifiersRange.first);
+
+ return demangled_name.substr(info->QualifiersRange.first,
+ info->QualifiersRange.second -
+ info->QualifiersRange.first);
----------------
labath wrote:
The only thing that changes here is the DemangledNameInfo field, right?
Maybe you could turn deduplicate that using a utility function that takes a member pointer as an argument?
https://github.com/llvm/llvm-project/pull/131836
More information about the llvm-commits
mailing list