https://github.com/DhruvSrivastavaX updated https://github.com/llvm/llvm-project/pull/141577
>From a62cd7b510f3cf74ee356a95a26e0f9922f4b39c Mon Sep 17 00:00:00 2001 From: DhruvSrivastavaX <dhruv.srivast...@ibm.com> Date: Tue, 27 May 2025 05:44:55 -0500 Subject: [PATCH 1/3] Added XCOFF ParseSymtab handling --- .../ObjectFile/XCOFF/ObjectFileXCOFF.cpp | 66 ++++++++++++++++++- 1 file changed, 65 insertions(+), 1 deletion(-) diff --git a/lldb/source/Plugins/ObjectFile/XCOFF/ObjectFileXCOFF.cpp b/lldb/source/Plugins/ObjectFile/XCOFF/ObjectFileXCOFF.cpp index e629355cd40b9..7dfe6c362add4 100644 --- a/lldb/source/Plugins/ObjectFile/XCOFF/ObjectFileXCOFF.cpp +++ b/lldb/source/Plugins/ObjectFile/XCOFF/ObjectFileXCOFF.cpp @@ -188,7 +188,71 @@ AddressClass ObjectFileXCOFF::GetAddressClass(addr_t file_addr) { return AddressClass::eUnknown; } -void ObjectFileXCOFF::ParseSymtab(Symtab &lldb_symtab) {} +lldb::SymbolType MapSymbolType(llvm::object::SymbolRef::Type sym_type) { + if (sym_type == llvm::object::SymbolRef::ST_Function) + return lldb::eSymbolTypeCode; + else if (sym_type == llvm::object::SymbolRef::ST_Data) + return lldb::eSymbolTypeData; + else if (sym_type == llvm::object::SymbolRef::ST_File) + return lldb::eSymbolTypeSourceFile; + return lldb::eSymbolTypeInvalid; +} + +void ObjectFileXCOFF::ParseSymtab(Symtab &lldb_symtab) { + SectionList *sectionList = GetSectionList(); + + for (const auto &symbol_ref : m_binary->symbols()) { + llvm::object::XCOFFSymbolRef xcoff_sym_ref(symbol_ref); + llvm::Expected<llvm::StringRef> name_or_err = xcoff_sym_ref.getName(); + if (!name_or_err) { + consumeError(name_or_err.takeError()); + continue; + } + llvm::StringRef symbolName = name_or_err.get(); + // Remove the dot prefix for demangle + llvm::StringRef symbol_name = + symbolName.starts_with(".") ? symbolName.drop_front() : symbolName; + auto storageClass = xcoff_sym_ref.getStorageClass(); + if (storageClass == XCOFF::C_HIDEXT && symbolName != "TOC") { + if (xcoff_sym_ref.getNumberOfAuxEntries() != 1) + continue; + auto aux_csect_or_err = xcoff_sym_ref.getXCOFFCsectAuxRef(); + if (!aux_csect_or_err) { + consumeError(aux_csect_or_err.takeError()); + continue; + } + const llvm::object::XCOFFCsectAuxRef csect_aux = aux_csect_or_err.get(); + if (csect_aux.getStorageMappingClass() != XCOFF::XMC_PR || + (m_binary->is64Bit() ? (csect_aux.getAuxType64() != XCOFF::AUX_CSECT) + : false)) + continue; + } + + Symbol symbol; + symbol.GetMangled().SetValue(ConstString(symbol_name)); + + int16_t sectionNumber = xcoff_sym_ref.getSectionNumber(); + size_t sectionIndex = static_cast<size_t>(sectionNumber - 1); + if (sectionNumber > 0 && sectionIndex < sectionList->GetSize()) { + lldb::SectionSP section_sp = + sectionList->GetSectionAtIndex(sectionNumber - 1); + if (!section_sp || section_sp->GetFileAddress() == LLDB_INVALID_ADDRESS) + continue; + lldb::addr_t file_addr = section_sp->GetFileAddress(); + lldb::addr_t symbolValue = xcoff_sym_ref.getValue(); + if (symbolValue < file_addr) + continue; + symbol.GetAddressRef() = Address(section_sp, symbolValue - file_addr); + } + + Expected<llvm::object::SymbolRef::Type> sym_type_or_err = + symbol_ref.getType(); + symbol.SetType(MapSymbolType(sym_type_or_err.get())); + printf("%s %d\n", symbol.GetName(), *sym_type_or_err); + + lldb_symtab.AddSymbol(symbol); + } +} bool ObjectFileXCOFF::IsStripped() { return false; } >From 21f5a39976457589e2ab9666820c08331aaf4542 Mon Sep 17 00:00:00 2001 From: Dhruv Srivastava <dhruv.srivast...@ibm.com> Date: Tue, 27 May 2025 16:33:08 +0530 Subject: [PATCH 2/3] cleanup --- lldb/source/Plugins/ObjectFile/XCOFF/ObjectFileXCOFF.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lldb/source/Plugins/ObjectFile/XCOFF/ObjectFileXCOFF.cpp b/lldb/source/Plugins/ObjectFile/XCOFF/ObjectFileXCOFF.cpp index 7dfe6c362add4..1e84b86cd6f0a 100644 --- a/lldb/source/Plugins/ObjectFile/XCOFF/ObjectFileXCOFF.cpp +++ b/lldb/source/Plugins/ObjectFile/XCOFF/ObjectFileXCOFF.cpp @@ -247,8 +247,11 @@ void ObjectFileXCOFF::ParseSymtab(Symtab &lldb_symtab) { Expected<llvm::object::SymbolRef::Type> sym_type_or_err = symbol_ref.getType(); + if (!sym_type_or_err) { + consumeError(sym_type_or_err.takeError()); + continue; + } symbol.SetType(MapSymbolType(sym_type_or_err.get())); - printf("%s %d\n", symbol.GetName(), *sym_type_or_err); lldb_symtab.AddSymbol(symbol); } >From 4d631899cd3ab96ea3819e1ece3ce2851d1f9f6c Mon Sep 17 00:00:00 2001 From: DhruvSrivastavaX <dhruv.srivast...@ibm.com> Date: Thu, 29 May 2025 07:37:23 -0500 Subject: [PATCH 3/3] Addressed comments --- .../ObjectFile/XCOFF/ObjectFileXCOFF.cpp | 27 ++++++++++++------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/lldb/source/Plugins/ObjectFile/XCOFF/ObjectFileXCOFF.cpp b/lldb/source/Plugins/ObjectFile/XCOFF/ObjectFileXCOFF.cpp index 1e84b86cd6f0a..953d72293c81d 100644 --- a/lldb/source/Plugins/ObjectFile/XCOFF/ObjectFileXCOFF.cpp +++ b/lldb/source/Plugins/ObjectFile/XCOFF/ObjectFileXCOFF.cpp @@ -205,31 +205,39 @@ void ObjectFileXCOFF::ParseSymtab(Symtab &lldb_symtab) { llvm::object::XCOFFSymbolRef xcoff_sym_ref(symbol_ref); llvm::Expected<llvm::StringRef> name_or_err = xcoff_sym_ref.getName(); if (!name_or_err) { - consumeError(name_or_err.takeError()); + LLDB_LOG_ERROR(log, name_or_err.takeError(), + "Unable to extract name from the xcoff symbol ref object"); continue; } llvm::StringRef symbolName = name_or_err.get(); - // Remove the dot prefix for demangle - llvm::StringRef symbol_name = + // Remove the dot prefix from symbol names. + llvm::StringRef name_no_dot = symbolName.starts_with(".") ? symbolName.drop_front() : symbolName; auto storageClass = xcoff_sym_ref.getStorageClass(); + // If its the hidden ext TOC symbol, add it directly, + // for all other C_HIDEXT symbols, proceed to other checks. if (storageClass == XCOFF::C_HIDEXT && symbolName != "TOC") { + // We do not need to add entries with 0 or >1 auxiliary data if (xcoff_sym_ref.getNumberOfAuxEntries() != 1) continue; auto aux_csect_or_err = xcoff_sym_ref.getXCOFFCsectAuxRef(); if (!aux_csect_or_err) { - consumeError(aux_csect_or_err.takeError()); + LLDB_LOG_ERROR(log, aux_csect_or_err.takeError(), + "Unable to access xcoff csect aux ref object"); continue; } const llvm::object::XCOFFCsectAuxRef csect_aux = aux_csect_or_err.get(); - if (csect_aux.getStorageMappingClass() != XCOFF::XMC_PR || - (m_binary->is64Bit() ? (csect_aux.getAuxType64() != XCOFF::AUX_CSECT) - : false)) + // Only add hidden ext entries which come under Program Code, skip others + if (csect_aux.getStorageMappingClass() != XCOFF::XMC_PR) + continue; + // This does not apply to 32-bit, + // Only add csect symbols identified by the aux entry, skip others + if (m_binary->is64Bit() ? (csect_aux.getAuxType64() != XCOFF::AUX_CSECT)) continue; } Symbol symbol; - symbol.GetMangled().SetValue(ConstString(symbol_name)); + symbol.GetMangled().SetValue(ConstString(name_no_dot)); int16_t sectionNumber = xcoff_sym_ref.getSectionNumber(); size_t sectionIndex = static_cast<size_t>(sectionNumber - 1); @@ -248,7 +256,8 @@ void ObjectFileXCOFF::ParseSymtab(Symtab &lldb_symtab) { Expected<llvm::object::SymbolRef::Type> sym_type_or_err = symbol_ref.getType(); if (!sym_type_or_err) { - consumeError(sym_type_or_err.takeError()); + LLDB_LOG_ERROR(log, aux_csect_or_err.takeError(), + "Unable to access xcoff symbol type"); continue; } symbol.SetType(MapSymbolType(sym_type_or_err.get())); _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits