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 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 differentiate 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(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 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 + +...