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