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,32 @@ std::vector Relocations; }; +struct FileAuxEnt { + StringRef FileName; + XCOFF::CFileStringType Type; +}; + +struct CsectAuxEnt32 { + uint32_t SectionOrLength; + 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 +83,8 @@ llvm::yaml::Hex16 Type; XCOFF::StorageClass StorageClass; llvm::yaml::Hex8 NumberOfAuxEntries; + FileAuxEnt FileAuxEntry; + CsectAuxEnt32 CsectAuxEntry; }; struct Object { @@ -79,6 +107,14 @@ 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); }; @@ -99,6 +135,14 @@ static void mapping(IO &IO, XCOFFYAML::Symbol &S); }; +template <> struct MappingTraits { + static void mapping(IO &IO, XCOFFYAML::FileAuxEnt &FAE); +}; + +template <> struct MappingTraits { + static void mapping(IO &IO, XCOFFYAML::CsectAuxEnt32 &CAE32); +}; + } // namespace yaml } // namespace llvm 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 @@ -79,6 +79,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 +} + void MappingTraits::mapping( IO &IO, XCOFFYAML::FileHeader &FileHdr) { IO.mapOptional("MagicNumber", FileHdr.Magic); @@ -111,6 +149,21 @@ 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); @@ -118,6 +171,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 @@ -10,72 +10,213 @@ # CHECK-NEXT: AuxiliaryHeaderSize: 0 # CHECK-NEXT: Flags: 0x0 +# CHECK: Sections: +# CHECK-NEXT: - Name: "\x17Mg3\0" +# 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: 0x20 +# 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: "\x17Mg3\0" +# 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: 0x40 +# 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: Symbols: -# CHECK-NEXT: - Name: .file -# CHECK-NEXT: Value: 0x0 -# CHECK-NEXT: Section: N_DEBUG -# CHECK-NEXT: Type: 0x3 +# 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: 0x1 -# 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: 0x1 -# 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: 0x1 -# 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: 0x1 -# 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: 17 +# 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: 0x1 -# 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: 0x1 -# 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: 17 +# 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: 0x1 -# 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: 0x1 -# 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: 33 +# 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: 0x1 -# 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: 17 +# 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: 0x1 -# 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: 17 +# 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: 0x1 -# CHECK-NEXT: ... - +# CHECK-NEXT: CsectAuxEntry: +# CHECK-NEXT: SectionLen: 4 +# CHECK-NEXT: ParameterHashIndex: 0 +# CHECK-NEXT: TypeChkSectNum: 0 +# CHECK-NEXT: SymbolAlignmentAndType: 17 +# 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 @@ -19,7 +19,8 @@ const object::XCOFFObjectFile &Obj; XCOFFYAML::Object YAMLObj; void dumpHeader(); - std::error_code dumpSymbols(); + Error dumpSections(); + Error dumpSymbols(); public: XCOFFDumper(const object::XCOFFObjectFile &obj) : Obj(obj) {} @@ -30,7 +31,11 @@ std::error_code XCOFFDumper::dump() { dumpHeader(); - return dumpSymbols(); + if (Error E = dumpSections()) + return errorToErrorCode(std::move(E)); + if (Error E = dumpSymbols()) + return errorToErrorCode(std::move(E)); + return std::error_code(); } void XCOFFDumper::dumpHeader() { @@ -50,7 +55,58 @@ YAMLObj.Header.Flags = Obj.getFlags(); } -std::error_code XCOFFDumper::dumpSymbols() { +Error XCOFFDumper::dumpSections() { + std::vector &Sections = YAMLObj.Sections; + for (XCOFFSectionHeader32 S : Obj.sections32()) { + XCOFFYAML::Section YamlSec; + // Section header. + YamlSec.SectionName = S.getName(); + errs() << "Error section name: " << YamlSec.SectionName; + 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) { + // Only .text and .data sections have raw data. + if (S.Flags != XCOFF::STYP_TEXT && S.Flags != XCOFF::STYP_DATA) + return createStringError(std::errc::invalid_argument, + "the section should not have raw data"); + Expected> SecDataRefOrErr = Obj.getSectionContents(S); + if (!SecDataRefOrErr) + return SecDataRefOrErr.takeError(); + YamlSec.SectionData = SecDataRefOrErr.get(); + } + // Relocations. + if (S.NumberOfRelocations) { + // Only the .text, .data, .tdata, and STYP_DWARF sections have + // relocations. + if (S.Flags != XCOFF::STYP_TEXT && S.Flags != XCOFF::STYP_DATA && + S.Flags != XCOFF::STYP_TDATA && S.Flags != XCOFF::STYP_DWARF) + return createStringError(std::errc::invalid_argument, + "the section should not have relocations"); + 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); + } + } + Sections.push_back(YamlSec); + } + return Error::success(); +} + +Error XCOFFDumper::dumpSymbols() { std::vector &Symbols = YAMLObj.Symbols; for (const SymbolRef &S : Obj.symbols()) { @@ -60,7 +116,7 @@ Expected SymNameRefOrErr = Obj.getSymbolName(SymbolDRI); if (!SymNameRefOrErr) { - return errorToErrorCode(SymNameRefOrErr.takeError()); + return SymNameRefOrErr.takeError(); } Sym.SymbolName = SymNameRefOrErr.get(); @@ -69,17 +125,56 @@ Expected SectionNameRefOrErr = Obj.getSymbolSectionName(SymbolEntPtr); if (!SectionNameRefOrErr) - return errorToErrorCode(SectionNameRefOrErr.takeError()); + return SectionNameRefOrErr.takeError(); Sym.SectionName = SectionNameRefOrErr.get(); Sym.Type = SymbolEntPtr->SymbolType; Sym.StorageClass = SymbolEntPtr->StorageClass; Sym.NumberOfAuxEntries = SymbolEntPtr->NumberOfAuxEntries; + // Dump auxiliary entries. + switch (Sym.StorageClass) { + case XCOFF::C_FILE: + // A file auxiliary entry is optional. + if (Sym.NumberOfAuxEntries) { + const XCOFFFileAuxEnt *FileAuxEntPtr = + reinterpret_cast(SymbolEntPtr + 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); + const XCOFFCsectAuxEnt32 *CsectAuxEnt = + XCOFFSymRef.getXCOFFCsectAuxEnt32(); + XCOFFYAML::CsectAuxEnt32 &AuxEnt = Sym.CsectAuxEntry; + AuxEnt.SectionOrLength = CsectAuxEnt->SectionOrLength; + AuxEnt.ParameterHashIndex = CsectAuxEnt->ParameterHashIndex; + AuxEnt.TypeChkSecNum = CsectAuxEnt->TypeChkSectNum; + AuxEnt.SymbolAlignmentAndType = CsectAuxEnt->SymbolAlignmentAndType; + AuxEnt.StorageMappingClass = CsectAuxEnt->StorageMappingClass; + AuxEnt.StabSecNum = CsectAuxEnt->StabSectNum; + AuxEnt.StabInfoIndex = CsectAuxEnt->StabInfoIndex; + } 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, @@ -94,3 +189,4 @@ return std::error_code(); } +