diff --git a/llvm/include/llvm/ObjectYAML/XCOFFYAML.h b/llvm/include/llvm/ObjectYAML/XCOFFYAML.h --- a/llvm/include/llvm/ObjectYAML/XCOFFYAML.h +++ b/llvm/include/llvm/ObjectYAML/XCOFFYAML.h @@ -50,6 +50,36 @@ std::vector Relocations; }; +struct FileAuxEnt { + StringRef FileName; + XCOFF::CFileStringType Type; +}; + +struct CsectAuxEnt32 { + uint32_t SectionOrLength; // If the symbol type is XTY_SD or XTY_CM, the csect + // length. + // If the symbol type is XTY_LD, the symbol table + // index of the containing csect. + // If the symbol type is XTY_ER, 0. + uint32_t ParameterHashIndex; + uint16_t TypeChkSecNum; + uint8_t SymbolAlignmentAndType; + XCOFF::StorageMappingClass StorageMappingClass; + uint32_t StabInfoIndex; + uint16_t StabSecNum; +}; + +struct CsectAuxEnt64 { + uint32_t SectionOrLength_Lo; + uint32_t SectionOrLength_Hi; + uint32_t ParameterHashIndex; + uint16_t TypeChkSecNum; + uint8_t SymbolAlignmentAndType; + XCOFF::StorageMappingClass StorageMappingClass; + uint8_t Pad; + uint8_t CsectAux; +}; + struct Symbol { StringRef SymbolName; llvm::yaml::Hex64 Value; // Symbol value; storage class-dependent. @@ -57,6 +87,8 @@ llvm::yaml::Hex16 Type; XCOFF::StorageClass StorageClass; uint8_t NumberOfAuxEntries; + FileAuxEnt FileAuxEntry; + CsectAuxEnt32 CsectAuxEntry; }; struct Object { @@ -83,10 +115,25 @@ static void enumeration(IO &IO, XCOFF::StorageClass &Value); }; +template <> struct ScalarEnumerationTraits { + static void enumeration(IO &IO, XCOFF::StorageMappingClass &Value); +}; + +template <> struct ScalarEnumerationTraits { + static void enumeration(IO &IO, XCOFF::CFileStringType &Value); +}; + template <> struct MappingTraits { static void mapping(IO &IO, XCOFFYAML::FileHeader &H); }; +template <> struct MappingTraits { + static void mapping(IO &IO, XCOFFYAML::FileAuxEnt &FAE); +}; + +template <> struct MappingTraits { + static void mapping(IO &IO, XCOFFYAML::CsectAuxEnt32 &CAE32); +}; template <> struct MappingTraits { static void mapping(IO &IO, XCOFFYAML::Symbol &S); diff --git a/llvm/lib/ObjectYAML/XCOFFYAML.cpp b/llvm/lib/ObjectYAML/XCOFFYAML.cpp --- a/llvm/lib/ObjectYAML/XCOFFYAML.cpp +++ b/llvm/lib/ObjectYAML/XCOFFYAML.cpp @@ -98,6 +98,44 @@ #undef ECase } +void ScalarEnumerationTraits::enumeration( + IO &IO, XCOFF::StorageMappingClass &Value) { +#define ECase(X) IO.enumCase(Value, #X, XCOFF::X) + ECase(XMC_PR); + ECase(XMC_RO); + ECase(XMC_DB); + ECase(XMC_GL); + ECase(XMC_XO); + ECase(XMC_SV); + ECase(XMC_SV64); + ECase(XMC_SV3264); + ECase(XMC_SV3264); + ECase(XMC_TI); + ECase(XMC_TB); + ECase(XMC_RW); + ECase(XMC_TC0); + ECase(XMC_TC); + ECase(XMC_TD); + ECase(XMC_DS); + ECase(XMC_UA); + ECase(XMC_BS); + ECase(XMC_UC); + ECase(XMC_TL); + ECase(XMC_UL); + ECase(XMC_TE); +#undef ECase +} + +void ScalarEnumerationTraits::enumeration( + IO &IO, XCOFF::CFileStringType &Value) { +#define ECase(X) IO.enumCase(Value, #X, XCOFF::X) + ECase(XFT_FN); + ECase(XFT_CT); + ECase(XFT_CV); + ECase(XFT_CD); +#undef ECase +} + struct NSectionFlags { NSectionFlags(IO &) : Flags(XCOFF::SectionTypeFlags(0)) {} NSectionFlags(IO &, uint32_t C) : Flags(XCOFF::SectionTypeFlags(C)) {} @@ -142,6 +180,23 @@ IO.mapOptional("Relocations", Sec.Relocations); } +void MappingTraits::mapping(IO &IO, + XCOFFYAML::FileAuxEnt &FAE) { + IO.mapOptional("FileName", FAE.FileName); + IO.mapOptional("Type", FAE.Type); +} + +void MappingTraits::mapping( + IO &IO, XCOFFYAML::CsectAuxEnt32 &CAE32) { + IO.mapOptional("SectionLen", CAE32.SectionOrLength); + IO.mapOptional("ParameterHashIndex", CAE32.ParameterHashIndex); + IO.mapOptional("TypeChkSectNum", CAE32.TypeChkSecNum); + IO.mapOptional("SymbolAlignmentAndType", CAE32.SymbolAlignmentAndType); + IO.mapOptional("StorageMappingClass", CAE32.StorageMappingClass); + IO.mapOptional("StabInfoIndex", CAE32.StabInfoIndex); + IO.mapOptional("StabSectNum", CAE32.StabSecNum); +} + void MappingTraits::mapping(IO &IO, XCOFFYAML::Symbol &S) { IO.mapRequired("Name", S.SymbolName); IO.mapOptional("Value", S.Value); @@ -149,6 +204,11 @@ IO.mapOptional("Type", S.Type); IO.mapOptional("StorageClass", S.StorageClass); IO.mapOptional("NumberOfAuxEntries", S.NumberOfAuxEntries); + if (S.StorageClass == XCOFF::C_EXT || S.StorageClass == XCOFF::C_WEAKEXT || + S.StorageClass == XCOFF::C_HIDEXT) + IO.mapOptional("CsectAuxEntry", S.CsectAuxEntry); + if (S.StorageClass == XCOFF::C_FILE) + IO.mapOptional("FileAuxEntry", S.FileAuxEntry); } void MappingTraits::mapping(IO &IO, XCOFFYAML::Object &Obj) { diff --git a/llvm/test/tools/obj2yaml/XCOFF/aix.yaml b/llvm/test/tools/obj2yaml/XCOFF/aix.yaml --- a/llvm/test/tools/obj2yaml/XCOFF/aix.yaml +++ b/llvm/test/tools/obj2yaml/XCOFF/aix.yaml @@ -1,6 +1,7 @@ # RUN: obj2yaml %S/Inputs/aix_xcoff.o | FileCheck %s # Test that we can parse the XCOFF object file correctly. -# CHECK: --- !XCOFF + +# CHECK: --- !XCOFF # CHECK-NEXT: FileHeader: # CHECK-NEXT: MagicNumber: 0x1DF # CHECK-NEXT: NumberOfSections: 2 @@ -9,72 +10,212 @@ # CHECK-NEXT: EntriesInSymbolTable: 22 # CHECK-NEXT: AuxiliaryHeaderSize: 0 # CHECK-NEXT: Flags: 0x0 - -# CHECK: Symbols: -# CHECK-NEXT: - Name: .file -# CHECK-NEXT: Value: 0x0 -# CHECK-NEXT: Section: N_DEBUG -# CHECK-NEXT: Type: 0x3 +# CHECK-NEXT: Sections: +# CHECK-NEXT: - Name: .text +# CHECK-NEXT: Address: 0x0 +# CHECK-NEXT: Size: 0x60 +# CHECK-NEXT: FileOffsetToData: 0x64 +# CHECK-NEXT: FileOffsetToRelocations: 0xE0 +# CHECK-NEXT: FileOffsetToLineNumbers: 0x0 +# CHECK-NEXT: NumberOfRelocations: 0x4 +# CHECK-NEXT: NumberOfLineNumbers: 0x0 +# CHECK-NEXT: Flags: [ STYP_TEXT ] +# CHECK-NEXT: SectionData: 93E1FFFC9421FFE07C3F0B78812200008129000039490001812200009149000081220004812900003949FFFF8122000491490000392000007D234B78383F002083E1FFFC4E8000200000000000092060800100010000004800046D61696E1F00 +# CHECK-NEXT: Relocations: +# CHECK-NEXT: - Address: 0xE +# CHECK-NEXT: Symbol: 0x12 +# CHECK-NEXT: Info: 0xF +# CHECK-NEXT: Type: 0x3 +# CHECK-NEXT: - Address: 0x1A +# CHECK-NEXT: Symbol: 0x12 +# CHECK-NEXT: Info: 0xF +# CHECK-NEXT: Type: 0x3 +# CHECK-NEXT: - Address: 0x22 +# CHECK-NEXT: Symbol: 0x14 +# CHECK-NEXT: Info: 0xF +# CHECK-NEXT: Type: 0x3 +# CHECK-NEXT: - Address: 0x2E +# CHECK-NEXT: Symbol: 0x14 +# CHECK-NEXT: Info: 0xF +# CHECK-NEXT: Type: 0x3 +# CHECK-NEXT: - Name: .data +# CHECK-NEXT: Address: 0x60 +# CHECK-NEXT: Size: 0x1C +# CHECK-NEXT: FileOffsetToData: 0xC4 +# CHECK-NEXT: FileOffsetToRelocations: 0x108 +# CHECK-NEXT: FileOffsetToLineNumbers: 0x0 +# CHECK-NEXT: NumberOfRelocations: 0x5 +# CHECK-NEXT: NumberOfLineNumbers: 0x0 +# CHECK-NEXT: Flags: [ STYP_DATA ] +# CHECK-NEXT: SectionData: '00000000000000740000000000000000000000600000000000000000' +# CHECK-NEXT: Relocations: +# CHECK-NEXT: - Address: 0x60 +# CHECK-NEXT: Symbol: 0x8 +# CHECK-NEXT: Info: 0x1F +# CHECK-NEXT: Type: 0x0 +# CHECK-NEXT: - Address: 0x64 +# CHECK-NEXT: Symbol: 0x10 +# CHECK-NEXT: Info: 0x1F +# CHECK-NEXT: Type: 0x0 +# CHECK-NEXT: - Address: 0x70 +# CHECK-NEXT: Symbol: 0x6 +# CHECK-NEXT: Info: 0x1F +# CHECK-NEXT: Type: 0x0 +# CHECK-NEXT: - Address: 0x74 +# CHECK-NEXT: Symbol: 0x2 +# CHECK-NEXT: Info: 0x1F +# CHECK-NEXT: Type: 0x0 +# CHECK-NEXT: - Address: 0x78 +# CHECK-NEXT: Symbol: 0x4 +# CHECK-NEXT: Info: 0x1F +# CHECK-NEXT: Type: 0x0 +# CHECK-NEXT: Symbols: +# CHECK-NEXT: - Name: .file +# CHECK-NEXT: Value: 0x0 +# CHECK-NEXT: Section: N_DEBUG +# CHECK-NEXT: Type: 0x3 # CHECK-NEXT: StorageClass: C_FILE # CHECK-NEXT: NumberOfAuxEntries: 1 -# CHECK-NEXT: - Name: i -# CHECK-NEXT: Value: 0x0 -# CHECK-NEXT: Section: N_UNDEF -# CHECK-NEXT: Type: 0x0 +# CHECK-NEXT: FileAuxEntry: +# CHECK-NEXT: FileName: test.c +# CHECK-NEXT: Type: XFT_FN +# CHECK-NEXT: - Name: i +# CHECK-NEXT: Value: 0x0 +# CHECK-NEXT: Section: N_UNDEF +# CHECK-NEXT: Type: 0x0 # CHECK-NEXT: StorageClass: C_EXT # CHECK-NEXT: NumberOfAuxEntries: 1 -# CHECK-NEXT: - Name: TestforXcoff -# CHECK-NEXT: Value: 0x0 -# CHECK-NEXT: Section: N_UNDEF -# CHECK-NEXT: Type: 0x0 +# CHECK-NEXT: CsectAuxEntry: +# CHECK-NEXT: SectionLen: 0 +# CHECK-NEXT: ParameterHashIndex: 0 +# CHECK-NEXT: TypeChkSectNum: 0 +# CHECK-NEXT: SymbolAlignmentAndType: 0 +# CHECK-NEXT: StorageMappingClass: XMC_UA +# CHECK-NEXT: StabInfoIndex: 0 +# CHECK-NEXT: StabSectNum: 0 +# CHECK-NEXT: - Name: TestforXcoff +# CHECK-NEXT: Value: 0x0 +# CHECK-NEXT: Section: N_UNDEF +# CHECK-NEXT: Type: 0x0 # CHECK-NEXT: StorageClass: C_EXT # CHECK-NEXT: NumberOfAuxEntries: 1 -# CHECK-NEXT: - Name: .text -# CHECK-NEXT: Value: 0x0 -# CHECK-NEXT: Section: .text -# CHECK-NEXT: Type: 0x0 +# CHECK-NEXT: CsectAuxEntry: +# CHECK-NEXT: SectionLen: 0 +# CHECK-NEXT: ParameterHashIndex: 0 +# CHECK-NEXT: TypeChkSectNum: 0 +# CHECK-NEXT: SymbolAlignmentAndType: 0 +# CHECK-NEXT: StorageMappingClass: XMC_UA +# CHECK-NEXT: StabInfoIndex: 0 +# CHECK-NEXT: StabSectNum: 0 +# CHECK-NEXT: - Name: .text +# CHECK-NEXT: Value: 0x0 +# CHECK-NEXT: Section: .text +# CHECK-NEXT: Type: 0x0 # CHECK-NEXT: StorageClass: C_HIDEXT # CHECK-NEXT: NumberOfAuxEntries: 1 -# CHECK-NEXT: - Name: .main -# CHECK-NEXT: Value: 0x0 -# CHECK-NEXT: Section: .text -# CHECK-NEXT: Type: 0x0 +# CHECK-NEXT: CsectAuxEntry: +# CHECK-NEXT: SectionLen: 96 +# CHECK-NEXT: ParameterHashIndex: 0 +# CHECK-NEXT: TypeChkSectNum: 0 +# CHECK-NEXT: SymbolAlignmentAndType: 1 +# CHECK-NEXT: StorageMappingClass: XMC_PR +# CHECK-NEXT: StabInfoIndex: 0 +# CHECK-NEXT: StabSectNum: 0 +# CHECK-NEXT: - Name: .main +# CHECK-NEXT: Value: 0x0 +# CHECK-NEXT: Section: .text +# CHECK-NEXT: Type: 0x0 # CHECK-NEXT: StorageClass: C_EXT # CHECK-NEXT: NumberOfAuxEntries: 1 -# CHECK-NEXT: - Name: main -# CHECK-NEXT: Value: 0x60 -# CHECK-NEXT: Section: .data -# CHECK-NEXT: Type: 0x0 +# CHECK-NEXT: CsectAuxEntry: +# CHECK-NEXT: SectionLen: 6 +# CHECK-NEXT: ParameterHashIndex: 0 +# CHECK-NEXT: TypeChkSectNum: 0 +# CHECK-NEXT: SymbolAlignmentAndType: 2 +# CHECK-NEXT: StorageMappingClass: XMC_PR +# CHECK-NEXT: StabInfoIndex: 0 +# CHECK-NEXT: StabSectNum: 0 +# CHECK-NEXT: - Name: main +# CHECK-NEXT: Value: 0x60 +# CHECK-NEXT: Section: .data +# CHECK-NEXT: Type: 0x0 # CHECK-NEXT: StorageClass: C_HIDEXT # CHECK-NEXT: NumberOfAuxEntries: 1 -# CHECK-NEXT: - Name: main -# CHECK-NEXT: Value: 0x60 -# CHECK-NEXT: Section: .data -# CHECK-NEXT: Type: 0x0 +# CHECK-NEXT: CsectAuxEntry: +# CHECK-NEXT: SectionLen: 12 +# CHECK-NEXT: ParameterHashIndex: 0 +# CHECK-NEXT: TypeChkSectNum: 0 +# CHECK-NEXT: SymbolAlignmentAndType: 1 +# CHECK-NEXT: StorageMappingClass: XMC_DS +# CHECK-NEXT: StabInfoIndex: 0 +# CHECK-NEXT: StabSectNum: 0 +# CHECK-NEXT: - Name: main +# CHECK-NEXT: Value: 0x60 +# CHECK-NEXT: Section: .data +# CHECK-NEXT: Type: 0x0 # CHECK-NEXT: StorageClass: C_EXT # CHECK-NEXT: NumberOfAuxEntries: 1 -# CHECK-NEXT: - Name: .data -# CHECK-NEXT: Value: 0x70 -# CHECK-NEXT: Section: .data -# CHECK-NEXT: Type: 0x0 +# CHECK-NEXT: CsectAuxEntry: +# CHECK-NEXT: SectionLen: 10 +# CHECK-NEXT: ParameterHashIndex: 0 +# CHECK-NEXT: TypeChkSectNum: 0 +# CHECK-NEXT: SymbolAlignmentAndType: 2 +# CHECK-NEXT: StorageMappingClass: XMC_DS +# CHECK-NEXT: StabInfoIndex: 0 +# CHECK-NEXT: StabSectNum: 0 +# CHECK-NEXT: - Name: .data +# CHECK-NEXT: Value: 0x70 +# CHECK-NEXT: Section: .data +# CHECK-NEXT: Type: 0x0 # CHECK-NEXT: StorageClass: C_HIDEXT # CHECK-NEXT: NumberOfAuxEntries: 1 -# CHECK-NEXT: - Name: TOC -# CHECK-NEXT: Value: 0x74 -# CHECK-NEXT: Section: .data -# CHECK-NEXT: Type: 0x0 +# CHECK-NEXT: CsectAuxEntry: +# CHECK-NEXT: SectionLen: 4 +# CHECK-NEXT: ParameterHashIndex: 0 +# CHECK-NEXT: TypeChkSectNum: 0 +# CHECK-NEXT: SymbolAlignmentAndType: 1 +# CHECK-NEXT: StorageMappingClass: XMC_RW +# CHECK-NEXT: StabInfoIndex: 0 +# CHECK-NEXT: StabSectNum: 0 +# CHECK-NEXT: - Name: TOC +# CHECK-NEXT: Value: 0x74 +# CHECK-NEXT: Section: .data +# CHECK-NEXT: Type: 0x0 # CHECK-NEXT: StorageClass: C_HIDEXT # CHECK-NEXT: NumberOfAuxEntries: 1 -# CHECK-NEXT: - Name: i -# CHECK-NEXT: Value: 0x74 -# CHECK-NEXT: Section: .data -# CHECK-NEXT: Type: 0x0 +# CHECK-NEXT: CsectAuxEntry: +# CHECK-NEXT: SectionLen: 0 +# CHECK-NEXT: ParameterHashIndex: 0 +# CHECK-NEXT: TypeChkSectNum: 0 +# CHECK-NEXT: SymbolAlignmentAndType: 1 +# CHECK-NEXT: StorageMappingClass: XMC_TC0 +# CHECK-NEXT: StabInfoIndex: 0 +# CHECK-NEXT: StabSectNum: 0 +# CHECK-NEXT: - Name: i +# CHECK-NEXT: Value: 0x74 +# CHECK-NEXT: Section: .data +# CHECK-NEXT: Type: 0x0 # CHECK-NEXT: StorageClass: C_HIDEXT # CHECK-NEXT: NumberOfAuxEntries: 1 -# CHECK-NEXT: - Name: TestforXcoff -# CHECK-NEXT: Value: 0x78 -# CHECK-NEXT: Section: .data -# CHECK-NEXT: Type: 0x0 +# CHECK-NEXT: CsectAuxEntry: +# CHECK-NEXT: SectionLen: 4 +# CHECK-NEXT: ParameterHashIndex: 0 +# CHECK-NEXT: TypeChkSectNum: 0 +# CHECK-NEXT: SymbolAlignmentAndType: 1 +# CHECK-NEXT: StorageMappingClass: XMC_TC +# CHECK-NEXT: StabInfoIndex: 0 +# CHECK-NEXT: StabSectNum: 0 +# CHECK-NEXT: - Name: TestforXcoff +# CHECK-NEXT: Value: 0x78 +# CHECK-NEXT: Section: .data +# CHECK-NEXT: Type: 0x0 # CHECK-NEXT: StorageClass: C_HIDEXT # CHECK-NEXT: NumberOfAuxEntries: 1 -# CHECK-NEXT: ... +# CHECK-NEXT: CsectAuxEntry: +# CHECK-NEXT: SectionLen: 4 +# CHECK-NEXT: ParameterHashIndex: 0 +# CHECK-NEXT: TypeChkSectNum: 0 +# CHECK-NEXT: SymbolAlignmentAndType: 1 +# CHECK-NEXT: StorageMappingClass: XMC_TC +# CHECK-NEXT: StabInfoIndex: 0 +# CHECK-NEXT: StabSectNum: 0 diff --git a/llvm/tools/obj2yaml/xcoff2yaml.cpp b/llvm/tools/obj2yaml/xcoff2yaml.cpp --- a/llvm/tools/obj2yaml/xcoff2yaml.cpp +++ b/llvm/tools/obj2yaml/xcoff2yaml.cpp @@ -9,6 +9,7 @@ #include "obj2yaml.h" #include "llvm/Object/XCOFFObjectFile.h" #include "llvm/ObjectYAML/XCOFFYAML.h" +#include "llvm/Support/Errc.h" #include "llvm/Support/YAMLTraits.h" using namespace llvm; @@ -19,17 +20,21 @@ const object::XCOFFObjectFile &Obj; XCOFFYAML::Object YAMLObj; void dumpHeader(); - std::error_code dumpSymbols(); + Error dumpSections(); + Error dumpSymbols(); + template Error dumpSections(ArrayRef Sections); public: XCOFFDumper(const object::XCOFFObjectFile &obj) : Obj(obj) {} - std::error_code dump(); + Error dump(); XCOFFYAML::Object &getYAMLObj() { return YAMLObj; } }; } // namespace -std::error_code XCOFFDumper::dump() { +Error XCOFFDumper::dump() { dumpHeader(); + if (Error E = dumpSections()) + return E; return dumpSymbols(); } @@ -50,7 +55,57 @@ YAMLObj.Header.Flags = Obj.getFlags(); } -std::error_code XCOFFDumper::dumpSymbols() { +Error XCOFFDumper::dumpSections() { + if (Obj.is64Bit()) + return createStringError(object_error::invalid_file_type, + "64-bit XCOFF not supported yet"); + return dumpSections(Obj.sections32()); +} + +template Error XCOFFDumper::dumpSections(ArrayRef Sections) { + std::vector &YamlSections = YAMLObj.Sections; + for (const T &S : Sections) { + XCOFFYAML::Section YamlSec; + YamlSec.SectionName = S.getName(); + YamlSec.Address = S.PhysicalAddress; + YamlSec.Size = S.SectionSize; + YamlSec.NumberOfRelocations = S.NumberOfRelocations; + YamlSec.NumberOfLineNumbers = S.NumberOfLineNumbers; + YamlSec.FileOffsetToData = S.FileOffsetToRawData; + YamlSec.FileOffsetToRelocations = S.FileOffsetToRelocationInfo; + YamlSec.FileOffsetToLineNumbers = S.FileOffsetToLineNumberInfo; + YamlSec.Flags = S.Flags; + + // Section data. + if (S.FileOffsetToRawData) { + DataRefImpl SectionDRI; + SectionDRI.p = reinterpret_cast(&S); + Expected> SecDataRefOrErr = + Obj.getSectionContents(SectionDRI); + if (!SecDataRefOrErr) + return SecDataRefOrErr.takeError(); + YamlSec.SectionData = SecDataRefOrErr.get(); + } + // Relocations. + if (S.NumberOfRelocations) { + Expected> RelRefOrErr = Obj.relocations(S); + if (!RelRefOrErr) + return RelRefOrErr.takeError(); + for (XCOFFRelocation32 Rel : RelRefOrErr.get()) { + XCOFFYAML::Relocation YamlRel; + YamlRel.Type = Rel.Type; + YamlRel.Info = Rel.Info; + YamlRel.SymbolIndex = Rel.SymbolIndex; + YamlRel.VirtualAddress = Rel.VirtualAddress; + YamlSec.Relocations.push_back(YamlRel); + } + } + YamlSections.push_back(YamlSec); + } + return Error::success(); +} + +Error XCOFFDumper::dumpSymbols() { std::vector &Symbols = YAMLObj.Symbols; for (const SymbolRef &S : Obj.symbols()) { @@ -60,7 +115,7 @@ Expected SymNameRefOrErr = Obj.getSymbolName(SymbolDRI); if (!SymNameRefOrErr) { - return errorToErrorCode(SymNameRefOrErr.takeError()); + return SymNameRefOrErr.takeError(); } Sym.SymbolName = SymNameRefOrErr.get(); @@ -69,25 +124,70 @@ Expected SectionNameRefOrErr = Obj.getSymbolSectionName(SymbolEntRef); if (!SectionNameRefOrErr) - return errorToErrorCode(SectionNameRefOrErr.takeError()); + return SectionNameRefOrErr.takeError(); Sym.SectionName = SectionNameRefOrErr.get(); Sym.Type = SymbolEntRef.getSymbolType(); Sym.StorageClass = SymbolEntRef.getStorageClass(); Sym.NumberOfAuxEntries = SymbolEntRef.getNumberOfAuxEntries(); + // Dump auxiliary entries. + switch (Sym.StorageClass) { + case XCOFF::C_FILE: + // A file auxiliary entry is optional. + if (Sym.NumberOfAuxEntries) { + const XCOFFFileAuxEnt *FileAuxEntPtr = + reinterpret_cast( + XCOFFObjectFile::getAdvancedSymbolEntryAddress( + SymbolEntRef.getEntryAddress(), 1)); +#ifndef NDEBUG + Obj.checkSymbolEntryPointer(reinterpret_cast(FileAuxEntPtr)); +#endif + XCOFFYAML::FileAuxEnt &AuxEnt = Sym.FileAuxEntry; + Expected FileNameRefOrErr = Obj.getCFileName(FileAuxEntPtr); + if (!FileNameRefOrErr) + return FileNameRefOrErr.takeError(); + AuxEnt.FileName = FileNameRefOrErr.get(); + AuxEnt.Type = FileAuxEntPtr->Type; + } + break; + case XCOFF::C_EXT: + case XCOFF::C_WEAKEXT: + case XCOFF::C_HIDEXT: { + // TODO implement function auxiliary entry. + // A csect auxiliary entry is required. + XCOFFSymbolRef XCOFFSymRef(SymbolDRI, &Obj); + Expected CsectAuxEntOrErr = + SymbolEntRef.getXCOFFCsectAuxRef(); + if (!CsectAuxEntOrErr) + return CsectAuxEntOrErr.takeError(); + auto CsectAuxEnt = CsectAuxEntOrErr.get(); + XCOFFYAML::CsectAuxEnt32 &AuxEnt = Sym.CsectAuxEntry; + AuxEnt.SectionOrLength = CsectAuxEnt.getSectionOrLength(); + AuxEnt.ParameterHashIndex = CsectAuxEnt.getParameterHashIndex(); + AuxEnt.TypeChkSecNum = CsectAuxEnt.getTypeChkSectNum(); + AuxEnt.SymbolAlignmentAndType = CsectAuxEnt.getSymbolType(); + AuxEnt.StorageMappingClass = CsectAuxEnt.getStorageMappingClass(); + AuxEnt.StabSecNum = CsectAuxEnt.getStabSectNum32(); + AuxEnt.StabInfoIndex = CsectAuxEnt.getStabInfoIndex32(); + break; + } + default: + // TODO dump auxiliary information for other symbols. + break; + } Symbols.push_back(Sym); } - return std::error_code(); + return Error::success(); } std::error_code xcoff2yaml(raw_ostream &Out, const object::XCOFFObjectFile &Obj) { XCOFFDumper Dumper(Obj); - if (std::error_code EC = Dumper.dump()) - return EC; + if (Error E = Dumper.dump()) + return errorToErrorCode(std::move(E)); yaml::Output Yout(Out); Yout << Dumper.getYAMLObj();