https://github.com/barsolo2000 updated https://github.com/llvm/llvm-project/pull/154809
>From f378e6a09487eca27d4741bc527c578b8fb8d161 Mon Sep 17 00:00:00 2001 From: Bar Soloveychik <bars...@fb.com> Date: Wed, 20 Aug 2025 14:54:52 -0700 Subject: [PATCH 1/9] added helper function --- .../source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp b/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp index f69358de6a288..37983cfef0a2e 100644 --- a/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp +++ b/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp @@ -2037,6 +2037,19 @@ static char FindArmAarch64MappingSymbol(const char *symbol_name) { return '\0'; } +static char FindRISCVMappingSymbol(const char *symbol_name) { + if (!symbol_name) + return '\0'; + + if (symbol_name.size() == 2 && symbol_name[0] == '$'){ + char c = symbol_name[1]; + if (c == 'd' || c == 'x'){ + return c; + } + return '\0'; + } +} + #define STO_MIPS_ISA (3 << 6) #define STO_MICROMIPS (2 << 6) #define IS_MICROMIPS(ST_OTHER) (((ST_OTHER)&STO_MIPS_ISA) == STO_MICROMIPS) >From b88812ae8e4a7647258360985721fa6b1ada0614 Mon Sep 17 00:00:00 2001 From: Bar Soloveychik <bars...@fb.com> Date: Thu, 21 Aug 2025 10:51:17 -0700 Subject: [PATCH 2/9] fixed format --- .../Plugins/ObjectFile/ELF/ObjectFileELF.cpp | 44 ++++++++++++++----- 1 file changed, 33 insertions(+), 11 deletions(-) diff --git a/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp b/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp index 37983cfef0a2e..99744b25ea66f 100644 --- a/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp +++ b/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp @@ -2041,13 +2041,12 @@ static char FindRISCVMappingSymbol(const char *symbol_name) { if (!symbol_name) return '\0'; - if (symbol_name.size() == 2 && symbol_name[0] == '$'){ - char c = symbol_name[1]; - if (c == 'd' || c == 'x'){ - return c; - } - return '\0'; + if (symbol_name[0] == '$' && + (symbol_name[1] == 'd' || symbol_name[1] == 'x') && + symbol_name[2] == '\0') { + return symbol_name[1]; } + return '\0'; } #define STO_MIPS_ISA (3 << 6) @@ -2115,11 +2114,13 @@ ObjectFileELF::ParseSymbols(Symtab *symtab, user_id_t start_id, if (!symbol_name) symbol_name = ""; + if (symbol_name[0] == '.' && symbol_name[1] == 'L') + continue; // No need to add non-section symbols that have no names if (symbol.getType() != STT_SECTION && (symbol_name == nullptr || symbol_name[0] == '\0')) continue; - + // Skipping oatdata and oatexec sections if it is requested. See details // above the definition of skip_oatdata_oatexec for the reasons. if (skip_oatdata_oatexec && (::strcmp(symbol_name, "oatdata") == 0 || @@ -2203,9 +2204,9 @@ ObjectFileELF::ParseSymbols(Symtab *symtab, user_id_t start_id, int64_t symbol_value_offset = 0; uint32_t additional_flags = 0; - + llvm::Triple::ArchType arch_machine = arch.GetMachine(); if (arch.IsValid()) { - if (arch.GetMachine() == llvm::Triple::arm) { + if (arch_machine == llvm::Triple::arm) { if (symbol.getBinding() == STB_LOCAL) { char mapping_symbol = FindArmAarch64MappingSymbol(symbol_name); if (symbol_type == eSymbolTypeCode) { @@ -2230,7 +2231,7 @@ ObjectFileELF::ParseSymbols(Symtab *symtab, user_id_t start_id, if (mapping_symbol) continue; } - } else if (arch.GetMachine() == llvm::Triple::aarch64) { + } else if (arch_machine == llvm::Triple::aarch64) { if (symbol.getBinding() == STB_LOCAL) { char mapping_symbol = FindArmAarch64MappingSymbol(symbol_name); if (symbol_type == eSymbolTypeCode) { @@ -2248,9 +2249,30 @@ ObjectFileELF::ParseSymbols(Symtab *symtab, user_id_t start_id, if (mapping_symbol) continue; } + } else if (arch_machine == llvm::Triple::riscv32 || + arch_machine == llvm::Triple::riscv64 || + arch_machine == llvm::Triple::riscv32be || + arch_machine == llvm::Triple::riscv64be) { + if (symbol.getBinding() == STB_LOCAL) { + char mapping_symbol = FindRISCVMappingSymbol(symbol_name); + if (symbol_type == eSymbolTypeCode) { + switch (mapping_symbol) { + case 'x': + // $x - marks a RISCV instruction sequence + address_class_map[symbol.st_value] = AddressClass::eCode; + break; + case 'd': + // $d - marks a RISCV data item sequence + address_class_map[symbol.st_value] = AddressClass::eData; + break; + } + } + if (mapping_symbol) + continue; + } } - if (arch.GetMachine() == llvm::Triple::arm) { + if (arch_machine == llvm::Triple::arm) { if (symbol_type == eSymbolTypeCode) { if (symbol.st_value & 1) { // Subtracting 1 from the address effectively unsets the low order >From 9262c0fe32449981dc9de5693a1ec8eed835da84 Mon Sep 17 00:00:00 2001 From: Bar Soloveychik <bars...@fb.com> Date: Thu, 21 Aug 2025 11:05:14 -0700 Subject: [PATCH 3/9] format --- lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp b/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp index 99744b25ea66f..40e38e46870bf 100644 --- a/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp +++ b/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp @@ -2120,7 +2120,6 @@ ObjectFileELF::ParseSymbols(Symtab *symtab, user_id_t start_id, if (symbol.getType() != STT_SECTION && (symbol_name == nullptr || symbol_name[0] == '\0')) continue; - // Skipping oatdata and oatexec sections if it is requested. See details // above the definition of skip_oatdata_oatexec for the reasons. if (skip_oatdata_oatexec && (::strcmp(symbol_name, "oatdata") == 0 || >From d06d40853dd38d89eb5d058da292f3174b24bce7 Mon Sep 17 00:00:00 2001 From: Bar Soloveychik <bars...@fb.com> Date: Thu, 21 Aug 2025 11:06:00 -0700 Subject: [PATCH 4/9] format --- lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp b/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp index 40e38e46870bf..cfa446d185b14 100644 --- a/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp +++ b/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp @@ -2120,6 +2120,7 @@ ObjectFileELF::ParseSymbols(Symtab *symtab, user_id_t start_id, if (symbol.getType() != STT_SECTION && (symbol_name == nullptr || symbol_name[0] == '\0')) continue; + // Skipping oatdata and oatexec sections if it is requested. See details // above the definition of skip_oatdata_oatexec for the reasons. if (skip_oatdata_oatexec && (::strcmp(symbol_name, "oatdata") == 0 || >From e6bf2f1d2809881a4d10b55f69df7969c449a3d8 Mon Sep 17 00:00:00 2001 From: Bar Soloveychik <bars...@fb.com> Date: Thu, 21 Aug 2025 14:43:45 -0700 Subject: [PATCH 5/9] added test --- .../ObjectFile/ELF/TestObjectFileELF.cpp | 75 +++++++++++++++++++ 1 file changed, 75 insertions(+) diff --git a/lldb/unittests/ObjectFile/ELF/TestObjectFileELF.cpp b/lldb/unittests/ObjectFile/ELF/TestObjectFileELF.cpp index 80abc5b80f84d..65b324363b2ef 100644 --- a/lldb/unittests/ObjectFile/ELF/TestObjectFileELF.cpp +++ b/lldb/unittests/ObjectFile/ELF/TestObjectFileELF.cpp @@ -308,3 +308,78 @@ TEST_F(ObjectFileELFTest, GetSymtab_NoSymEntryPointArmAddressClass) { auto entry_point_addr = module_sp->GetObjectFile()->GetEntryPointAddress(); ASSERT_EQ(entry_point_addr.GetAddressClass(), AddressClass::eCode); } + +TEST_F(ObjectFileELFTest, SkipsLocalMappingAndDotLSymbols) { + auto ExpectedFile = TestFile::fromYaml(R"( +--- !ELF + FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_RISCV + Flags: [ EF_RISCV_RVC, EF_RISCV_FLOAT_ABI_SINGLE ] + Entry: 0xC0A1B010 + Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + Address: 0x0000000000400180 + AddressAlign: 0x0000000000000010 + Content: 554889E5 + - Name: .data + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] + Address: 0x0000000000601000 + AddressAlign: 0x0000000000000004 + Content: 2F000000 + Symbols: + - Name: $d + Type: STT_FUNC + Section: .text + Value: 0x0000000000400180 + Size: 0x10 + Binding: STB_LOCAL + - Name: $x + Type: STT_FUNC + Section: .text + Value: 0xC0A1B010 + Size: 0x10 + Binding: STB_LOCAL + - Name: .Lfoo + Type: STT_OBJECT + Section: .data + Value: 0x0000000000601000 + Size: 0x4 + Binding: STB_LOCAL + - Name: global_func + Type: STT_FUNC + Section: .text + Value: 0x00000000004001A0 + Size: 0x10 + Binding: STB_GLOBAL + - Name: global_obj + Type: STT_OBJECT + Section: .data + Value: 0x0000000000601004 + Size: 0x4 + Binding: STB_GLOBAL +... + )"); + ASSERT_THAT_EXPECTED(ExpectedFile, llvm::Succeeded()); + auto module_sp = std::make_shared<Module>(ExpectedFile->moduleSpec()); + auto *symtab = module_sp->GetSymtab(); + ASSERT_NE(nullptr, symtab); + EXPECT_EQ(nullptr, module_sp->FindFirstSymbolWithNameAndType( + ConstString("$d"), eSymbolTypeAny)); + EXPECT_EQ(nullptr, module_sp->FindFirstSymbolWithNameAndType( + ConstString("$x"), eSymbolTypeAny)); + EXPECT_EQ(nullptr, module_sp->FindFirstSymbolWithNameAndType( + ConstString(".Lfoo"), eSymbolTypeAny)); + // assert that other symbols are present + const Symbol *global_func = module_sp->FindFirstSymbolWithNameAndType( + ConstString("global_func"), eSymbolTypeAny); + ASSERT_NE(nullptr, global_func); + const Symbol *global_obj = module_sp->FindFirstSymbolWithNameAndType( + ConstString("global_obj"), eSymbolTypeAny); + ASSERT_NE(nullptr, global_obj); +} \ No newline at end of file >From 06278827aa0ed44fb6f3f90eeabc76628e7ec587 Mon Sep 17 00:00:00 2001 From: Bar Soloveychik <bars...@fb.com> Date: Thu, 21 Aug 2025 14:47:42 -0700 Subject: [PATCH 6/9] format --- lldb/unittests/ObjectFile/ELF/TestObjectFileELF.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lldb/unittests/ObjectFile/ELF/TestObjectFileELF.cpp b/lldb/unittests/ObjectFile/ELF/TestObjectFileELF.cpp index 65b324363b2ef..9af0aeb9bab50 100644 --- a/lldb/unittests/ObjectFile/ELF/TestObjectFileELF.cpp +++ b/lldb/unittests/ObjectFile/ELF/TestObjectFileELF.cpp @@ -382,4 +382,4 @@ TEST_F(ObjectFileELFTest, SkipsLocalMappingAndDotLSymbols) { const Symbol *global_obj = module_sp->FindFirstSymbolWithNameAndType( ConstString("global_obj"), eSymbolTypeAny); ASSERT_NE(nullptr, global_obj); -} \ No newline at end of file +} >From d75bbbdd6eb004308ecaec49a45103a0a03dfb8e Mon Sep 17 00:00:00 2001 From: Bar Soloveychik <bars...@fb.com> Date: Thu, 21 Aug 2025 15:15:52 -0700 Subject: [PATCH 7/9] test_fix --- lldb/unittests/ObjectFile/ELF/TestObjectFileELF.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/lldb/unittests/ObjectFile/ELF/TestObjectFileELF.cpp b/lldb/unittests/ObjectFile/ELF/TestObjectFileELF.cpp index 9af0aeb9bab50..2e39384857195 100644 --- a/lldb/unittests/ObjectFile/ELF/TestObjectFileELF.cpp +++ b/lldb/unittests/ObjectFile/ELF/TestObjectFileELF.cpp @@ -332,10 +332,16 @@ TEST_F(ObjectFileELFTest, SkipsLocalMappingAndDotLSymbols) { Address: 0x0000000000601000 AddressAlign: 0x0000000000000004 Content: 2F000000 + - Name: .riscv.attributes + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC ] + Address: 0x0000000000610000 + AddressAlign: 0x0000000000000004 + Content: "00" Symbols: - Name: $d Type: STT_FUNC - Section: .text + Section: .riscv.attributes Value: 0x0000000000400180 Size: 0x10 Binding: STB_LOCAL >From 315266d17af95c5475c80d3dfff0a5f694d3321d Mon Sep 17 00:00:00 2001 From: Bar Soloveychik <bars...@fb.com> Date: Thu, 21 Aug 2025 15:37:52 -0700 Subject: [PATCH 8/9] fixed comments --- lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp | 4 ++++ lldb/unittests/ObjectFile/ELF/TestObjectFileELF.cpp | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp b/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp index cfa446d185b14..a984ee94397b1 100644 --- a/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp +++ b/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp @@ -2114,6 +2114,10 @@ ObjectFileELF::ParseSymbols(Symtab *symtab, user_id_t start_id, if (!symbol_name) symbol_name = ""; + // Skip local symbols starting with ".L" because these are compiler + // generated local labels used for internal purposes (e.g. debugging, + // optimization) and are not relevant for symbol resolution or external + // linkage in RISC-V binaries. if (symbol_name[0] == '.' && symbol_name[1] == 'L') continue; // No need to add non-section symbols that have no names diff --git a/lldb/unittests/ObjectFile/ELF/TestObjectFileELF.cpp b/lldb/unittests/ObjectFile/ELF/TestObjectFileELF.cpp index 2e39384857195..411387832f733 100644 --- a/lldb/unittests/ObjectFile/ELF/TestObjectFileELF.cpp +++ b/lldb/unittests/ObjectFile/ELF/TestObjectFileELF.cpp @@ -340,13 +340,13 @@ TEST_F(ObjectFileELFTest, SkipsLocalMappingAndDotLSymbols) { Content: "00" Symbols: - Name: $d - Type: STT_FUNC + Type: STT_NOTYPE Section: .riscv.attributes Value: 0x0000000000400180 Size: 0x10 Binding: STB_LOCAL - Name: $x - Type: STT_FUNC + Type: STT_NOTYPE Section: .text Value: 0xC0A1B010 Size: 0x10 >From 8b01f93e92e7220f73a33d08d09a2fecaa6ba99b Mon Sep 17 00:00:00 2001 From: Bar Soloveychik <bars...@fb.com> Date: Thu, 21 Aug 2025 15:37:52 -0700 Subject: [PATCH 9/9] fixed comments --- .../Plugins/ObjectFile/ELF/ObjectFileELF.cpp | 30 +++++++++++-------- 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp b/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp index a984ee94397b1..f63498dac7bf2 100644 --- a/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp +++ b/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp @@ -2041,13 +2041,20 @@ static char FindRISCVMappingSymbol(const char *symbol_name) { if (!symbol_name) return '\0'; - if (symbol_name[0] == '$' && - (symbol_name[1] == 'd' || symbol_name[1] == 'x') && - symbol_name[2] == '\0') { - return symbol_name[1]; + if (strcmp(symbol_name, "$d") == 0) { + return 'd'; + } + if (strcmp(symbol_name, "$x") == 0) { + return 'x'; } return '\0'; } +static bool IsRISCVArch(llvm::Triple::ArchType arch_machine) { + return arch_machine == llvm::Triple::riscv32 || + arch_machine == llvm::Triple::riscv64 || + arch_machine == llvm::Triple::riscv32be || + arch_machine == llvm::Triple::riscv64be; +} #define STO_MIPS_ISA (3 << 6) #define STO_MICROMIPS (2 << 6) @@ -2208,9 +2215,8 @@ ObjectFileELF::ParseSymbols(Symtab *symtab, user_id_t start_id, int64_t symbol_value_offset = 0; uint32_t additional_flags = 0; - llvm::Triple::ArchType arch_machine = arch.GetMachine(); if (arch.IsValid()) { - if (arch_machine == llvm::Triple::arm) { + if (arch.GetMachine() == llvm::Triple::arm) { if (symbol.getBinding() == STB_LOCAL) { char mapping_symbol = FindArmAarch64MappingSymbol(symbol_name); if (symbol_type == eSymbolTypeCode) { @@ -2235,7 +2241,7 @@ ObjectFileELF::ParseSymbols(Symtab *symtab, user_id_t start_id, if (mapping_symbol) continue; } - } else if (arch_machine == llvm::Triple::aarch64) { + } else if (arch.GetMachine() == llvm::Triple::aarch64) { if (symbol.getBinding() == STB_LOCAL) { char mapping_symbol = FindArmAarch64MappingSymbol(symbol_name); if (symbol_type == eSymbolTypeCode) { @@ -2253,13 +2259,13 @@ ObjectFileELF::ParseSymbols(Symtab *symtab, user_id_t start_id, if (mapping_symbol) continue; } - } else if (arch_machine == llvm::Triple::riscv32 || - arch_machine == llvm::Triple::riscv64 || - arch_machine == llvm::Triple::riscv32be || - arch_machine == llvm::Triple::riscv64be) { + } else if (IsRISCVArch(arch.GetMachine())) { if (symbol.getBinding() == STB_LOCAL) { char mapping_symbol = FindRISCVMappingSymbol(symbol_name); if (symbol_type == eSymbolTypeCode) { + // Only handle $d and $x mapping symbols. + // Other mapping symbols are ignored as they don't affect address + // classification. switch (mapping_symbol) { case 'x': // $x - marks a RISCV instruction sequence @@ -2276,7 +2282,7 @@ ObjectFileELF::ParseSymbols(Symtab *symtab, user_id_t start_id, } } - if (arch_machine == llvm::Triple::arm) { + if (arch.GetMachine() == llvm::Triple::arm) { if (symbol_type == eSymbolTypeCode) { if (symbol.st_value & 1) { // Subtracting 1 from the address effectively unsets the low order _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits