[Lldb-commits] [lldb] [lldb] Change synthetic symbol names to have file address (PR #138416)
Ely Ronnen via lldb-commits
lldb-commits at lists.llvm.org
Sat May 3 10:17:06 PDT 2025
https://github.com/eronnen updated https://github.com/llvm/llvm-project/pull/138416
>From 3ec9e1962940799ab291aaa8455e6f76da02af0f Mon Sep 17 00:00:00 2001
From: Ely Ronnen <elyronnen at gmail.com>
Date: Sun, 27 Apr 2025 13:48:45 +0200
Subject: [PATCH 1/4] Change ___lldb_unnamed_symbol generated names to have the
file address
---
lldb/source/Symbol/Symbol.cpp | 4 +++-
lldb/test/Shell/ObjectFile/ELF/eh_frame-symbols.yaml | 4 ++--
.../test/Shell/SymbolFile/Breakpad/symtab-sorted-by-size.test | 2 +-
lldb/test/Shell/SymbolFile/Breakpad/symtab.test | 2 +-
4 files changed, 7 insertions(+), 5 deletions(-)
diff --git a/lldb/source/Symbol/Symbol.cpp b/lldb/source/Symbol/Symbol.cpp
index 4828de4fdfa37..da74707c75e13 100644
--- a/lldb/source/Symbol/Symbol.cpp
+++ b/lldb/source/Symbol/Symbol.cpp
@@ -639,7 +639,9 @@ void Symbol::SynthesizeNameIfNeeded() const {
// breakpoints on them.
llvm::SmallString<256> name;
llvm::raw_svector_ostream os(name);
- os << GetSyntheticSymbolPrefix() << GetID();
+ os << GetSyntheticSymbolPrefix() << "_"
+ << llvm::format_hex_no_prefix(
+ m_addr_range.GetBaseAddress().GetFileAddress(), 0);
m_mangled.SetDemangledName(ConstString(os.str()));
}
}
diff --git a/lldb/test/Shell/ObjectFile/ELF/eh_frame-symbols.yaml b/lldb/test/Shell/ObjectFile/ELF/eh_frame-symbols.yaml
index 0dcc9fb76bd4f..709c37e79d878 100644
--- a/lldb/test/Shell/ObjectFile/ELF/eh_frame-symbols.yaml
+++ b/lldb/test/Shell/ObjectFile/ELF/eh_frame-symbols.yaml
@@ -3,8 +3,8 @@
# CHECK: Index UserID DSX Type File Address/Value Load Address Size Flags Name
# CHECK: [ 0] 1 SourceFile 0x0000000000000000 0x0000000000000000 0x00000004 -
-# CHECK: [ 1] 2 SX Code 0x0000000000201180 0x0000000000000010 0x00000000 ___lldb_unnamed_symbol{{[0-9]*}}
-# CHECK: [ 2] 3 SX Code 0x0000000000201190 0x0000000000000006 0x00000000 ___lldb_unnamed_symbol{{[0-9]*}}
+# CHECK: [ 1] 2 SX Code 0x0000000000201180 0x0000000000000010 0x00000000 ___lldb_unnamed_symbol_{{[0-9a-f]*}}
+# CHECK: [ 2] 3 SX Code 0x0000000000201190 0x0000000000000006 0x00000000 ___lldb_unnamed_symbol_{{[0-9a-f]*}}
--- !ELF
FileHeader:
diff --git a/lldb/test/Shell/SymbolFile/Breakpad/symtab-sorted-by-size.test b/lldb/test/Shell/SymbolFile/Breakpad/symtab-sorted-by-size.test
index 98052ea20bedd..00e04eb39a98e 100644
--- a/lldb/test/Shell/SymbolFile/Breakpad/symtab-sorted-by-size.test
+++ b/lldb/test/Shell/SymbolFile/Breakpad/symtab-sorted-by-size.test
@@ -3,7 +3,7 @@
# RUN: -s %s | FileCheck %s
# CHECK: num_symbols = 4 (sorted by size):
-# CHECK: [ 0] 0 SX Code 0x0000000000400000 0x00000000000000b0 0x00000000 ___lldb_unnamed_symbol0
+# CHECK: [ 0] 0 SX Code 0x0000000000400000 0x00000000000000b0 0x00000000 ___lldb_unnamed_symbol_400000
# CHECK: [ 1] 0 X Code 0x00000000004000d0 0x0000000000000022 0x00000000 _start
# CHECK: [ 2] 0 X Code 0x00000000004000b0 0x0000000000000010 0x00000000 f1
# CHECK: [ 3] 0 X Code 0x00000000004000c0 0x0000000000000010 0x00000000 f2
diff --git a/lldb/test/Shell/SymbolFile/Breakpad/symtab.test b/lldb/test/Shell/SymbolFile/Breakpad/symtab.test
index ef41bb3bea955..a32eb5808426f 100644
--- a/lldb/test/Shell/SymbolFile/Breakpad/symtab.test
+++ b/lldb/test/Shell/SymbolFile/Breakpad/symtab.test
@@ -5,7 +5,7 @@
# CHECK-LABEL: (lldb) image dump symtab symtab.out
# CHECK: Symtab, file = {{.*}}symtab.out, num_symbols = 4:
# CHECK: Index UserID DSX Type File Address/Value Load Address Size Flags Name
-# CHECK: [ 0] 0 SX Code 0x0000000000400000 0x00000000000000b0 0x00000000 ___lldb_unnamed_symbol{{[0-9]*}}
+# CHECK: [ 0] 0 SX Code 0x0000000000400000 0x00000000000000b0 0x00000000 ___lldb_unnamed_symbol_{{[0-9a-f]*}}
# CHECK: [ 1] 0 X Code 0x00000000004000b0 0x0000000000000010 0x00000000 f1
# CHECK: [ 2] 0 X Code 0x00000000004000c0 0x0000000000000010 0x00000000 f2
# CHECK: [ 3] 0 X Code 0x00000000004000d0 0x0000000000000022 0x00000000 _start
>From 3798aff067f8facbb386a3b3282975b23680447f Mon Sep 17 00:00:00 2001
From: Ely Ronnen <elyronnen at gmail.com>
Date: Sat, 3 May 2025 18:55:50 +0200
Subject: [PATCH 2/4] add test for looking up unnamed symbols
---
.../python_api/unnamed_symbol_lookup/Makefile | 12 ++++++
.../TestUnnamedSymbolLookup.py | 40 +++++++++++++++++++
.../python_api/unnamed_symbol_lookup/main.c | 10 +++++
3 files changed, 62 insertions(+)
create mode 100644 lldb/test/API/python_api/unnamed_symbol_lookup/Makefile
create mode 100644 lldb/test/API/python_api/unnamed_symbol_lookup/TestUnnamedSymbolLookup.py
create mode 100644 lldb/test/API/python_api/unnamed_symbol_lookup/main.c
diff --git a/lldb/test/API/python_api/unnamed_symbol_lookup/Makefile b/lldb/test/API/python_api/unnamed_symbol_lookup/Makefile
new file mode 100644
index 0000000000000..9ba76898b61ba
--- /dev/null
+++ b/lldb/test/API/python_api/unnamed_symbol_lookup/Makefile
@@ -0,0 +1,12 @@
+C_SOURCES := main.c
+
+include Makefile.rules
+
+all: a.out.stripped
+
+a.out.stripped:
+ $(STRIP) --keep-symbol=main -o a.out.stripped a.out
+
+ifneq "$(CODESIGN)" ""
+ $(CODESIGN) -fs - a.out.stripped
+endif
diff --git a/lldb/test/API/python_api/unnamed_symbol_lookup/TestUnnamedSymbolLookup.py b/lldb/test/API/python_api/unnamed_symbol_lookup/TestUnnamedSymbolLookup.py
new file mode 100644
index 0000000000000..09d43a34c7e30
--- /dev/null
+++ b/lldb/test/API/python_api/unnamed_symbol_lookup/TestUnnamedSymbolLookup.py
@@ -0,0 +1,40 @@
+"""
+Test lookup unnamed symbols.
+"""
+
+
+import lldb
+from lldbsuite.test.decorators import *
+from lldbsuite.test.lldbtest import *
+from lldbsuite.test import lldbutil
+
+
+class TestUnnamedSymbolLookup(TestBase):
+ def test_unnamed_symbol_lookup(self):
+ """Test looking up unnamed symbol synthetic name"""
+ self.build()
+ (target, process, thread, bkpt) = lldbutil.run_to_name_breakpoint(
+ self, "main", exe_name="a.out.stripped"
+ )
+
+ main_frame = thread.GetFrameAtIndex(0)
+
+ # Step until reaching the unnamed symbol called from main
+ for _ in range(100):
+ thread.StepInto()
+ if thread.GetFrameAtIndex(0) != main_frame:
+ break
+
+ thread.StepInto()
+
+ self.assertEqual(
+ main_frame, thread.GetFrameAtIndex(1), "Expected to be called from main"
+ )
+ symbol = thread.GetFrameAtIndex(0).GetSymbol()
+ self.assertIsNotNone(symbol, "unnamed symbol called from main not reached")
+ self.assertTrue(symbol.name.startswith("___lldb_unnamed_symbol"))
+
+ exe_module = symbol.GetStartAddress().GetModule()
+ found_symbols = exe_module.FindSymbols(symbol.name)
+ self.assertIsNotNone(found_symbols)
+ self.assertEqual(found_symbols.GetSize(), 1)
diff --git a/lldb/test/API/python_api/unnamed_symbol_lookup/main.c b/lldb/test/API/python_api/unnamed_symbol_lookup/main.c
new file mode 100644
index 0000000000000..1c9ce8e0e6697
--- /dev/null
+++ b/lldb/test/API/python_api/unnamed_symbol_lookup/main.c
@@ -0,0 +1,10 @@
+__attribute__((nodebug)) int stripped_function(int val)
+{
+ return val * val;
+}
+
+int main (void)
+{
+ stripped_function(10);
+ return 0;
+}
>From 1ef05ed18e225388019d6008934f8d51fb8012bc Mon Sep 17 00:00:00 2001
From: Ely Ronnen <elyronnen at gmail.com>
Date: Sat, 3 May 2025 19:09:46 +0200
Subject: [PATCH 3/4] correctly finding unnamed symbols in symbol table with
file address
---
lldb/include/lldb/Symbol/Symbol.h | 2 +-
lldb/source/Symbol/Symbol.cpp | 2 +-
lldb/source/Symbol/Symtab.cpp | 11 ++++++-----
3 files changed, 8 insertions(+), 7 deletions(-)
diff --git a/lldb/include/lldb/Symbol/Symbol.h b/lldb/include/lldb/Symbol/Symbol.h
index e05c845a69f3e..688c8a5931feb 100644
--- a/lldb/include/lldb/Symbol/Symbol.h
+++ b/lldb/include/lldb/Symbol/Symbol.h
@@ -258,7 +258,7 @@ class Symbol : public SymbolContextScope {
bool ContainsFileAddress(lldb::addr_t file_addr) const;
static llvm::StringRef GetSyntheticSymbolPrefix() {
- return "___lldb_unnamed_symbol";
+ return "___lldb_unnamed_symbol_";
}
/// Decode a serialized version of this object from data.
diff --git a/lldb/source/Symbol/Symbol.cpp b/lldb/source/Symbol/Symbol.cpp
index da74707c75e13..d6689a647062a 100644
--- a/lldb/source/Symbol/Symbol.cpp
+++ b/lldb/source/Symbol/Symbol.cpp
@@ -639,7 +639,7 @@ void Symbol::SynthesizeNameIfNeeded() const {
// breakpoints on them.
llvm::SmallString<256> name;
llvm::raw_svector_ostream os(name);
- os << GetSyntheticSymbolPrefix() << "_"
+ os << GetSyntheticSymbolPrefix()
<< llvm::format_hex_no_prefix(
m_addr_range.GetBaseAddress().GetFileAddress(), 0);
m_mangled.SetDemangledName(ConstString(os.str()));
diff --git a/lldb/source/Symbol/Symtab.cpp b/lldb/source/Symbol/Symtab.cpp
index 9aee5d3e813d8..52545f22322d2 100644
--- a/lldb/source/Symbol/Symtab.cpp
+++ b/lldb/source/Symbol/Symtab.cpp
@@ -654,7 +654,7 @@ uint32_t Symtab::GetNameIndexes(ConstString symbol_name,
if (count)
return count;
// Synthetic symbol names are not added to the name indexes, but they start
- // with a prefix and end with a the symbol UserID. This allows users to find
+ // with a prefix and end with the symbol file address. This allows users to find
// these symbols without having to add them to the name indexes. These
// queries will not happen very often since the names don't mean anything, so
// performance is not paramount in this case.
@@ -663,11 +663,12 @@ uint32_t Symtab::GetNameIndexes(ConstString symbol_name,
if (!name.consume_front(Symbol::GetSyntheticSymbolPrefix()))
return 0; // Not a synthetic symbol name
- // Extract the user ID from the symbol name
- unsigned long long uid = 0;
- if (getAsUnsignedInteger(name, /*Radix=*/10, uid))
+ // Extract the file address from the symbol name
+ unsigned long long file_address = 0;
+ if (getAsUnsignedInteger(name, /*Radix=*/16, file_address))
return 0; // Failed to extract the user ID as an integer
- Symbol *symbol = FindSymbolByID(uid);
+
+ Symbol *symbol = FindSymbolAtFileAddress(static_cast<addr_t>(file_address));
if (symbol == nullptr)
return 0;
const uint32_t symbol_idx = GetIndexForSymbol(symbol);
>From 2b233f3bc71253b9adb3329243a7a0575cf11083 Mon Sep 17 00:00:00 2001
From: Ely Ronnen <elyronnen at gmail.com>
Date: Sat, 3 May 2025 19:16:52 +0200
Subject: [PATCH 4/4] format
---
lldb/source/Symbol/Symtab.cpp | 4 ++--
lldb/test/API/python_api/unnamed_symbol_lookup/main.c | 8 ++------
2 files changed, 4 insertions(+), 8 deletions(-)
diff --git a/lldb/source/Symbol/Symtab.cpp b/lldb/source/Symbol/Symtab.cpp
index 52545f22322d2..9a3e8476fa356 100644
--- a/lldb/source/Symbol/Symtab.cpp
+++ b/lldb/source/Symbol/Symtab.cpp
@@ -654,8 +654,8 @@ uint32_t Symtab::GetNameIndexes(ConstString symbol_name,
if (count)
return count;
// Synthetic symbol names are not added to the name indexes, but they start
- // with a prefix and end with the symbol file address. This allows users to find
- // these symbols without having to add them to the name indexes. These
+ // with a prefix and end with the symbol file address. This allows users to
+ // find these symbols without having to add them to the name indexes. These
// queries will not happen very often since the names don't mean anything, so
// performance is not paramount in this case.
llvm::StringRef name = symbol_name.GetStringRef();
diff --git a/lldb/test/API/python_api/unnamed_symbol_lookup/main.c b/lldb/test/API/python_api/unnamed_symbol_lookup/main.c
index 1c9ce8e0e6697..ec8350706b3c9 100644
--- a/lldb/test/API/python_api/unnamed_symbol_lookup/main.c
+++ b/lldb/test/API/python_api/unnamed_symbol_lookup/main.c
@@ -1,10 +1,6 @@
-__attribute__((nodebug)) int stripped_function(int val)
-{
- return val * val;
-}
+__attribute__((nodebug)) int stripped_function(int val) { return val * val; }
-int main (void)
-{
+int main(void) {
stripped_function(10);
return 0;
}
More information about the lldb-commits
mailing list