[Lldb-commits] [lldb] [lldb][Format] Fix missing inlined function names in frame formatting. (PR #78494)
Zequan Wu via lldb-commits
lldb-commits at lists.llvm.org
Thu Jan 18 08:06:51 PST 2024
https://github.com/ZequanWu updated https://github.com/llvm/llvm-project/pull/78494
>From dbd04f25ccb37a18b316078df7817a603f007396 Mon Sep 17 00:00:00 2001
From: Zequan Wu <zequanwu at google.com>
Date: Wed, 17 Jan 2024 14:22:01 -0500
Subject: [PATCH 1/3] [lldb][Format] Fix missing inlined function names in
frame formatting.
---
lldb/source/Core/FormatEntity.cpp | 29 +++++++---
.../Language/CPlusPlus/CPlusPlusLanguage.cpp | 2 +-
lldb/test/Shell/Settings/Inputs/names.cpp | 8 ++-
.../Shell/Settings/TestFrameFormatName.test | 55 +++++++++++++++++++
.../Settings/TestFrameFormatNameWithArgs.test | 26 ---------
5 files changed, 85 insertions(+), 35 deletions(-)
create mode 100644 lldb/test/Shell/Settings/TestFrameFormatName.test
delete mode 100644 lldb/test/Shell/Settings/TestFrameFormatNameWithArgs.test
diff --git a/lldb/source/Core/FormatEntity.cpp b/lldb/source/Core/FormatEntity.cpp
index 94986457552d94..d5adcb9d863f33 100644
--- a/lldb/source/Core/FormatEntity.cpp
+++ b/lldb/source/Core/FormatEntity.cpp
@@ -1597,7 +1597,7 @@ bool FormatEntity::Format(const Entry &entry, Stream &s,
Block *inline_block = sc->block->GetContainingInlinedBlock();
if (inline_block) {
const InlineFunctionInfo *inline_info =
- sc->block->GetInlinedFunctionInfo();
+ inline_block->GetInlinedFunctionInfo();
if (inline_info) {
s.PutCString(" [inlined] ");
inline_info->GetName().Dump(&s);
@@ -1638,6 +1638,17 @@ bool FormatEntity::Format(const Entry &entry, Stream &s,
name = sc->symbol->GetNameNoArguments();
if (name) {
s.PutCString(name.GetCString());
+ if (sc->block) {
+ Block *inline_block = sc->block->GetContainingInlinedBlock();
+ if (inline_block) {
+ const InlineFunctionInfo *inline_info =
+ inline_block->GetInlinedFunctionInfo();
+ if (inline_info) {
+ s.PutCString(" [inlined] ");
+ inline_info->GetName().Dump(&s);
+ }
+ }
+ }
return true;
}
}
@@ -1678,7 +1689,7 @@ bool FormatEntity::Format(const Entry &entry, Stream &s,
if (inline_block) {
get_function_vars = false;
- inline_info = sc->block->GetInlinedFunctionInfo();
+ inline_info = inline_block->GetInlinedFunctionInfo();
if (inline_info)
variable_list_sp = inline_block->GetBlockVariableList(true);
}
@@ -1734,11 +1745,15 @@ bool FormatEntity::Format(const Entry &entry, Stream &s,
return false;
s.PutCString(name);
- if (sc->block && sc->block->GetContainingInlinedBlock()) {
- if (const InlineFunctionInfo *inline_info =
- sc->block->GetInlinedFunctionInfo()) {
- s.PutCString(" [inlined] ");
- inline_info->GetName().Dump(&s);
+ if (sc->block) {
+ Block *inline_block = sc->block->GetContainingInlinedBlock();
+ if (inline_block) {
+ const InlineFunctionInfo *inline_info =
+ inline_block->GetInlinedFunctionInfo();
+ if (inline_info) {
+ s.PutCString(" [inlined] ");
+ inline_info->GetName().Dump(&s);
+ }
}
}
return true;
diff --git a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp
index 7131ccb9d05eca..21c73e6361904e 100644
--- a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp
+++ b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp
@@ -1646,7 +1646,7 @@ bool CPlusPlusLanguage::GetFunctionDisplayName(
if (inline_block) {
get_function_vars = false;
- inline_info = sc->block->GetInlinedFunctionInfo();
+ inline_info = inline_block->GetInlinedFunctionInfo();
if (inline_info)
variable_list_sp = inline_block->GetBlockVariableList(true);
}
diff --git a/lldb/test/Shell/Settings/Inputs/names.cpp b/lldb/test/Shell/Settings/Inputs/names.cpp
index cf6982abb8f354..79ff93be6b76ed 100644
--- a/lldb/test/Shell/Settings/Inputs/names.cpp
+++ b/lldb/test/Shell/Settings/Inputs/names.cpp
@@ -26,6 +26,12 @@ int anon_bar() { return 1; }
auto anon_lambda = [] {};
} // namespace
+__attribute__((always_inline)) int inlined_foo(const char *str) {
+ if (bool b = bar())
+ return 1;
+ return 2;
+}
+
int main() {
ns::foo<decltype(bar)>(bar);
ns::foo<decltype(bar)>("bar");
@@ -37,6 +43,6 @@ int main() {
f.foo(anon_bar);
f.operator<< <(2 > 1)>(0);
f.returns_func_ptr<int>(detail::Quux<int>{});
-
+ inlined_foo("bar");
return 0;
}
diff --git a/lldb/test/Shell/Settings/TestFrameFormatName.test b/lldb/test/Shell/Settings/TestFrameFormatName.test
new file mode 100644
index 00000000000000..caa3242527c6ef
--- /dev/null
+++ b/lldb/test/Shell/Settings/TestFrameFormatName.test
@@ -0,0 +1,55 @@
+# UNSUPPORTED: system-windows
+# Test different name formats.
+
+# RUN: %build %S/Inputs/names.cpp --std c++17 -o %t.out
+# RUN: split-file %s %t
+
+#--- name_with_args.input
+# RUN: %lldb -b -s %t/name_with_args.input %t.out | FileCheck %s --check-prefix=NAME_WITH_ARGS
+settings set -f frame-format "frame ${function.name-with-args}\n"
+break set -n foo
+break set -n operator<<
+break set -n returns_func_ptr
+break set -n inlined_foo
+run
+# NAME_WITH_ARGS: frame int ns::foo<int ()>(t={{.*}})
+c
+# NAME_WITH_ARGS: frame int ns::foo<int ()>(str="bar")
+c
+# NAME_WITH_ARGS: frame int ns::foo<(anonymous namespace)::$_0>(t=(anonymous namespace)::(unnamed class) @ {{.*}})
+c
+# NAME_WITH_ARGS: frame int ns::foo<int (*)()>(t=({{.*}}`(anonymous namespace)::anon_bar() at {{.*}}))
+c
+# NAME_WITH_ARGS: frame int ns::foo<void (Foo::*)(int (*)(int)) const noexcept>(str="method")
+c
+# NAME_WITH_ARGS: frame ns::returns_func_ptr<int>((null)={{.*}})
+c
+# NAME_WITH_ARGS: frame void Foo::foo<int (*)()>(this={{.*}}, arg=({{.*}}`(anonymous namespace)::anon_bar() at {{.*}}))
+c
+# NAME_WITH_ARGS: frame void Foo::operator<<<1>(this={{.*}}, (null)=0)
+c
+# NAME_WITH_ARGS: frame Foo::returns_func_ptr<int>(this={{.*}}, (null)={{.*}})
+c
+# NAME_WITH_ARGS: frame main [inlined] inlined_foo(str="bar")
+q
+
+#--- name.input
+# RUN: %lldb -b -s %t/name.input %t.out | FileCheck %s --check-prefix=NAME
+settings set -f frame-format "frame ${function.name}\n"
+break set -n inlined_foo
+run
+# NAME: frame main [inlined] 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*)
+
+#--- 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*)
diff --git a/lldb/test/Shell/Settings/TestFrameFormatNameWithArgs.test b/lldb/test/Shell/Settings/TestFrameFormatNameWithArgs.test
deleted file mode 100644
index eeb46cfd6bf9d6..00000000000000
--- a/lldb/test/Shell/Settings/TestFrameFormatNameWithArgs.test
+++ /dev/null
@@ -1,26 +0,0 @@
-# UNSUPPORTED: system-windows
-# RUN: %build %S/Inputs/names.cpp --std c++17 -o %t.out
-# RUN: %lldb -b -s %s %t.out | FileCheck %s
-settings set -f frame-format "frame ${function.name-with-args}\n"
-break set -n foo
-break set -n operator<<
-break set -n returns_func_ptr
-run
-# CHECK: frame int ns::foo<int ()>(t={{.*}})
-c
-# CHECK: frame int ns::foo<int ()>(str="bar")
-c
-# CHECK: frame int ns::foo<(anonymous namespace)::$_0>(t=(anonymous namespace)::(unnamed class) @ {{.*}})
-c
-# CHECK: frame int ns::foo<int (*)()>(t=({{.*}}`(anonymous namespace)::anon_bar() at {{.*}}))
-c
-# CHECK: frame int ns::foo<void (Foo::*)(int (*)(int)) const noexcept>(str="method")
-c
-# CHECK: frame ns::returns_func_ptr<int>((null)={{.*}})
-c
-# CHECK: frame void Foo::foo<int (*)()>(this={{.*}}, arg=({{.*}}`(anonymous namespace)::anon_bar() at {{.*}}))
-c
-# CHECK: frame void Foo::operator<<<1>(this={{.*}}, (null)=0)
-c
-# CHECK: frame Foo::returns_func_ptr<int>(this={{.*}}, (null)={{.*}})
-q
>From c47a0d524eb24b2609864829c17de9835ba9cfd3 Mon Sep 17 00:00:00 2001
From: Zequan Wu <zequanwu at google.com>
Date: Wed, 17 Jan 2024 14:38:17 -0500
Subject: [PATCH 2/3] [lldb][NFC] Refactor common logic for formatting inlined
blocks.
---
lldb/source/Core/FormatEntity.cpp | 52 ++++++++++---------------------
1 file changed, 17 insertions(+), 35 deletions(-)
diff --git a/lldb/source/Core/FormatEntity.cpp b/lldb/source/Core/FormatEntity.cpp
index d5adcb9d863f33..b7fb1e06e75b9e 100644
--- a/lldb/source/Core/FormatEntity.cpp
+++ b/lldb/source/Core/FormatEntity.cpp
@@ -1093,6 +1093,20 @@ 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) {
+ const InlineFunctionInfo *inline_info =
+ inline_block->GetInlinedFunctionInfo();
+ if (inline_info) {
+ out_stream.PutCString(" [inlined] ");
+ inline_info->GetName().Dump(&out_stream);
+ }
+ }
+}
+
bool FormatEntity::FormatStringRef(const llvm::StringRef &format_str, Stream &s,
const SymbolContext *sc,
const ExecutionContext *exe_ctx,
@@ -1592,18 +1606,7 @@ bool FormatEntity::Format(const Entry &entry, Stream &s,
if (name) {
s.PutCString(name);
-
- if (sc->block) {
- Block *inline_block = sc->block->GetContainingInlinedBlock();
- if (inline_block) {
- const InlineFunctionInfo *inline_info =
- inline_block->GetInlinedFunctionInfo();
- if (inline_info) {
- s.PutCString(" [inlined] ");
- inline_info->GetName().Dump(&s);
- }
- }
- }
+ FormatInlinedBlock(s, sc->block);
return true;
}
}
@@ -1638,17 +1641,7 @@ bool FormatEntity::Format(const Entry &entry, Stream &s,
name = sc->symbol->GetNameNoArguments();
if (name) {
s.PutCString(name.GetCString());
- if (sc->block) {
- Block *inline_block = sc->block->GetContainingInlinedBlock();
- if (inline_block) {
- const InlineFunctionInfo *inline_info =
- inline_block->GetInlinedFunctionInfo();
- if (inline_info) {
- s.PutCString(" [inlined] ");
- inline_info->GetName().Dump(&s);
- }
- }
- }
+ FormatInlinedBlock(s, sc->block);
return true;
}
}
@@ -1744,18 +1737,7 @@ bool FormatEntity::Format(const Entry &entry, Stream &s,
if (!name)
return false;
s.PutCString(name);
-
- if (sc->block) {
- Block *inline_block = sc->block->GetContainingInlinedBlock();
- if (inline_block) {
- const InlineFunctionInfo *inline_info =
- inline_block->GetInlinedFunctionInfo();
- if (inline_info) {
- s.PutCString(" [inlined] ");
- inline_info->GetName().Dump(&s);
- }
- }
- }
+ FormatInlinedBlock(s, sc->block);
return true;
}
case Entry::Type::FunctionAddrOffset:
>From 4fcca7d30ebd85762a1c4e4300db4c93f4773d47 Mon Sep 17 00:00:00 2001
From: Zequan Wu <zequanwu at google.com>
Date: Thu, 18 Jan 2024 11:06:36 -0500
Subject: [PATCH 3/3] address comment
---
lldb/source/Core/FormatEntity.cpp | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/lldb/source/Core/FormatEntity.cpp b/lldb/source/Core/FormatEntity.cpp
index b7fb1e06e75b9e..3c665c2eb2133b 100644
--- a/lldb/source/Core/FormatEntity.cpp
+++ b/lldb/source/Core/FormatEntity.cpp
@@ -1098,9 +1098,8 @@ static void FormatInlinedBlock(Stream &out_stream, Block *block) {
return;
Block *inline_block = block->GetContainingInlinedBlock();
if (inline_block) {
- const InlineFunctionInfo *inline_info =
- inline_block->GetInlinedFunctionInfo();
- if (inline_info) {
+ if (const InlineFunctionInfo *inline_info =
+ inline_block->GetInlinedFunctionInfo()) {
out_stream.PutCString(" [inlined] ");
inline_info->GetName().Dump(&out_stream);
}
More information about the lldb-commits
mailing list