https://github.com/Michael137 updated https://github.com/llvm/llvm-project/pull/135343
>From 7d8455bd0b30ee5cd49788243646e75ae8938159 Mon Sep 17 00:00:00 2001 From: Michael Buch <michaelbuc...@gmail.com> Date: Fri, 11 Apr 2025 11:02:19 +0100 Subject: [PATCH 1/2] [lldb][Format] Only display inlined frame name in backtraces if available --- lldb/include/lldb/Symbol/SymbolContext.h | 7 ++ lldb/source/Core/FormatEntity.cpp | 95 +++++-------------- .../Language/CPlusPlus/CPlusPlusLanguage.cpp | 25 +---- lldb/source/Symbol/SymbolContext.cpp | 26 +++++ .../Shell/Settings/TestFrameFormatName.test | 8 +- 5 files changed, 63 insertions(+), 98 deletions(-) diff --git a/lldb/include/lldb/Symbol/SymbolContext.h b/lldb/include/lldb/Symbol/SymbolContext.h index 8b6317c6f33c2..4f8405f1f0db5 100644 --- a/lldb/include/lldb/Symbol/SymbolContext.h +++ b/lldb/include/lldb/Symbol/SymbolContext.h @@ -307,6 +307,13 @@ class SymbolContext { SymbolContext &next_frame_sc, Address &inlined_frame_addr) const; + /// If available, will return the function name according to the specified + /// mangling preference. If this object represents an inlined function, + /// returns the name of the inlined function. Returns nullptr if no function + /// name could be determined. + const char *GetPossiblyInlinedFunctionName( + Mangled::NamePreference mangling_preference) const; + // Member variables lldb::TargetSP target_sp; ///< The Target for a given query lldb::ModuleSP module_sp; ///< The Module for a given query diff --git a/lldb/source/Core/FormatEntity.cpp b/lldb/source/Core/FormatEntity.cpp index a9370595c11e7..c3068a9cfaeab 100644 --- a/lldb/source/Core/FormatEntity.cpp +++ b/lldb/source/Core/FormatEntity.cpp @@ -1147,19 +1147,6 @@ static void PrettyPrintFunctionNameWithArgs(Stream &out_stream, out_stream.PutChar(')'); } -static void FormatInlinedBlock(Stream &out_stream, Block *block) { - if (!block) - return; - Block *inline_block = block->GetContainingInlinedBlock(); - if (inline_block) { - if (const InlineFunctionInfo *inline_info = - inline_block->GetInlinedFunctionInfo()) { - out_stream.PutCString(" [inlined] "); - inline_info->GetName().Dump(&out_stream); - } - } -} - static VariableListSP GetFunctionVariableList(const SymbolContext &sc) { assert(sc.function); @@ -1170,22 +1157,6 @@ static VariableListSP GetFunctionVariableList(const SymbolContext &sc) { return sc.function->GetBlock(true).GetBlockVariableList(true); } -static char const *GetInlinedFunctionName(const SymbolContext &sc) { - if (!sc.block) - return nullptr; - - const Block *inline_block = sc.block->GetContainingInlinedBlock(); - if (!inline_block) - return nullptr; - - const InlineFunctionInfo *inline_info = - inline_block->GetInlinedFunctionInfo(); - if (!inline_info) - return nullptr; - - return inline_info->GetName().AsCString(nullptr); -} - static bool PrintFunctionNameWithArgs(Stream &s, const ExecutionContext *exe_ctx, const SymbolContext &sc) { @@ -1194,16 +1165,11 @@ static bool PrintFunctionNameWithArgs(Stream &s, ExecutionContextScope *exe_scope = exe_ctx ? exe_ctx->GetBestExecutionContextScope() : nullptr; - const char *cstr = sc.function->GetName().AsCString(nullptr); + const char *cstr = + sc.GetPossiblyInlinedFunctionName(Mangled::ePreferDemangled); if (!cstr) return false; - if (const char *inlined_name = GetInlinedFunctionName(sc)) { - s.PutCString(cstr); - s.PutCString(" [inlined] "); - cstr = inlined_name; - } - VariableList args; if (auto variable_list_sp = GetFunctionVariableList(sc)) variable_list_sp->AppendVariablesWithScope(eValueTypeVariableArgument, @@ -1724,21 +1690,17 @@ bool FormatEntity::Format(const Entry &entry, Stream &s, if (language_plugin_handled) { s << ss.GetString(); return true; - } else { - const char *name = nullptr; - if (sc->function) - name = sc->function->GetName().AsCString(nullptr); - else if (sc->symbol) - name = sc->symbol->GetName().AsCString(nullptr); - - if (name) { - s.PutCString(name); - FormatInlinedBlock(s, sc->block); - return true; - } } + + const char *name = GetPossiblyInlinedFunctionName( + *sc, Mangled::NamePreference::ePreferDemangled); + if (!name) + return false; + + s.PutCString(name); + + return true; } - return false; case Entry::Type::FunctionNameNoArgs: { if (!sc) @@ -1760,20 +1722,17 @@ bool FormatEntity::Format(const Entry &entry, Stream &s, if (language_plugin_handled) { s << ss.GetString(); return true; - } else { - ConstString name; - if (sc->function) - name = sc->function->GetNameNoArguments(); - else if (sc->symbol) - name = sc->symbol->GetNameNoArguments(); - if (name) { - s.PutCString(name.GetCString()); - FormatInlinedBlock(s, sc->block); - return true; - } } + + const char *name = GetPossiblyInlinedFunctionName( + *sc, Mangled::NamePreference::ePreferDemangledWithoutArguments); + if (!name) + return false; + + s.PutCString(name); + + return true; } - return false; case Entry::Type::FunctionNameWithArgs: { if (!sc) @@ -1814,19 +1773,13 @@ bool FormatEntity::Format(const Entry &entry, Stream &s, if (!sc) return false; - const char *name = nullptr; - if (sc->symbol) - name = - sc->symbol->GetMangled().GetName(Mangled::ePreferMangled).AsCString(); - else if (sc->function) - name = sc->function->GetMangled() - .GetName(Mangled::ePreferMangled) - .AsCString(); - + const char *name = GetPossiblyInlinedFunctionName( + *sc, Mangled::NamePreference::ePreferMangled); if (!name) return false; + s.PutCString(name); - FormatInlinedBlock(s, sc->block); + return true; } case Entry::Type::FunctionAddrOffset: diff --git a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp index a6fdf66f13e4d..e985c11f66e86 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp @@ -1707,22 +1707,6 @@ static VariableListSP GetFunctionVariableList(const SymbolContext &sc) { return sc.function->GetBlock(true).GetBlockVariableList(true); } -static char const *GetInlinedFunctionName(const SymbolContext &sc) { - if (!sc.block) - return nullptr; - - const Block *inline_block = sc.block->GetContainingInlinedBlock(); - if (!inline_block) - return nullptr; - - const InlineFunctionInfo *inline_info = - inline_block->GetInlinedFunctionInfo(); - if (!inline_info) - return nullptr; - - return inline_info->GetName().AsCString(nullptr); -} - static bool PrintFunctionNameWithArgs(Stream &s, const ExecutionContext *exe_ctx, const SymbolContext &sc) { @@ -1731,16 +1715,11 @@ static bool PrintFunctionNameWithArgs(Stream &s, ExecutionContextScope *exe_scope = exe_ctx ? exe_ctx->GetBestExecutionContextScope() : nullptr; - const char *cstr = sc.function->GetName().AsCString(nullptr); + const char *cstr = sc.GetPossiblyInlinedFunctionName( + Mangled::NamePreference::ePreferDemangled); if (!cstr) return false; - if (const char *inlined_name = GetInlinedFunctionName(sc)) { - s.PutCString(cstr); - s.PutCString(" [inlined] "); - cstr = inlined_name; - } - VariableList args; if (auto variable_list_sp = GetFunctionVariableList(sc)) variable_list_sp->AppendVariablesWithScope(eValueTypeVariableArgument, diff --git a/lldb/source/Symbol/SymbolContext.cpp b/lldb/source/Symbol/SymbolContext.cpp index 183947a694363..b8c7ab66c8845 100644 --- a/lldb/source/Symbol/SymbolContext.cpp +++ b/lldb/source/Symbol/SymbolContext.cpp @@ -872,6 +872,32 @@ const Symbol *SymbolContext::FindBestGlobalDataSymbol(ConstString name, return nullptr; // no error; we just didn't find anything } +char const *SymbolContext::GetPossiblyInlinedFunctionName( + Mangled::NamePreference mangling_preference) const { + const char *name = nullptr; + if (function) + name = function->GetMangled().GetName(mangling_preference).AsCString(); + else if (symbol) + name = symbol->GetMangled().GetName(mangling_preference).AsCString(); + + if (!block) + return name; + + const Block *inline_block = block->GetContainingInlinedBlock(); + if (!inline_block) + return name; + + const InlineFunctionInfo *inline_info = + inline_block->GetInlinedFunctionInfo(); + if (!inline_info) + return name; + + // If we do have an inlined frame name, return that. + return inline_info->GetMangled() + .GetName(mangling_preference) + .AsCString(nullptr); +} + // // SymbolContextSpecifier // diff --git a/lldb/test/Shell/Settings/TestFrameFormatName.test b/lldb/test/Shell/Settings/TestFrameFormatName.test index caa3242527c6e..110daceb47b40 100644 --- a/lldb/test/Shell/Settings/TestFrameFormatName.test +++ b/lldb/test/Shell/Settings/TestFrameFormatName.test @@ -30,7 +30,7 @@ c c # NAME_WITH_ARGS: frame Foo::returns_func_ptr<int>(this={{.*}}, (null)={{.*}}) c -# NAME_WITH_ARGS: frame main [inlined] inlined_foo(str="bar") +# NAME_WITH_ARGS: frame inlined_foo(str="bar") q #--- name.input @@ -38,18 +38,18 @@ q settings set -f frame-format "frame ${function.name}\n" break set -n inlined_foo run -# NAME: frame main [inlined] inlined_foo(char const*) +# NAME: frame inlined_foo(char const*) #--- name_without_args.input # RUN: %lldb -b -s %t/name_without_args.input %t.out | FileCheck %s --check-prefix=NAME_WITHOUT_ARGS settings set -f frame-format "frame ${function.name-without-args}\n" break set -n inlined_foo run -# NAME_WITHOUT_ARGS: frame main [inlined] inlined_foo(char const*) +# NAME_WITHOUT_ARGS: frame inlined_foo #--- mangled_name.input # RUN: %lldb -b -s %t/mangled_name.input %t.out | FileCheck %s --check-prefix=MANGLED_NAME settings set -f frame-format "frame ${function.mangled-name}\n" break set -n inlined_foo run -# MANGLED_NAME: frame main [inlined] inlined_foo(char const*) +# MANGLED_NAME: frame _Z11inlined_fooPKc >From 5f6ad22f9c24546c22813760b403006e280d3196 Mon Sep 17 00:00:00 2001 From: Michael Buch <michaelbuc...@gmail.com> Date: Fri, 11 Apr 2025 12:50:47 +0100 Subject: [PATCH 2/2] fixup! fix build failure --- lldb/source/Core/FormatEntity.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/lldb/source/Core/FormatEntity.cpp b/lldb/source/Core/FormatEntity.cpp index c3068a9cfaeab..33cf7794866b2 100644 --- a/lldb/source/Core/FormatEntity.cpp +++ b/lldb/source/Core/FormatEntity.cpp @@ -1692,8 +1692,8 @@ bool FormatEntity::Format(const Entry &entry, Stream &s, return true; } - const char *name = GetPossiblyInlinedFunctionName( - *sc, Mangled::NamePreference::ePreferDemangled); + const char *name = sc->GetPossiblyInlinedFunctionName( + Mangled::NamePreference::ePreferDemangled); if (!name) return false; @@ -1724,8 +1724,8 @@ bool FormatEntity::Format(const Entry &entry, Stream &s, return true; } - const char *name = GetPossiblyInlinedFunctionName( - *sc, Mangled::NamePreference::ePreferDemangledWithoutArguments); + const char *name = sc->GetPossiblyInlinedFunctionName( + Mangled::NamePreference::ePreferDemangledWithoutArguments); if (!name) return false; @@ -1773,8 +1773,8 @@ bool FormatEntity::Format(const Entry &entry, Stream &s, if (!sc) return false; - const char *name = GetPossiblyInlinedFunctionName( - *sc, Mangled::NamePreference::ePreferMangled); + const char *name = sc->GetPossiblyInlinedFunctionName( + Mangled::NamePreference::ePreferMangled); if (!name) return false; _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits