[Lldb-commits] [PATCH] D136761: [lldb][FormatEntity] Fix closing parenthesis for function.name-with-args frame format

Michael Buch via Phabricator via lldb-commits lldb-commits at lists.llvm.org
Wed Oct 26 05:26:52 PDT 2022


Michael137 created this revision.
Michael137 added reviewers: aprantl, labath, jingham.
Herald added a project: All.
Michael137 requested review of this revision.
Herald added a project: LLDB.
Herald added a subscriber: lldb-commits.

Previously we would try to find the closing parenthesis by doing
a forward scan through the demangled function name. However,
for arguments that contain parenthesis (e.g., function pointers)
this would leave garbage in the frame function name.

This patch addresses this by doing a reverse scan to find the closing
parenthesis.

**Example**

For following function:

  int foo(std::function<int(void)> const& func) { return 1; }

Before patch:

  frame #0: 0x000000010000151c a.out`foo(func= Function = bar() )> const&) at sample.cpp:11:49

After patch:

  frame #0: 0x000000010000151c a.out`foo(func= Function = bar() ) at sample.cpp:11:49

**Testing**

- Added shell test


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D136761

Files:
  lldb/source/Core/FormatEntity.cpp
  lldb/test/Shell/Settings/Inputs/names.cpp
  lldb/test/Shell/Settings/TestFrameFormatNameWithArgs.test


Index: lldb/test/Shell/Settings/TestFrameFormatNameWithArgs.test
===================================================================
--- /dev/null
+++ lldb/test/Shell/Settings/TestFrameFormatNameWithArgs.test
@@ -0,0 +1,13 @@
+# RUN: %clangxx_host -g -O0 %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
+run
+# CHECK: frame int foo<int ()>(t={{.*}})
+c
+# CHECK: frame int foo<std::__1::function<int ()>>(t= Function = bar() )
+c
+# CHECK: frame int foo<(anonymous namespace)::$_0>(t={{.*}})
+c
+# CHECK: frame int foo<std::__1::function<int ()>>(t= Function = (anonymous namespace)::anon_bar() )
+q
Index: lldb/test/Shell/Settings/Inputs/names.cpp
===================================================================
--- /dev/null
+++ lldb/test/Shell/Settings/Inputs/names.cpp
@@ -0,0 +1,18 @@
+#include <functional>
+
+template <typename T> int foo(T const &t) { return 0; }
+
+int bar() { return 1; }
+
+namespace {
+int anon_bar() { return 1; }
+auto anon_lambda = [](std::function<int(int (*)(int))>) mutable {};
+} // namespace
+
+int main() {
+  foo(bar);
+  foo(std::function{bar});
+  foo(anon_lambda);
+  foo(std::function{anon_bar});
+  return 0;
+}
Index: lldb/source/Core/FormatEntity.cpp
===================================================================
--- lldb/source/Core/FormatEntity.cpp
+++ lldb/source/Core/FormatEntity.cpp
@@ -1670,9 +1670,9 @@
                 open_paren =
                     strchr(open_paren + strlen("(anonymous namespace)"), '(');
                 if (open_paren)
-                  close_paren = strchr(open_paren, ')');
+                  close_paren = strrchr(open_paren, ')');
               } else
-                close_paren = strchr(open_paren, ')');
+                close_paren = strrchr(open_paren, ')');
             }
 
             if (open_paren)


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D136761.470790.patch
Type: text/x-patch
Size: 1931 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20221026/7097dd61/attachment.bin>


More information about the lldb-commits mailing list