Author: Dhruv Srivastava Date: 2025-06-17T13:49:48+05:30 New Revision: 90905a638e483dd9040c153785148fcea7c3e412
URL: https://github.com/llvm/llvm-project/commit/90905a638e483dd9040c153785148fcea7c3e412 DIFF: https://github.com/llvm/llvm-project/commit/90905a638e483dd9040c153785148fcea7c3e412.diff LOG: [lldb][AIX] Added XCOFF ParseSymtab handling (#141577) This PR is in reference to porting LLDB on AIX. Link to discussions on llvm discourse and github: 1. https://discourse.llvm.org/t/port-lldb-to-ibm-aix/80640 2. https://github.com/llvm/llvm-project/issues/101657 The complete changes for porting are present in this draft PR: https://github.com/llvm/llvm-project/pull/102601 **Description:** Adding ParseSymtab logic after creating sections. It is able to handle both 32 and 64 bit symbols, without the need to add template logic. This is an incremental PR on top of my previous couple of XCOFF support commits. Added: lldb/test/Shell/ObjectFile/XCOFF/symbol-info.yaml lldb/test/Shell/ObjectFile/XCOFF/symbol-info32.yaml Modified: lldb/source/Plugins/ObjectFile/XCOFF/ObjectFileXCOFF.cpp Removed: ################################################################################ diff --git a/lldb/source/Plugins/ObjectFile/XCOFF/ObjectFileXCOFF.cpp b/lldb/source/Plugins/ObjectFile/XCOFF/ObjectFileXCOFF.cpp index 84d05e173f83f..d2c46edaf28cb 100644 --- a/lldb/source/Plugins/ObjectFile/XCOFF/ObjectFileXCOFF.cpp +++ b/lldb/source/Plugins/ObjectFile/XCOFF/ObjectFileXCOFF.cpp @@ -188,7 +188,107 @@ AddressClass ObjectFileXCOFF::GetAddressClass(addr_t file_addr) { return AddressClass::eUnknown; } -void ObjectFileXCOFF::ParseSymtab(Symtab &lldb_symtab) {} +static lldb::SymbolType MapSymbolType(llvm::object::SymbolRef::Type sym_type) { + switch (sym_type) { + case llvm::object::SymbolRef::ST_Function: + return lldb::eSymbolTypeCode; + case llvm::object::SymbolRef::ST_Data: + return lldb::eSymbolTypeData; + case llvm::object::SymbolRef::ST_File: + return lldb::eSymbolTypeSourceFile; + default: + return lldb::eSymbolTypeInvalid; + } +} + +void ObjectFileXCOFF::ParseSymtab(Symtab &lldb_symtab) { + Log *log = GetLog(LLDBLog::Object); + 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) { + 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 . prefix added during compilation. This prefix is usually + // added to diff erentiate between reference to the code and function + // descriptor. For instance, Adding .func will only allow user to put bp on + // .func, which is not known to the user, instead of func. + llvm::StringRef name_no_dot = + symbolName.starts_with(".") ? symbolName.drop_front() : symbolName; + auto storageClass = xcoff_sym_ref.getStorageClass(); + // C_HIDEXT symbols are not needed to be exposed, with the exception of TOC + // which is responsible for storing references to global data + if (storageClass == XCOFF::C_HIDEXT && symbolName != "TOC") { + + // Zero or muliple aux entries may suggest ambiguous data + if (xcoff_sym_ref.getNumberOfAuxEntries() != 1) + continue; + + auto aux_csect_or_err = xcoff_sym_ref.getXCOFFCsectAuxRef(); + if (!aux_csect_or_err) { + 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(); + + // Only add hidden ext entries which come under Program Code, skip others + // as they are not useful as debugging data. + if (csect_aux.getStorageMappingClass() != XCOFF::XMC_PR) + continue; + + // This does not apply to 32-bit, + // Only add csect symbols identified by the aux entry, as they are + // needed to reference section information. Skip others + if (m_binary->is64Bit()) + if (csect_aux.getAuxType64() != XCOFF::AUX_CSECT) + continue; + } + + Symbol symbol; + symbol.GetMangled().SetValue(ConstString(name_no_dot)); + + int16_t sectionNumber = xcoff_sym_ref.getSectionNumber(); + // Note that XCOFF section headers are numbered from 1 and not 0. + size_t sectionIndex = static_cast<size_t>(sectionNumber - 1); + if (sectionNumber > 0) { + if (sectionIndex < sectionList->GetSize()) { + + lldb::SectionSP section_sp = + sectionList->GetSectionAtIndex(sectionIndex); + 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(); + if (!sym_type_or_err) { + LLDB_LOG_ERROR(log, sym_type_or_err.takeError(), + "Unable to access xcoff symbol type"); + continue; + } + + symbol.SetType(MapSymbolType(sym_type_or_err.get())); + + lldb_symtab.AddSymbol(symbol); + } +} bool ObjectFileXCOFF::IsStripped() { return false; } diff --git a/lldb/test/Shell/ObjectFile/XCOFF/symbol-info.yaml b/lldb/test/Shell/ObjectFile/XCOFF/symbol-info.yaml new file mode 100644 index 0000000000000..6b1a40a283445 --- /dev/null +++ b/lldb/test/Shell/ObjectFile/XCOFF/symbol-info.yaml @@ -0,0 +1,121 @@ +# RUN: yaml2obj %s -o %t +# RUN: %lldb %t -o "image dump symtab" -o exit | FileCheck %s +# CHECK: Index UserID DSX Type File Address/Value Load Address Size Flags Name +# CHECK: [ 0] 4294967295 Invalid 0xffffffffffffffff 0x0000000000000000 0x00000000 errno +# CHECK: [ 1] 4294967295 Code 0x0000000100000500 0x0000000000000398 0x00000000 __threads_init +# CHECK: [ 2] 4294967295 Data 0x0000000110000a70 0x0000000000000060 0x00000000 __threads_init +# CHECK: [ 3] 4294967295 Invalid 0x0000000110000ad0 0x00000000000000b0 0x00000000 TOC +# CHECK: [ 4] 4294967295 Invalid 0x0000000100000898 0x00000000100001d8 0x00000000 text +# CHECK: [ 5] 4294967295 Code 0x0000000100000898 0x00000000100001d8 0x00000000 main + +--- !XCOFF +FileHeader: + MagicNumber: 0x1F7 + NumberOfSections: 2 + CreationTime: 000000000 + Flags: 0x0002 +Sections: + - Name: .text + Address: 0x100000438 + Size: 0x38 + FileOffsetToData: 0x0 + FileOffsetToLineNumbers: 0x0 + NumberOfLineNumbers: 0x0 + Flags: [ STYP_TEXT ] + SectionData: E8C20000 + - Name: .data + Address: 0x1100008D2 + Size: 0x2AE + FileOffsetToData: 0x8D2 + FileOffsetToRelocations: 0x132E + FileOffsetToLineNumbers: 0x0 + NumberOfRelocations: 0x22 + NumberOfLineNumbers: 0x0 + Flags: [ STYP_DATA ] + SectionData: '' +Symbols: + - Name: errno + Value: 0x0 + Section: N_UNDEF + Type: 0x0 + StorageClass: C_EXT + NumberOfAuxEntries: 1 + AuxEntries: + - Type: AUX_CSECT + ParameterHashIndex: 0 + TypeChkSectNum: 0 + SymbolAlignmentAndType: 0 + StorageMappingClass: XMC_RW + SectionOrLengthLo: 0 + SectionOrLengthHi: 0 + - Name: .__threads_init + Value: 0x100000500 + Section: .text + Type: 0x20 + StorageClass: C_EXT + NumberOfAuxEntries: 1 + AuxEntries: + - Type: AUX_CSECT + ParameterHashIndex: 0 + TypeChkSectNum: 0 + SymbolAlignmentAndType: 2 + StorageMappingClass: XMC_PR + SectionOrLengthLo: 80 + SectionOrLengthHi: 0 + - Name: __threads_init + Value: 0x110000A70 + Section: .data + Type: 0x0 + StorageClass: C_EXT + NumberOfAuxEntries: 1 + AuxEntries: + - Type: AUX_CSECT + ParameterHashIndex: 0 + TypeChkSectNum: 0 + SymbolAlignmentAndType: 25 + StorageMappingClass: XMC_DS + SectionOrLengthLo: 24 + SectionOrLengthHi: 0 + - Name: TOC + Value: 0x110000AD0 + Section: .data + Type: 0x0 + StorageClass: C_HIDEXT + NumberOfAuxEntries: 1 + AuxEntries: + - Type: AUX_CSECT + ParameterHashIndex: 0 + TypeChkSectNum: 0 + SymbolAlignmentAndType: 25 + StorageMappingClass: XMC_TC0 + SectionOrLengthLo: 0 + SectionOrLengthHi: 0 + - Name: .text + Value: 0x100000898 + Section: .text + Type: 0x0 + StorageClass: C_HIDEXT + NumberOfAuxEntries: 1 + AuxEntries: + - Type: AUX_CSECT + ParameterHashIndex: 0 + TypeChkSectNum: 0 + SymbolAlignmentAndType: 17 + StorageMappingClass: XMC_PR + SectionOrLengthLo: 58 + SectionOrLengthHi: 0 + - Name: .main + Value: 0x100000898 + Section: .text + Type: 0x0 + StorageClass: C_EXT + NumberOfAuxEntries: 1 + AuxEntries: + - Type: AUX_CSECT + ParameterHashIndex: 0 + TypeChkSectNum: 0 + SymbolAlignmentAndType: 2 + StorageMappingClass: XMC_PR + SectionOrLengthLo: 135 + SectionOrLengthHi: 0 +... diff --git a/lldb/test/Shell/ObjectFile/XCOFF/symbol-info32.yaml b/lldb/test/Shell/ObjectFile/XCOFF/symbol-info32.yaml new file mode 100644 index 0000000000000..59c018ba0e426 --- /dev/null +++ b/lldb/test/Shell/ObjectFile/XCOFF/symbol-info32.yaml @@ -0,0 +1,124 @@ +# RUN: yaml2obj %s -o %t +# RUN: %lldb %t -o "image dump symtab" -o exit | FileCheck %s +# CHECK: Index UserID DSX Type File Address/Value Load Address Size Flags Name +# CHECK: [ 0] 4294967295 Invalid 0xffffffffffffffff 0x0000000000000000 0x00000000 errno +# CHECK: [ 1] 4294967295 Code 0x0000000010000320 0x0000000000000420 0x00000000 __threads_init +# CHECK: [ 2] 4294967295 Data 0x0000000020000920 0x000000000000003c 0x00000000 __threads_init +# CHECK: [ 3] 4294967295 Invalid 0x000000002000095c 0x0000000000000060 0x00000000 TOC +# CHECK: [ 4] 4294967295 Invalid 0x0000000010000740 0x000000000000003a 0x00000000 text +# CHECK: [ 5] 4294967295 Invalid 0x0000000010000740 0x000000000000003a 0x00000000 main + +--- !XCOFF +FileHeader: + MagicNumber: 0x1DF + NumberOfSections: 2 + CreationTime: 000000000 + Flags: 0x1002 +Sections: + - Name: .text + Address: 0x10000268 + Size: 0x512 + FileOffsetToData: 0x268 + FileOffsetToRelocations: 0xECC + FileOffsetToLineNumbers: 0x0 + NumberOfRelocations: 0x24 + NumberOfLineNumbers: 0x0 + Flags: [ STYP_TEXT ] + SectionData: 80C20000 + - Name: .data + Address: 0x2000077A + Size: 0x242 + FileOffsetToData: 0x77A + FileOffsetToRelocations: 0x1034 + FileOffsetToLineNumbers: 0x0 + NumberOfRelocations: 0x25 + NumberOfLineNumbers: 0x0 + Flags: [ STYP_DATA ] + SectionData: '' +Symbols: + - Name: errno + Value: 0x0 + Section: N_UNDEF + Type: 0x0 + StorageClass: C_EXT + NumberOfAuxEntries: 1 + AuxEntries: + - Type: AUX_CSECT + ParameterHashIndex: 0 + TypeChkSectNum: 0 + StorageMappingClass: XMC_RW + SectionOrLength: 0 + StabInfoIndex: 0 + StabSectNum: 0 + - Name: .__threads_init + Value: 0x10000320 + Section: .text + Type: 0x20 + StorageClass: C_EXT + NumberOfAuxEntries: 1 + AuxEntries: + - Type: AUX_CSECT + ParameterHashIndex: 0 + TypeChkSectNum: 0 + StorageMappingClass: XMC_PR + SectionOrLength: 84 + StabInfoIndex: 0 + StabSectNum: 0 + - Name: __threads_init + Value: 0x20000920 + Section: .data + Type: 0x0 + StorageClass: C_EXT + NumberOfAuxEntries: 1 + AuxEntries: + - Type: AUX_CSECT + ParameterHashIndex: 0 + TypeChkSectNum: 0 + StorageMappingClass: XMC_DS + SectionOrLength: 12 + StabInfoIndex: 0 + StabSectNum: 0 + - Name: TOC + Value: 0x2000095C + Section: .data + Type: 0x0 + StorageClass: C_HIDEXT + NumberOfAuxEntries: 1 + AuxEntries: + - Type: AUX_CSECT + ParameterHashIndex: 0 + TypeChkSectNum: 0 + StorageMappingClass: XMC_TC0 + SectionOrLength: 0 + StabInfoIndex: 0 + StabSectNum: 0 + - Name: .text + Value: 0x10000740 + Section: .text + Type: 0x0 + StorageClass: C_HIDEXT + NumberOfAuxEntries: 1 + AuxEntries: + - Type: AUX_CSECT + ParameterHashIndex: 0 + TypeChkSectNum: 0 + StorageMappingClass: XMC_PR + SectionOrLength: 58 + StabInfoIndex: 0 + StabSectNum: 0 + - Name: .main + Value: 0x10000740 + Section: .text + Type: 0x0 + StorageClass: C_EXT + NumberOfAuxEntries: 1 + AuxEntries: + - Type: AUX_CSECT + ParameterHashIndex: 0 + TypeChkSectNum: 0 + StorageMappingClass: XMC_PR + SectionOrLength: 137 + StabInfoIndex: 0 + StabSectNum: 0 + +... _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits