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 <elyron...@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 <elyron...@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 <elyron...@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 <elyron...@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; } _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits