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,105 @@ std::vector Relocations; }; +enum AuxSymbolType : uint8_t { + AUX_EXCEPT = 255, // 64-bit XCOFF file only. + AUX_FCN = 254, + AUX_SYM = 253, + AUX_FILE = 252, + AUX_CSECT = 251, + AUX_SECT = 250, + AUX_STAT = 249 // 32-bit XCOFF file only. +}; + +struct AuxSymbolEnt { + AuxSymbolType Type; + + explicit AuxSymbolEnt(AuxSymbolType T) : Type(T) {} + virtual ~AuxSymbolEnt(); +}; + +struct FileAuxEnt : AuxSymbolEnt { + Optional FileNameOrString; + Optional FileStringType; + + FileAuxEnt() : AuxSymbolEnt(AuxSymbolType::AUX_FILE) {} + static bool classof(const AuxSymbolEnt *S) { + return S->Type == AuxSymbolType::AUX_FILE; + } +}; + +struct CsectAuxEnt : AuxSymbolEnt { + Optional ParameterHashIndex; + Optional TypeChkSectNum; + Optional SymbolAlignmentAndType; + Optional StorageMappingClass; + Optional SectionOrLengthLo; + Optional SectionOrLengthHi; + Optional SectionOrLength; + Optional StabInfoIndex; + Optional StabSectNum; + + CsectAuxEnt() : AuxSymbolEnt(AuxSymbolType::AUX_CSECT) {} + static bool classof(const AuxSymbolEnt *S) { + return S->Type == AuxSymbolType::AUX_CSECT; + } +}; + +struct FunctionAuxEnt : AuxSymbolEnt { + Optional OffsetToExceptionTbl; + Optional PtrToLineNum; + Optional SizeOfFunction; + Optional SymIdxOfNextBeyond; + + FunctionAuxEnt() : AuxSymbolEnt(AuxSymbolType::AUX_FCN) {} + static bool classof(const AuxSymbolEnt *S) { + return S->Type == AuxSymbolType::AUX_FCN; + } +}; + +struct ExcpetionAuxEnt : AuxSymbolEnt { + Optional OffsetToExceptionTbl; + Optional SizeOfFunction; + Optional SymIdxOfNextBeyond; + + ExcpetionAuxEnt() : AuxSymbolEnt(AuxSymbolType::AUX_EXCEPT) {} + static bool classof(const AuxSymbolEnt *S) { + return S->Type == AuxSymbolType::AUX_EXCEPT; + } +}; // 64-bit XCOFF file only. + +struct BlockAuxEnt : AuxSymbolEnt { + Optional LineNum_Hi; + Optional LineNum_Lo; + Optional LineNum; + + BlockAuxEnt() : AuxSymbolEnt(AuxSymbolType::AUX_SYM) {} + static bool classof(const AuxSymbolEnt *S) { + return S->Type == AuxSymbolType::AUX_SYM; + } +}; + +struct SectAuxEntForDWARF : AuxSymbolEnt { + Optional LengthOfSectionPortion; + Optional NumberOfRelocEnt; + + SectAuxEntForDWARF() : AuxSymbolEnt(AuxSymbolType::AUX_SECT) {} + static bool classof(const AuxSymbolEnt *S) { + return S->Type == AuxSymbolType::AUX_SECT; + } +}; + +struct SectAuxEntForStat : AuxSymbolEnt { + Optional SectionLength; + Optional NumberOfRelocEnt; + Optional NumberOfLineNum; + + SectAuxEntForStat() : AuxSymbolEnt(AuxSymbolType::AUX_STAT) {} + static bool classof(const AuxSymbolEnt *S) { + return S->Type == AuxSymbolType::AUX_STAT; + } +}; // 32-bit XCOFF file only. + struct Symbol { StringRef SymbolName; llvm::yaml::Hex64 Value; // Symbol value; storage class-dependent. @@ -57,7 +156,8 @@ Optional SectionIndex; llvm::yaml::Hex16 Type; XCOFF::StorageClass StorageClass; - uint8_t NumberOfAuxEntries; + Optional NumberOfAuxEntries; + std::vector> AuxEntries; }; struct StringTable { @@ -81,6 +181,7 @@ LLVM_YAML_IS_SEQUENCE_VECTOR(XCOFFYAML::Symbol) LLVM_YAML_IS_SEQUENCE_VECTOR(XCOFFYAML::Relocation) LLVM_YAML_IS_SEQUENCE_VECTOR(XCOFFYAML::Section) +LLVM_YAML_IS_SEQUENCE_VECTOR(std::unique_ptr) namespace llvm { namespace yaml { @@ -93,10 +194,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 &Type); +}; + +template <> struct ScalarEnumerationTraits { + static void enumeration(IO &IO, XCOFFYAML::AuxSymbolType &Type); +}; + template <> struct MappingTraits { static void mapping(IO &IO, XCOFFYAML::FileHeader &H); }; +template <> struct MappingTraits> { + static void mapping(IO &IO, std::unique_ptr &AuxSym); +}; template <> struct MappingTraits { static void mapping(IO &IO, XCOFFYAML::Symbol &S); diff --git a/llvm/lib/ObjectYAML/XCOFFEmitter.cpp b/llvm/lib/ObjectYAML/XCOFFEmitter.cpp --- a/llvm/lib/ObjectYAML/XCOFFEmitter.cpp +++ b/llvm/lib/ObjectYAML/XCOFFEmitter.cpp @@ -46,6 +46,7 @@ bool initRelocations(uint64_t &CurrentOffset); bool initStringTable(); bool assignAddressesAndIndices(); + void writeFileHeader(); void writeSectionHeader(); bool writeSectionData(); @@ -53,6 +54,14 @@ bool writeSymbols(); void writeStringTable(); + void writeAuxSymbol(const XCOFFYAML::CsectAuxEnt &AuxSym); + void writeAuxSymbol(const XCOFFYAML::FileAuxEnt &AuxSym); + void writeAuxSymbol(const XCOFFYAML::FunctionAuxEnt &AuxSym); + void writeAuxSymbol(const XCOFFYAML::ExcpetionAuxEnt &AuxSym); + void writeAuxSymbol(const XCOFFYAML::BlockAuxEnt &AuxSym); + void writeAuxSymbol(const XCOFFYAML::SectAuxEntForDWARF &AuxSym); + void writeAuxSymbol(const XCOFFYAML::SectAuxEntForStat &AuxSym); + XCOFFYAML::Object &Obj; bool Is64Bit = false; support::endian::Writer W; @@ -193,6 +202,17 @@ } } + // Check if the file name in the File Auxiliary Entry should be addes to the + // string table. + for (XCOFFYAML::Symbol &YamlSym : Obj.Symbols) { + for (const std::unique_ptr &AuxSym : + YamlSym.AuxEntries) { + if (auto AS = dyn_cast(AuxSym.get())) + if (nameShouldBeInStringTable(AS->FileNameOrString.getValueOr(""))) + StrTblBuilder.add(AS->FileNameOrString.getValueOr("")); + } + } + StrTblBuilder.finalize(); size_t StrTblSize = StrTblBuilder.getSize(); @@ -213,9 +233,19 @@ InitFileHdr.NumberOfSections = Obj.Sections.size(); InitFileHdr.NumberOfSymTableEntries = Obj.Symbols.size(); - for (const XCOFFYAML::Symbol &YamlSym : Obj.Symbols) + for (XCOFFYAML::Symbol &YamlSym : Obj.Symbols) { + uint8_t AuxCount = YamlSym.AuxEntries.size(); + if (YamlSym.NumberOfAuxEntries && *YamlSym.NumberOfAuxEntries < AuxCount) + { + ErrHandler("specified NumberOfAuxEntries is less than the actual number " + "of auxiliary entries"); + return false; + } + YamlSym.NumberOfAuxEntries = + YamlSym.NumberOfAuxEntries.getValueOr(AuxCount); // Add the number of auxiliary symbols to the total number. - InitFileHdr.NumberOfSymTableEntries += YamlSym.NumberOfAuxEntries; + InitFileHdr.NumberOfSymTableEntries += *YamlSym.NumberOfAuxEntries; + } // Calculate SymbolTableOffset for the file header. if (InitFileHdr.NumberOfSymTableEntries) { @@ -364,6 +394,105 @@ return true; } +void XCOFFWriter::writeAuxSymbol(const XCOFFYAML::CsectAuxEnt &AuxSym) { + if (Is64Bit) { + W.write(AuxSym.SectionOrLengthLo.getValueOr(0)); + W.write(AuxSym.ParameterHashIndex.getValueOr(0)); + W.write(AuxSym.TypeChkSectNum.getValueOr(0)); + W.write(AuxSym.SymbolAlignmentAndType.getValueOr(0)); + W.write(AuxSym.StorageMappingClass.getValueOr(XCOFF::XMC_PR)); + W.write(AuxSym.SectionOrLengthHi.getValueOr(0)); + W.write(0); + W.write(XCOFF::AUX_CSECT); + } else { + W.write(AuxSym.SectionOrLength.getValueOr(0)); + W.write(AuxSym.ParameterHashIndex.getValueOr(0)); + W.write(AuxSym.TypeChkSectNum.getValueOr(0)); + W.write(AuxSym.SymbolAlignmentAndType.getValueOr(0)); + W.write(AuxSym.StorageMappingClass.getValueOr(XCOFF::XMC_PR)); + W.write(AuxSym.StabInfoIndex.getValueOr(0)); + W.write(AuxSym.StabSectNum.getValueOr(0)); + } +} + +void XCOFFWriter::writeAuxSymbol(const XCOFFYAML::ExcpetionAuxEnt &AuxSym) { + assert(Is64Bit && "can't write the exception auxiliary symbol for XCOFF32"); + W.write(AuxSym.OffsetToExceptionTbl.getValueOr(0)); + W.write(AuxSym.SizeOfFunction.getValueOr(0)); + W.write(AuxSym.SymIdxOfNextBeyond.getValueOr(0)); + W.write(0); + W.write(XCOFF::AUX_EXCEPT); +} + +void XCOFFWriter::writeAuxSymbol(const XCOFFYAML::FunctionAuxEnt &AuxSym) { + if (Is64Bit) { + W.write(AuxSym.PtrToLineNum.getValueOr(0)); + W.write(AuxSym.SizeOfFunction.getValueOr(0)); + W.write(AuxSym.SymIdxOfNextBeyond.getValueOr(0)); + W.write(0); + W.write(XCOFF::AUX_FCN); + } else { + W.write(AuxSym.OffsetToExceptionTbl.getValueOr(0)); + W.write(AuxSym.SizeOfFunction.getValueOr(0)); + W.write(AuxSym.PtrToLineNum.getValueOr(0)); + W.write(AuxSym.SymIdxOfNextBeyond.getValueOr(0)); + W.OS.write_zeros(2); + } +} + +void XCOFFWriter::writeAuxSymbol(const XCOFFYAML::FileAuxEnt &AuxSym) { + StringRef FileName = AuxSym.FileNameOrString.getValueOr(""); + if (nameShouldBeInStringTable(FileName)) { + W.write(0); + W.write(StrTblBuilder.getOffset(FileName)); + } else { + writeName(FileName, W); + } + W.OS.write_zeros(XCOFF::FileNamePadSize); + W.write(AuxSym.FileStringType.getValueOr(XCOFF::XFT_FN)); + if (Is64Bit) { + W.OS.write_zeros(2); + W.write(XCOFF::AUX_FILE); + } else { + W.OS.write_zeros(3); + } +} + +void XCOFFWriter::writeAuxSymbol(const XCOFFYAML::BlockAuxEnt &AuxSym) { + if (Is64Bit) { + W.write(AuxSym.LineNum.getValueOr(0)); + W.OS.write_zeros(13); + W.write(XCOFF::AUX_SYM); + } else { + W.OS.write_zeros(2); + W.write(AuxSym.LineNum_Hi.getValueOr(0)); + W.write(AuxSym.LineNum_Lo.getValueOr(0)); + W.OS.write_zeros(12); + } +} + +void XCOFFWriter::writeAuxSymbol(const XCOFFYAML::SectAuxEntForDWARF &AuxSym) { + if (Is64Bit) { + W.write(AuxSym.LengthOfSectionPortion.getValueOr(0)); + W.write(AuxSym.NumberOfRelocEnt.getValueOr(0)); + W.write(0); + W.write(XCOFF::AUX_SECT); + } else { + W.write(AuxSym.LengthOfSectionPortion.getValueOr(0)); + W.OS.write_zeros(4); + W.write(AuxSym.NumberOfRelocEnt.getValueOr(0)); + W.OS.write_zeros(6); + } +} + +void XCOFFWriter::writeAuxSymbol(const XCOFFYAML::SectAuxEntForStat &AuxSym) { + assert(!Is64Bit && "can't write the stat auxiliary symbol for XCOFF64"); + W.write(AuxSym.SectionLength.getValueOr(0)); + W.write(AuxSym.NumberOfRelocEnt.getValueOr(0)); + W.write(AuxSym.NumberOfLineNum.getValueOr(0)); + W.OS.write_zeros(10); +} + bool XCOFFWriter::writeSymbols() { int64_t PaddingSize = (uint64_t)InitFileHdr.SymbolTableOffset - (W.OS.tell() - StartOffset); @@ -406,16 +535,41 @@ } W.write(YamlSym.Type); W.write(YamlSym.StorageClass); - W.write(YamlSym.NumberOfAuxEntries); - - // Now output the auxiliary entry. - for (uint8_t I = 0, E = YamlSym.NumberOfAuxEntries; I < E; ++I) { - // TODO: Auxiliary entry is not supported yet. - // The auxiliary entries for a symbol follow its symbol table entry. The - // length of each auxiliary entry is the same as a symbol table entry (18 - // bytes). The format and quantity of auxiliary entries depend on the - // storage class (n_sclass) and type (n_type) of the symbol table entry. - W.OS.write_zeros(XCOFF::SymbolTableEntrySize); + + uint8_t NumOfAuxSym = YamlSym.NumberOfAuxEntries.getValueOr(0); + W.write(NumOfAuxSym); + + if (!NumOfAuxSym && !YamlSym.AuxEntries.size()) + continue; + + // Now write auxiliary entries. + if (!YamlSym.AuxEntries.size()) { + W.OS.write_zeros(XCOFF::SymbolTableEntrySize * NumOfAuxSym); + } else { + for (const std::unique_ptr &AuxSym : + YamlSym.AuxEntries) { + if (auto AS = dyn_cast(AuxSym.get())) + writeAuxSymbol(*AS); + else if (auto AS = dyn_cast(AuxSym.get())) + writeAuxSymbol(*AS); + else if (auto AS = dyn_cast(AuxSym.get())) + writeAuxSymbol(*AS); + else if (auto AS = dyn_cast(AuxSym.get())) + writeAuxSymbol(*AS); + else if (auto AS = dyn_cast(AuxSym.get())) + writeAuxSymbol(*AS); + else if (auto AS = + dyn_cast(AuxSym.get())) + writeAuxSymbol(*AS); + else if (auto AS = dyn_cast(AuxSym.get())) + writeAuxSymbol(*AS); + else + ErrHandler("unknown auxiliary symbol type: " + Twine(AuxSym->Type)); + } + // Pad with zeros. + if (NumOfAuxSym > YamlSym.AuxEntries.size()) + W.OS.write_zeros(XCOFF::SymbolTableEntrySize * + (NumOfAuxSym - YamlSym.AuxEntries.size())); } } return true; 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 @@ -19,6 +19,8 @@ Object::Object() { memset(&Header, 0, sizeof(Header)); } +AuxSymbolEnt::~AuxSymbolEnt() = default; + } // namespace XCOFFYAML namespace yaml { @@ -98,6 +100,56 @@ #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_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, XCOFFYAML::AuxSymbolType &Type) { +#define ECase(X) IO.enumCase(Type, #X, XCOFFYAML::X) + ECase(AUX_EXCEPT); + ECase(AUX_FCN); + ECase(AUX_SYM); + ECase(AUX_FILE); + ECase(AUX_CSECT); + ECase(AUX_SECT); + ECase(AUX_STAT); +#undef ECase +} + +void ScalarEnumerationTraits::enumeration( + IO &IO, XCOFF::CFileStringType &Type) { +#define ECase(X) IO.enumCase(Type, #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 +194,107 @@ IO.mapOptional("Relocations", Sec.Relocations); } +static void auxSymMapping(IO &IO, XCOFFYAML::CsectAuxEnt &AuxSym, bool Is64) { + IO.mapOptional("ParameterHashIndex", AuxSym.ParameterHashIndex); + IO.mapOptional("TypeChkSectNum", AuxSym.TypeChkSectNum); + IO.mapOptional("SymbolAlignmentAndType", AuxSym.SymbolAlignmentAndType); + IO.mapOptional("StorageMappingClass", AuxSym.StorageMappingClass); + if (Is64) { + IO.mapOptional("SectionOrLengthLo", AuxSym.SectionOrLengthLo); + IO.mapOptional("SectionOrLengthHi", AuxSym.SectionOrLengthHi); + } else { + IO.mapOptional("SectionOrLength", AuxSym.SectionOrLength); + IO.mapOptional("StabInfoIndex", AuxSym.StabInfoIndex); + IO.mapOptional("StabSectNum", AuxSym.StabSectNum); + } +} + +static void auxSymMapping(IO &IO, XCOFFYAML::FileAuxEnt &AuxSym) { + IO.mapOptional("FileNameOrString", AuxSym.FileNameOrString); + IO.mapOptional("FileStringType", AuxSym.FileStringType); +} + +static void auxSymMapping(IO &IO, XCOFFYAML::BlockAuxEnt &AuxSym, bool Is64) { + if (Is64) { + IO.mapOptional("LineNum", AuxSym.LineNum); + } else { + IO.mapOptional("LineNum_Hi", AuxSym.LineNum_Hi); + IO.mapOptional("LineNum_Lo", AuxSym.LineNum_Lo); + } +} + +static void auxSymMapping(IO &IO, XCOFFYAML::FunctionAuxEnt &AuxSym, + bool Is64) { + if (!Is64) + IO.mapOptional("OffsetToExceptionTbl", AuxSym.OffsetToExceptionTbl); + IO.mapOptional("SizeOfFunction", AuxSym.SizeOfFunction); + IO.mapOptional("SymIdxOfNextBeyond", AuxSym.SymIdxOfNextBeyond); + IO.mapOptional("PtrToLineNum", AuxSym.PtrToLineNum); +} + +static void auxSymMapping(IO &IO, XCOFFYAML::ExcpetionAuxEnt &AuxSym) { + IO.mapOptional("OffsetToExceptionTbl", AuxSym.OffsetToExceptionTbl); + IO.mapOptional("SizeOfFunction", AuxSym.SizeOfFunction); + IO.mapOptional("SymIdxOfNextBeyond", AuxSym.SymIdxOfNextBeyond); +} + +static void auxSymMapping(IO &IO, XCOFFYAML::SectAuxEntForDWARF &AuxSym) { + IO.mapOptional("LengthOfSectionPortion", AuxSym.LengthOfSectionPortion); + IO.mapOptional("NumberOfRelocEnt", AuxSym.NumberOfRelocEnt); +} + +static void auxSymMapping(IO &IO, XCOFFYAML::SectAuxEntForStat &AuxSym) { + IO.mapOptional("SectionLength", AuxSym.SectionLength); + IO.mapOptional("NumberOfRelocEnt", AuxSym.NumberOfRelocEnt); + IO.mapOptional("NumberOfLineNum", AuxSym.NumberOfLineNum); +} + +void MappingTraits>::mapping( + IO &IO, std::unique_ptr &AuxSym) { + assert(!IO.outputting() && "We don't dump aux symbols currently."); + const bool Is64 = + static_cast(IO.getContext())->Header.Magic == + (llvm::yaml::Hex16)XCOFF::XCOFF64; + XCOFFYAML::AuxSymbolType AuxType; + IO.mapRequired("Type", AuxType); + switch (AuxType) { + case XCOFFYAML::AUX_EXCEPT: + if (!Is64) + IO.setError("the exception auxiliary symbol table entry is defined in " + "XCOFF64 only"); + AuxSym.reset(new XCOFFYAML::ExcpetionAuxEnt()); + auxSymMapping(IO, *cast(AuxSym.get())); + break; + case XCOFFYAML::AUX_FCN: + AuxSym.reset(new XCOFFYAML::FunctionAuxEnt()); + auxSymMapping(IO, *cast(AuxSym.get()), Is64); + break; + case XCOFFYAML::AUX_SYM: + AuxSym.reset(new XCOFFYAML::BlockAuxEnt()); + auxSymMapping(IO, *cast(AuxSym.get()), Is64); + break; + case XCOFFYAML::AUX_FILE: + AuxSym.reset(new XCOFFYAML::FileAuxEnt()); + auxSymMapping(IO, *cast(AuxSym.get())); + break; + case XCOFFYAML::AUX_CSECT: + AuxSym.reset(new XCOFFYAML::CsectAuxEnt()); + auxSymMapping(IO, *cast(AuxSym.get()), Is64); + break; + case XCOFFYAML::AUX_SECT: + AuxSym.reset(new XCOFFYAML::SectAuxEntForDWARF()); + auxSymMapping(IO, *cast(AuxSym.get())); + break; + case XCOFFYAML::AUX_STAT: + if (Is64) + IO.setError("the section auxiliary entry for the C_STAT Symbol is " + "defined in XCOFF32 only"); + AuxSym.reset(new XCOFFYAML::SectAuxEntForStat()); + auxSymMapping(IO, *cast(AuxSym.get())); + break; + } +} + void MappingTraits::mapping(IO &IO, XCOFFYAML::Symbol &S) { IO.mapOptional("Name", S.SymbolName); IO.mapOptional("Value", S.Value); @@ -150,6 +303,8 @@ IO.mapOptional("Type", S.Type); IO.mapOptional("StorageClass", S.StorageClass); IO.mapOptional("NumberOfAuxEntries", S.NumberOfAuxEntries); + if (!IO.outputting()) + IO.mapOptional("AuxEntries", S.AuxEntries); } void MappingTraits::mapping(IO &IO, XCOFFYAML::StringTable &Str) { @@ -160,11 +315,13 @@ } void MappingTraits::mapping(IO &IO, XCOFFYAML::Object &Obj) { + IO.setContext(&Obj); IO.mapTag("!XCOFF", true); IO.mapRequired("FileHeader", Obj.Header); IO.mapOptional("Sections", Obj.Sections); IO.mapOptional("Symbols", Obj.Symbols); IO.mapOptional("StringTable", Obj.StrTbl); + IO.setContext(nullptr); } } // namespace yaml diff --git a/llvm/test/tools/yaml2obj/XCOFF/aux-symbols-defaults.yaml b/llvm/test/tools/yaml2obj/XCOFF/aux-symbols-defaults.yaml --- a/llvm/test/tools/yaml2obj/XCOFF/aux-symbols-defaults.yaml +++ b/llvm/test/tools/yaml2obj/XCOFF/aux-symbols-defaults.yaml @@ -0,0 +1,374 @@ +## Test that yaml2obj sets default values for the fields of auxiliary symbols. + +## AUX_CSECT symbol in XCOFF32 +# RUN: yaml2obj %s --docnum=1 -o %t1 +# RUN: llvm-readobj --syms %t1 | FileCheck %s --check-prefix=CSECT32 + +# CSECT32: Symbols [ +# CSECT32-NEXT: Symbol { +# CSECT32-NEXT: Index: 0 +# CSECT32-NEXT: Name: +# CSECT32-NEXT: Value (RelocatableAddress): 0x0 +# CSECT32-NEXT: Section: N_UNDEF +# CSECT32-NEXT: Type: 0x0 +# CSECT32-NEXT: StorageClass: C_EXT (0x2) +# CSECT32-NEXT: NumberOfAuxEntries: 1 +# CSECT32-NEXT: CSECT Auxiliary Entry { +# CSECT32-NEXT: Index: 1 +# CSECT32-NEXT: SectionLen: 0 +# CSECT32-NEXT: ParameterHashIndex: 0x0 +# CSECT32-NEXT: TypeChkSectNum: 0x0 +# CSECT32-NEXT: SymbolAlignmentLog2: 0 +# CSECT32-NEXT: SymbolType: XTY_ER (0x0) +# CSECT32-NEXT: StorageMappingClass: XMC_PR (0x0) +# CSECT32-NEXT: StabInfoIndex: 0x0 +# CSECT32-NEXT: StabSectNum: 0x0 +# CSECT32-NEXT: } +# CSECT32-NEXT: } +# CSECT32-NEXT: ] + +--- !XCOFF +FileHeader: + MagicNumber: [[MAGIC=0x1DF]] +Symbols: + - StorageClass: C_EXT + AuxEntries: + - Type: AUX_CSECT + +## AUX_CSECT symbol in XCOFF64 +# RUN: yaml2obj %s --docnum=1 -DMAGIC=0x1F7 -o %t2 +# RUN: llvm-readobj --syms %t2 | FileCheck %s --check-prefix=CSECT64 + +# CSECT64: Symbols [ +# CSECT64-NEXT: Symbol { +# CSECT64-NEXT: Index: 0 +# CSECT64-NEXT: Name: +# CSECT64-NEXT: Value (RelocatableAddress): 0x0 +# CSECT64-NEXT: Section: N_UNDEF +# CSECT64-NEXT: Type: 0x0 +# CSECT64-NEXT: StorageClass: C_EXT (0x2) +# CSECT64-NEXT: NumberOfAuxEntries: 1 +# CSECT64-NEXT: CSECT Auxiliary Entry { +# CSECT64-NEXT: Index: 1 +# CSECT64-NEXT: SectionLen: 0 +# CSECT64-NEXT: ParameterHashIndex: 0x0 +# CSECT64-NEXT: TypeChkSectNum: 0x0 +# CSECT64-NEXT: SymbolAlignmentLog2: 0 +# CSECT64-NEXT: SymbolType: XTY_ER (0x0) +# CSECT64-NEXT: StorageMappingClass: XMC_PR (0x0) +# CSECT64-NEXT: Auxiliary Type: AUX_CSECT (0xFB) +# CSECT64-NEXT: } +# CSECT64-NEXT: } +# CSECT64-NEXT: ] + +## AUX_STAT symbol in XCOFF32 +# RUN: yaml2obj %s --docnum=2 -o %t3 +# RUN: llvm-readobj --syms %t3 | FileCheck %s --check-prefix=STAT32 + +# STAT32: Symbols [ +# STAT32-NEXT: Symbol { +# STAT32-NEXT: Index: 0 +# STAT32-NEXT: Name: +# STAT32-NEXT: Value (RelocatableAddress): 0x0 +# STAT32-NEXT: Section: N_UNDEF +# STAT32-NEXT: Type: 0x0 +# STAT32-NEXT: StorageClass: C_STAT (0x3) +# STAT32-NEXT: NumberOfAuxEntries: 1 +# STAT32-NEXT: Sect Auxiliary Entry For Stat { +# STAT32-NEXT: Index: 1 +# STAT32-NEXT: SectionLength: 0 +# STAT32-NEXT: NumberOfRelocEnt: 0 +# STAT32-NEXT: NumberOfLineNum: 0 +# STAT32-NEXT: } +# STAT32-NEXT: } +# STAT32-NEXT: ] + +--- !XCOFF +FileHeader: + MagicNumber: 0x1DF +Symbols: + - StorageClass: C_STAT + AuxEntries: + - Type: AUX_STAT + +## AUX_FCN symbol in XCOFF32 +# RUN: yaml2obj %s --docnum=3 -o %t4 +# RUN: llvm-readobj --syms %t4 | FileCheck %s --check-prefix=FCN32 + +# FCN32: Symbols [ +# FCN32-NEXT: Symbol { +# FCN32-NEXT: Index: 0 +# FCN32-NEXT: Name: +# FCN32-NEXT: Value (RelocatableAddress): 0x0 +# FCN32-NEXT: Section: N_UNDEF +# FCN32-NEXT: Type: 0x20 +# FCN32-NEXT: StorageClass: C_EXT (0x2) +# FCN32-NEXT: NumberOfAuxEntries: 2 +# FCN32-NEXT: Function Auxiliary Entry { +# FCN32-NEXT: Index: 1 +# FCN32-NEXT: OffsetToExceptionTable: 0x0 +# FCN32-NEXT: SizeOfFunction: 0x0 +# FCN32-NEXT: PointerToLineNum: 0x0 +# FCN32-NEXT: SymbolIndexOfNextBeyond: 0 +# FCN32-NEXT: } +# FCN32-NEXT: CSECT Auxiliary Entry { +# FCN32-NEXT: Index: 2 +# FCN32-NEXT: SectionLen: 0 +# FCN32-NEXT: ParameterHashIndex: 0x0 +# FCN32-NEXT: TypeChkSectNum: 0x0 +# FCN32-NEXT: SymbolAlignmentLog2: 0 +# FCN32-NEXT: SymbolType: XTY_ER (0x0) +# FCN32-NEXT: StorageMappingClass: XMC_PR (0x0) +# FCN32-NEXT: StabInfoIndex: 0x0 +# FCN32-NEXT: StabSectNum: 0x0 +# FCN32-NEXT: } +# FCN32-NEXT: } +# FCN32-NEXT: ] + +--- !XCOFF +FileHeader: + MagicNumber: [[MAGIC=0x1DF]] +Symbols: + - StorageClass: C_EXT + Type: 0x20 + AuxEntries: + - Type: AUX_FCN + - Type: AUX_CSECT + +## AUX_FCN symbol in XCOFF64 +# RUN: yaml2obj %s --docnum=3 -DMAGIC=0x1F7 -o %t5 +# RUN: llvm-readobj --syms %t5 | FileCheck %s --check-prefix=FCN64 + +# FCN64: Symbols [ +# FCN64-NEXT: Symbol { +# FCN64-NEXT: Index: 0 +# FCN64-NEXT: Name: +# FCN64-NEXT: Value (RelocatableAddress): 0x0 +# FCN64-NEXT: Section: N_UNDEF +# FCN64-NEXT: Type: 0x20 +# FCN64-NEXT: StorageClass: C_EXT (0x2) +# FCN64-NEXT: NumberOfAuxEntries: 2 +# FCN64-NEXT: Function Auxiliary Entry { +# FCN64-NEXT: Index: 1 +# FCN64-NEXT: SizeOfFunction: 0x0 +# FCN64-NEXT: PointerToLineNum: 0x0 +# FCN64-NEXT: SymbolIndexOfNextBeyond: 0 +# FCN64-NEXT: Auxiliary Type: AUX_FCN (0xFE) +# FCN64-NEXT: } +# FCN64-NEXT: CSECT Auxiliary Entry { +# FCN64-NEXT: Index: 2 +# FCN64-NEXT: SectionLen: 0 +# FCN64-NEXT: ParameterHashIndex: 0x0 +# FCN64-NEXT: TypeChkSectNum: 0x0 +# FCN64-NEXT: SymbolAlignmentLog2: 0 +# FCN64-NEXT: SymbolType: XTY_ER (0x0) +# FCN64-NEXT: StorageMappingClass: XMC_PR (0x0) +# FCN64-NEXT: Auxiliary Type: AUX_CSECT (0xFB) +# FCN64-NEXT: } +# FCN64-NEXT: } +# FCN64-NEXT: ] + +## AUX_EXCEPT symbol in XCOFF64 +# RUN: yaml2obj %s --docnum=4 -DMAGIC=0x1F7 -o %t6 +# RUN: llvm-readobj --syms %t6 | FileCheck %s --check-prefix=EXCEPT64 + +# EXCEPT64: Symbols [ +# EXCEPT64-NEXT: Symbol { +# EXCEPT64-NEXT: Index: 0 +# EXCEPT64-NEXT: Name: +# EXCEPT64-NEXT: Value (RelocatableAddress): 0x0 +# EXCEPT64-NEXT: Section: N_UNDEF +# EXCEPT64-NEXT: Type: 0x20 +# EXCEPT64-NEXT: StorageClass: C_EXT (0x2) +# EXCEPT64-NEXT: NumberOfAuxEntries: 3 +# EXCEPT64-NEXT: Excpetion Auxiliary Entry { +# EXCEPT64-NEXT: Index: 1 +# EXCEPT64-NEXT: OffsetToExceptionTable: 0x0 +# EXCEPT64-NEXT: SizeOfFunction: 0x0 +# EXCEPT64-NEXT: SymbolIndexOfNextBeyond: 0 +# EXCEPT64-NEXT: Auxiliary Type: AUX_EXCEPT (0xFF) +# EXCEPT64-NEXT: } +# EXCEPT64-NEXT: Function Auxiliary Entry { +# EXCEPT64-NEXT: Index: 2 +# EXCEPT64-NEXT: SizeOfFunction: 0x0 +# EXCEPT64-NEXT: PointerToLineNum: 0x0 +# EXCEPT64-NEXT: SymbolIndexOfNextBeyond: 0 +# EXCEPT64-NEXT: Auxiliary Type: AUX_FCN (0xFE) +# EXCEPT64-NEXT: } +# EXCEPT64-NEXT: CSECT Auxiliary Entry { +# EXCEPT64-NEXT: Index: 3 +# EXCEPT64-NEXT: SectionLen: 0 +# EXCEPT64-NEXT: ParameterHashIndex: 0x0 +# EXCEPT64-NEXT: TypeChkSectNum: 0x0 +# EXCEPT64-NEXT: SymbolAlignmentLog2: 0 +# EXCEPT64-NEXT: SymbolType: XTY_ER (0x0) +# EXCEPT64-NEXT: StorageMappingClass: XMC_PR (0x0) +# EXCEPT64-NEXT: Auxiliary Type: AUX_CSECT (0xFB) +# EXCEPT64-NEXT: } +# EXCEPT64-NEXT: } +# EXCEPT64-NEXT: ] + +--- !XCOFF +FileHeader: + MagicNumber: 0x1F7 +Symbols: + - StorageClass: C_EXT + Type: 0x20 + AuxEntries: + - Type: AUX_EXCEPT + - Type: AUX_FCN + - Type: AUX_CSECT + +## AUX_SYM symbol in XCOFF32 +# RUN: yaml2obj %s --docnum=5 -o %t7 +# RUN: llvm-readobj --syms %t7 | FileCheck %s --check-prefix=SYM32 + +# SYM32: Symbols [ +# SYM32-NEXT: Symbol { +# SYM32-NEXT: Index: 0 +# SYM32-NEXT: Name: +# SYM32-NEXT: Value (RelocatableAddress): 0x0 +# SYM32-NEXT: Section: N_UNDEF +# SYM32-NEXT: Type: 0x0 +# SYM32-NEXT: StorageClass: C_BLOCK (0x64) +# SYM32-NEXT: NumberOfAuxEntries: 1 +# SYM32-NEXT: Block Auxiliary Entry { +# SYM32-NEXT: Index: 1 +# SYM32-NEXT: LineNumber(High 2 Bytes): 0x0 +# SYM32-NEXT: LineNumber(Low 2 Bytes): 0x0 +# SYM32-NEXT: } +# SYM32-NEXT: } +# SYM32-NEXT: ] + +--- !XCOFF +FileHeader: + MagicNumber: [[MAGIC=0x1DF]] +Symbols: + - StorageClass: C_BLOCK + AuxEntries: + - Type: AUX_SYM + +## AUX_SYM symbol in XCOFF64 +# RUN: yaml2obj %s --docnum=5 -DMAGIC=0x1F7 -o %t8 +# RUN: llvm-readobj --syms %t8 | FileCheck %s --check-prefix=SYM64 + +# SYM64: Symbols [ +# SYM64-NEXT: Symbol { +# SYM64-NEXT: Index: 0 +# SYM64-NEXT: Name: +# SYM64-NEXT: Value (RelocatableAddress): 0x0 +# SYM64-NEXT: Section: N_UNDEF +# SYM64-NEXT: Type: 0x0 +# SYM64-NEXT: StorageClass: C_BLOCK (0x64) +# SYM64-NEXT: NumberOfAuxEntries: 1 +# SYM64-NEXT: Block Auxiliary Entry { +# SYM64-NEXT: Index: 1 +# SYM64-NEXT: LineNumber: 0x0 +# SYM64-NEXT: Auxiliary Type: AUX_SYM (0xFD) +# SYM64-NEXT: } +# SYM64-NEXT: } +# SYM64-NEXT: ] + +## AUX_FILE symbol in XCOFF32 +# RUN: yaml2obj %s --docnum=6 -o %t9 +# RUN: llvm-readobj --syms %t9 | FileCheck %s --check-prefix=FILE32 + +# FILE32: Symbols [ +# FILE32-NEXT: Symbol { +# FILE32-NEXT: Index: 0 +# FILE32-NEXT: Name: +# FILE32-NEXT: Value (SymbolTableIndex): 0x0 +# FILE32-NEXT: Section: N_UNDEF +# FILE32-NEXT: Source Language ID: TB_C (0x0) +# FILE32-NEXT: CPU Version ID: 0x0 +# FILE32-NEXT: StorageClass: C_FILE (0x67) +# FILE32-NEXT: NumberOfAuxEntries: 1 +# FILE32-NEXT: File Auxiliary Entry { +# FILE32-NEXT: Index: 1 +# FILE32-NEXT: Name: +# FILE32-NEXT: Type: XFT_FN (0x0) +# FILE32-NEXT: } +# FILE32-NEXT: } +# FILE32-NEXT: ] + +--- !XCOFF +FileHeader: + MagicNumber: [[MAGIC=0x1DF]] +Symbols: + - StorageClass: C_FILE + AuxEntries: + - Type: AUX_FILE + +## AUX_FILE symbol in XCOFF64 +# RUN: yaml2obj %s --docnum=6 -DMAGIC=0x1F7 -o %t10 +# RUN: llvm-readobj --syms %t10 | FileCheck %s --check-prefix=FILE64 + +# FILE64: Symbols [ +# FILE64-NEXT: Symbol { +# FILE64-NEXT: Index: 0 +# FILE64-NEXT: Name: +# FILE64-NEXT: Value (SymbolTableIndex): 0x0 +# FILE64-NEXT: Section: N_UNDEF +# FILE64-NEXT: Source Language ID: TB_C (0x0) +# FILE64-NEXT: CPU Version ID: 0x0 +# FILE64-NEXT: StorageClass: C_FILE (0x67) +# FILE64-NEXT: NumberOfAuxEntries: 1 +# FILE64-NEXT: File Auxiliary Entry { +# FILE64-NEXT: Index: 1 +# FILE64-NEXT: Name: +# FILE64-NEXT: Type: XFT_FN (0x0) +# FILE64-NEXT: Auxiliary Type: AUX_FILE (0xFC) +# FILE64-NEXT: } +# FILE64-NEXT: } +# FILE64-NEXT: ] + +## AUX_SECT symbol in XCOFF32 +# RUN: yaml2obj %s --docnum=7 -o %t11 +# RUN: llvm-readobj --syms %t11 | FileCheck %s --check-prefix=SECT32 + +# SECT32: Symbols [ +# SECT32-NEXT: Symbol { +# SECT32-NEXT: Index: 0 +# SECT32-NEXT: Name: +# SECT32-NEXT: Value (OffsetInDWARF): 0x0 +# SECT32-NEXT: Section: N_UNDEF +# SECT32-NEXT: Type: 0x0 +# SECT32-NEXT: StorageClass: C_DWARF (0x70) +# SECT32-NEXT: NumberOfAuxEntries: 1 +# SECT32-NEXT: Sect Auxiliary Entry For DWARF { +# SECT32-NEXT: Index: 1 +# SECT32-NEXT: LengthOfSectionPortion: 0x0 +# SECT32-NEXT: NumberOfRelocEntries: 0 +# SECT32-NEXT: } +# SECT32-NEXT: } +# SECT32-NEXT: ] + +--- !XCOFF +FileHeader: + MagicNumber: [[MAGIC=0x1DF]] +Symbols: + - StorageClass: C_DWARF + AuxEntries: + - Type: AUX_SECT + +## AUX_SECT symbol in XCOFF64 +# RUN: yaml2obj %s --docnum=7 -DMAGIC=0x1F7 -o %t12 +# RUN: llvm-readobj --syms %t12 | FileCheck %s --check-prefix=SECT64 + +# SECT64: Symbols [ +# SECT64-NEXT: Symbol { +# SECT64-NEXT: Index: 0 +# SECT64-NEXT: Name: +# SECT64-NEXT: Value (OffsetInDWARF): 0x0 +# SECT64-NEXT: Section: N_UNDEF +# SECT64-NEXT: Type: 0x0 +# SECT64-NEXT: StorageClass: C_DWARF (0x70) +# SECT64-NEXT: NumberOfAuxEntries: 1 +# SECT64-NEXT: Sect Auxiliary Entry For DWARF { +# SECT64-NEXT: Index: 1 +# SECT64-NEXT: LengthOfSectionPortion: 0x0 +# SECT64-NEXT: NumberOfRelocEntries: 0 +# SECT64-NEXT: Auxiliary Type: AUX_SECT (0xFA) +# SECT64-NEXT: } +# SECT64-NEXT: } +# SECT64-NEXT: ] diff --git a/llvm/test/tools/yaml2obj/XCOFF/aux-symbols-full-contents.yaml b/llvm/test/tools/yaml2obj/XCOFF/aux-symbols-full-contents.yaml --- a/llvm/test/tools/yaml2obj/XCOFF/aux-symbols-full-contents.yaml +++ b/llvm/test/tools/yaml2obj/XCOFF/aux-symbols-full-contents.yaml @@ -0,0 +1,508 @@ +## Test that we can explicitly specify all fields for auxiliary symbols. + +## AUX_CSECT symbol in XCOFF32 +# RUN: yaml2obj %s --docnum=1 -o %t1 +# RUN: llvm-readobj --syms %t1 | FileCheck %s --check-prefix=CSECT32 + +# CSECT32: Symbols [ +# CSECT32-NEXT: Symbol { +# CSECT32-NEXT: Index: 0 +# CSECT32-NEXT: Name: +# CSECT32-NEXT: Value (RelocatableAddress): 0x0 +# CSECT32-NEXT: Section: N_UNDEF +# CSECT32-NEXT: Type: 0x0 +# CSECT32-NEXT: StorageClass: C_EXT (0x2) +# CSECT32-NEXT: NumberOfAuxEntries: 1 +# CSECT32-NEXT: CSECT Auxiliary Entry { +# CSECT32-NEXT: Index: 1 +# CSECT32-NEXT: SectionLen: 4 +# CSECT32-NEXT: ParameterHashIndex: 0x2 +# CSECT32-NEXT: TypeChkSectNum: 0x3 +# CSECT32-NEXT: SymbolAlignmentLog2: 0 +# CSECT32-NEXT: SymbolType: XTY_SD (0x1) +# CSECT32-NEXT: StorageMappingClass: XMC_RO (0x1) +# CSECT32-NEXT: StabInfoIndex: 0x5 +# CSECT32-NEXT: StabSectNum: 0x6 +# CSECT32-NEXT: } +# CSECT32-NEXT: } +# CSECT32-NEXT: ] + +--- !XCOFF +FileHeader: + MagicNumber: 0x1DF +Symbols: + - StorageClass: C_EXT + NumberOfAuxEntries: 1 + AuxEntries: + - Type: AUX_CSECT + ParameterHashIndex: 2 + TypeChkSectNum: 3 + SymbolAlignmentAndType: 1 + StorageMappingClass: XMC_RO + SectionOrLength: 4 + StabInfoIndex: 5 + StabSectNum: 6 + +## AUX_CSECT symbol in XCOFF64 +# RUN: yaml2obj %s --docnum=2 -o %t2 +# RUN: llvm-readobj --syms %t2 | FileCheck %s --check-prefix=CSECT64 + +# CSECT64: Symbols [ +# CSECT64-NEXT: Symbol { +# CSECT64-NEXT: Index: 0 +# CSECT64-NEXT: Name: +# CSECT64-NEXT: Value (RelocatableAddress): 0x0 +# CSECT64-NEXT: Section: N_UNDEF +# CSECT64-NEXT: Type: 0x0 +# CSECT64-NEXT: StorageClass: C_EXT (0x2) +# CSECT64-NEXT: NumberOfAuxEntries: 1 +# CSECT64-NEXT: CSECT Auxiliary Entry { +# CSECT64-NEXT: Index: 1 +# CSECT64-NEXT: SectionLen: 21474836484 +# CSECT64-NEXT: ParameterHashIndex: 0x2 +# CSECT64-NEXT: TypeChkSectNum: 0x3 +# CSECT64-NEXT: SymbolAlignmentLog2: 0 +# CSECT64-NEXT: SymbolType: XTY_SD (0x1) +# CSECT64-NEXT: StorageMappingClass: XMC_RO (0x1) +# CSECT64-NEXT: Auxiliary Type: AUX_CSECT (0xFB) +# CSECT64-NEXT: } +# CSECT64-NEXT: } +# CSECT64-NEXT: ] + +--- !XCOFF +FileHeader: + MagicNumber: 0x1F7 +Symbols: + - StorageClass: C_EXT + NumberOfAuxEntries: 1 + AuxEntries: + - Type: AUX_CSECT + ParameterHashIndex: 2 + TypeChkSectNum: 3 + SymbolAlignmentAndType: 1 + StorageMappingClass: XMC_RO + SectionOrLengthLo: 4 + SectionOrLengthHi: 5 + +## AUX_STAT symbol in XCOFF32 +# RUN: yaml2obj %s --docnum=3 -o %t3 +# RUN: llvm-readobj --syms %t3 | FileCheck %s --check-prefix=STAT32 + +# STAT32: Symbols [ +# STAT32-NEXT: Symbol { +# STAT32-NEXT: Index: 0 +# STAT32-NEXT: Name: +# STAT32-NEXT: Value (RelocatableAddress): 0x0 +# STAT32-NEXT: Section: N_UNDEF +# STAT32-NEXT: Type: 0x0 +# STAT32-NEXT: StorageClass: C_STAT (0x3) +# STAT32-NEXT: NumberOfAuxEntries: 1 +# STAT32-NEXT: Sect Auxiliary Entry For Stat { +# STAT32-NEXT: Index: 1 +# STAT32-NEXT: SectionLength: 2 +# STAT32-NEXT: NumberOfRelocEnt: 3 +# STAT32-NEXT: NumberOfLineNum: 4 +# STAT32-NEXT: } +# STAT32-NEXT: } +# STAT32-NEXT: ] + +--- !XCOFF +FileHeader: + MagicNumber: 0x1DF +Symbols: + - StorageClass: C_STAT + NumberOfAuxEntries: 1 + AuxEntries: + - Type: AUX_STAT + SectionLength: 2 + NumberOfRelocEnt: 3 + NumberOfLineNum: 4 + +## AUX_STAT symbol in XCOFF64 (error) +# RUN: not yaml2obj %s --docnum=4 -o %t4 2>&1 | FileCheck %s --check-prefix=STAT64 + +# STAT64: error: the section auxiliary entry for the C_STAT Symbol is defined in XCOFF32 only + +--- !XCOFF +FileHeader: + MagicNumber: 0x1F7 +Symbols: + - StorageClass: C_STAT + NumberOfAuxEntries: 1 + AuxEntries: + - Type: AUX_STAT + +## AUX_FCN symbol in XCOFF32 +# RUN: yaml2obj %s --docnum=5 -o %t5 +# RUN: llvm-readobj --syms %t5 | FileCheck %s --check-prefix=FCN32 + +# FCN32: Symbols [ +# FCN32-NEXT: Symbol { +# FCN32-NEXT: Index: 0 +# FCN32-NEXT: Name: +# FCN32-NEXT: Value (RelocatableAddress): 0x0 +# FCN32-NEXT: Section: N_UNDEF +# FCN32-NEXT: Type: 0x20 +# FCN32-NEXT: StorageClass: C_EXT (0x2) +# FCN32-NEXT: NumberOfAuxEntries: 2 +# FCN32-NEXT: Function Auxiliary Entry { +# FCN32-NEXT: Index: 1 +# FCN32-NEXT: OffsetToExceptionTable: 0x2 +# FCN32-NEXT: SizeOfFunction: 0x3 +# FCN32-NEXT: PointerToLineNum: 0x5 +# FCN32-NEXT: SymbolIndexOfNextBeyond: 4 +# FCN32-NEXT: } +# FCN32-NEXT: CSECT Auxiliary Entry { +# FCN32-NEXT: Index: 2 +# FCN32-NEXT: SectionLen: 0 +# FCN32-NEXT: ParameterHashIndex: 0x0 +# FCN32-NEXT: TypeChkSectNum: 0x0 +# FCN32-NEXT: SymbolAlignmentLog2: 0 +# FCN32-NEXT: SymbolType: XTY_ER (0x0) +# FCN32-NEXT: StorageMappingClass: XMC_PR (0x0) +# FCN32-NEXT: StabInfoIndex: 0x0 +# FCN32-NEXT: StabSectNum: 0x0 +# FCN32-NEXT: } +# FCN32-NEXT: } +# FCN32-NEXT: ] + +--- !XCOFF +FileHeader: + MagicNumber: [[MAGIC=0x1DF]] +Symbols: + - StorageClass: C_EXT + Type: 0x20 + NumberOfAuxEntries: 2 + AuxEntries: + - Type: AUX_FCN + OffsetToExceptionTbl: 2 + SizeOfFunction: 3 + SymIdxOfNextBeyond: 4 + PtrToLineNum: 5 + - Type: AUX_CSECT + +## AUX_FCN symbol in XCOFF64 +# RUN: yaml2obj %s --docnum=6 -o %t6 +# RUN: llvm-readobj --syms %t6 | FileCheck %s --check-prefix=FCN64 + +# FCN64: Symbols [ +# FCN64-NEXT: Symbol { +# FCN64-NEXT: Index: 0 +# FCN64-NEXT: Name: +# FCN64-NEXT: Value (RelocatableAddress): 0x0 +# FCN64-NEXT: Section: N_UNDEF +# FCN64-NEXT: Type: 0x20 +# FCN64-NEXT: StorageClass: C_EXT (0x2) +# FCN64-NEXT: NumberOfAuxEntries: 2 +# FCN64-NEXT: Function Auxiliary Entry { +# FCN64-NEXT: Index: 1 +# FCN64-NEXT: SizeOfFunction: 0x3 +# FCN64-NEXT: PointerToLineNum: 0x5 +# FCN64-NEXT: SymbolIndexOfNextBeyond: 4 +# FCN64-NEXT: Auxiliary Type: AUX_FCN (0xFE) +# FCN64-NEXT: } +# FCN64-NEXT: CSECT Auxiliary Entry { +# FCN64-NEXT: Index: 2 +# FCN64-NEXT: SectionLen: 0 +# FCN64-NEXT: ParameterHashIndex: 0x0 +# FCN64-NEXT: TypeChkSectNum: 0x0 +# FCN64-NEXT: SymbolAlignmentLog2: 0 +# FCN64-NEXT: SymbolType: XTY_ER (0x0) +# FCN64-NEXT: StorageMappingClass: XMC_PR (0x0) +# FCN64-NEXT: Auxiliary Type: AUX_CSECT (0xFB) +# FCN64-NEXT: } +# FCN64-NEXT: } +# FCN64-NEXT: ] + +--- !XCOFF +FileHeader: + MagicNumber: 0x1F7 +Symbols: + - StorageClass: C_EXT + Type: 0x20 + NumberOfAuxEntries: 2 + AuxEntries: + - Type: AUX_FCN + SizeOfFunction: 3 + SymIdxOfNextBeyond: 4 + PtrToLineNum: 5 + - Type: AUX_CSECT + +## AUX_EXCEPT symbol in XCOFF32 (error) +# RUN: not yaml2obj %s --docnum=7 -o %t7 2>&1 | FileCheck %s --check-prefix=EXCEPT32 + +# EXCEPT32: error: the exception auxiliary symbol table entry is defined in XCOFF64 only + +--- !XCOFF +FileHeader: + MagicNumber: 0x1DF +Symbols: + - StorageClass: C_EXT + NumberOfAuxEntries: 1 + AuxEntries: + - Type: AUX_EXCEPT + +## AUX_EXCEPT symbol in XCOFF64 +# RUN: yaml2obj %s --docnum=8 -o %t8 +# RUN: llvm-readobj --syms %t8 | FileCheck %s --check-prefix=EXCEPT64 + +# EXCEPT64: Symbols [ +# EXCEPT64-NEXT: Symbol { +# EXCEPT64-NEXT: Index: 0 +# EXCEPT64-NEXT: Name: +# EXCEPT64-NEXT: Value (RelocatableAddress): 0x0 +# EXCEPT64-NEXT: Section: N_UNDEF +# EXCEPT64-NEXT: Type: 0x20 +# EXCEPT64-NEXT: StorageClass: C_EXT (0x2) +# EXCEPT64-NEXT: NumberOfAuxEntries: 3 +# EXCEPT64-NEXT: Excpetion Auxiliary Entry { +# EXCEPT64-NEXT: Index: 1 +# EXCEPT64-NEXT: OffsetToExceptionTable: 0x2 +# EXCEPT64-NEXT: SizeOfFunction: 0x3 +# EXCEPT64-NEXT: SymbolIndexOfNextBeyond: 4 +# EXCEPT64-NEXT: Auxiliary Type: AUX_EXCEPT (0xFF) +# EXCEPT64-NEXT: } +# EXCEPT64-NEXT: Function Auxiliary Entry { +# EXCEPT64-NEXT: Index: 2 +# EXCEPT64-NEXT: SizeOfFunction: 0x0 +# EXCEPT64-NEXT: PointerToLineNum: 0x0 +# EXCEPT64-NEXT: SymbolIndexOfNextBeyond: 0 +# EXCEPT64-NEXT: Auxiliary Type: AUX_FCN (0xFE) +# EXCEPT64-NEXT: } +# EXCEPT64-NEXT: CSECT Auxiliary Entry { +# EXCEPT64-NEXT: Index: 3 +# EXCEPT64-NEXT: SectionLen: 0 +# EXCEPT64-NEXT: ParameterHashIndex: 0x0 +# EXCEPT64-NEXT: TypeChkSectNum: 0x0 +# EXCEPT64-NEXT: SymbolAlignmentLog2: 0 +# EXCEPT64-NEXT: SymbolType: XTY_ER (0x0) +# EXCEPT64-NEXT: StorageMappingClass: XMC_PR (0x0) +# EXCEPT64-NEXT: Auxiliary Type: AUX_CSECT (0xFB) +# EXCEPT64-NEXT: } +# EXCEPT64-NEXT: } +# EXCEPT64-NEXT: ] + +--- !XCOFF +FileHeader: + MagicNumber: 0x1F7 +Symbols: + - StorageClass: C_EXT + Type: 0x20 + NumberOfAuxEntries: 3 + AuxEntries: + - Type: AUX_EXCEPT + OffsetToExceptionTbl: 2 + SizeOfFunction: 3 + SymIdxOfNextBeyond: 4 + - Type: AUX_FCN + - Type: AUX_CSECT + +## AUX_SYM symbol in XCOFF32 +# RUN: yaml2obj %s --docnum=9 -o %t9 +# RUN: llvm-readobj --syms %t9 | FileCheck %s --check-prefix=SYM32 + +# SYM32: Symbols [ +# SYM32-NEXT: Symbol { +# SYM32-NEXT: Index: 0 +# SYM32-NEXT: Name: +# SYM32-NEXT: Value (RelocatableAddress): 0x0 +# SYM32-NEXT: Section: N_UNDEF +# SYM32-NEXT: Type: 0x0 +# SYM32-NEXT: StorageClass: C_BLOCK (0x64) +# SYM32-NEXT: NumberOfAuxEntries: 1 +# SYM32-NEXT: Block Auxiliary Entry { +# SYM32-NEXT: Index: 1 +# SYM32-NEXT: LineNumber(High 2 Bytes): 0x2 +# SYM32-NEXT: LineNumber(Low 2 Bytes): 0x3 +# SYM32-NEXT: } +# SYM32-NEXT: } +# SYM32-NEXT: ] + +--- !XCOFF +FileHeader: + MagicNumber: 0x1DF +Symbols: + - StorageClass: C_BLOCK + NumberOfAuxEntries: 1 + AuxEntries: + - Type: AUX_SYM + LineNum_Hi: 2 + LineNum_Lo: 3 + +## AUX_SYM symbol in XCOFF64 +# RUN: yaml2obj %s --docnum=10 -o %t10 +# RUN: llvm-readobj --syms %t10 | FileCheck %s --check-prefix=SYM64 + +# SYM64: Symbols [ +# SYM64-NEXT: Symbol { +# SYM64-NEXT: Index: 0 +# SYM64-NEXT: Name: +# SYM64-NEXT: Value (RelocatableAddress): 0x0 +# SYM64-NEXT: Section: N_UNDEF +# SYM64-NEXT: Type: 0x0 +# SYM64-NEXT: StorageClass: C_BLOCK (0x64) +# SYM64-NEXT: NumberOfAuxEntries: 1 +# SYM64-NEXT: Block Auxiliary Entry { +# SYM64-NEXT: Index: 1 +# SYM64-NEXT: LineNumber: 0x3 +# SYM64-NEXT: Auxiliary Type: AUX_SYM (0xFD) +# SYM64-NEXT: } +# SYM64-NEXT: } +# SYM64-NEXT: ] + +--- !XCOFF +FileHeader: + MagicNumber: 0x1F7 +Symbols: + - StorageClass: C_BLOCK + NumberOfAuxEntries: 1 + AuxEntries: + - Type: AUX_SYM + LineNum: 3 + +## AUX_FILE symbol in XCOFF32 +# RUN: yaml2obj %s --docnum=11 -o %t11 +# RUN: llvm-readobj --syms %t11 | FileCheck %s --check-prefix=FILE32 + +# FILE32: Symbols [ +# FILE32-NEXT: Symbol { +# FILE32-NEXT: Index: 0 +# FILE32-NEXT: Name: +# FILE32-NEXT: Value (SymbolTableIndex): 0x0 +# FILE32-NEXT: Section: N_UNDEF +# FILE32-NEXT: Source Language ID: TB_C (0x0) +# FILE32-NEXT: CPU Version ID: 0x0 +# FILE32-NEXT: StorageClass: C_FILE (0x67) +# FILE32-NEXT: NumberOfAuxEntries: 1 +# FILE32-NEXT: File Auxiliary Entry { +# FILE32-NEXT: Index: 1 +# FILE32-NEXT: Name: fname +# FILE32-NEXT: Type: XFT_CD (0x80) +# FILE32-NEXT: } +# FILE32-NEXT: } +# FILE32-NEXT: ] + +--- !XCOFF +FileHeader: + MagicNumber: [[MAGIC=0x1DF]] +Symbols: + - StorageClass: C_FILE + NumberOfAuxEntries: 1 + AuxEntries: + - Type: AUX_FILE + FileNameOrString: [[FILENAME='fname']] + FileStringType: XFT_CD + +## AUX_FILE symbol in XCOFF64 +# RUN: yaml2obj %s --docnum=11 -DMAGIC=0x1F7 -o %t12 +# RUN: llvm-readobj --syms %t12 | FileCheck %s --check-prefix=FILE64 + +# FILE64: Symbols [ +# FILE64-NEXT: Symbol { +# FILE64-NEXT: Index: 0 +# FILE64-NEXT: Name: +# FILE64-NEXT: Value (SymbolTableIndex): 0x0 +# FILE64-NEXT: Section: N_UNDEF +# FILE64-NEXT: Source Language ID: TB_C (0x0) +# FILE64-NEXT: CPU Version ID: 0x0 +# FILE64-NEXT: StorageClass: C_FILE (0x67) +# FILE64-NEXT: NumberOfAuxEntries: 1 +# FILE64-NEXT: File Auxiliary Entry { +# FILE64-NEXT: Index: 1 +# FILE64-NEXT: Name: fname +# FILE64-NEXT: Type: XFT_CD (0x80) +# FILE64-NEXT: Auxiliary Type: AUX_FILE (0xFC) +# FILE64-NEXT: } +# FILE64-NEXT: } +# FILE64-NEXT: ] + +## AUX_FILE (file name in the string table) +# RUN: yaml2obj %s --docnum=11 -DFILENAME='nameInStrTbl' -o %t13 +# RUN: llvm-readobj --syms %t13 | FileCheck %s --check-prefix=FILE-NAME + +# FILE-NAME: Symbols [ +# FILE-NAME-NEXT: Symbol { +# FILE-NAME-NEXT: Index: 0 +# FILE-NAME-NEXT: Name: +# FILE-NAME-NEXT: Value (SymbolTableIndex): 0x0 +# FILE-NAME-NEXT: Section: N_UNDEF +# FILE-NAME-NEXT: Source Language ID: TB_C (0x0) +# FILE-NAME-NEXT: CPU Version ID: 0x0 +# FILE-NAME-NEXT: StorageClass: C_FILE (0x67) +# FILE-NAME-NEXT: NumberOfAuxEntries: 1 +# FILE-NAME-NEXT: File Auxiliary Entry { +# FILE-NAME-NEXT: Index: 1 +# FILE-NAME-NEXT: Name: nameInStrTbl +# FILE-NAME-NEXT: Type: XFT_CD (0x80) +# FILE-NAME-NEXT: } +# FILE-NAME-NEXT: } +# FILE-NAME-NEXT: ] + +## AUX_SECT symbol in XCOFF32 +# RUN: yaml2obj %s --docnum=12 -o %t14 +# RUN: llvm-readobj --syms %t14 | FileCheck %s --check-prefix=SECT32 + +# SECT32: Symbols [ +# SECT32-NEXT: Symbol { +# SECT32-NEXT: Index: 0 +# SECT32-NEXT: Name: +# SECT32-NEXT: Value (OffsetInDWARF): 0x0 +# SECT32-NEXT: Section: N_UNDEF +# SECT32-NEXT: Type: 0x0 +# SECT32-NEXT: StorageClass: C_DWARF (0x70) +# SECT32-NEXT: NumberOfAuxEntries: 1 +# SECT32-NEXT: Sect Auxiliary Entry For DWARF { +# SECT32-NEXT: Index: 1 +# SECT32-NEXT: LengthOfSectionPortion: 0x2 +# SECT32-NEXT: NumberOfRelocEntries: 3 +# SECT32-NEXT: } +# SECT32-NEXT: } +# SECT32-NEXT: ] + +--- !XCOFF +FileHeader: + MagicNumber: [[MAGIC=0x1DF]] +Symbols: + - StorageClass: C_DWARF + NumberOfAuxEntries: 1 + AuxEntries: + - Type: AUX_SECT + LengthOfSectionPortion: 2 + NumberOfRelocEnt: 3 + +## AUX_SECT symbol in XCOFF64 +# RUN: yaml2obj %s --docnum=12 -DMAGIC=0x1F7 -o %t15 +# RUN: llvm-readobj --syms %t15 | FileCheck %s --check-prefix=SECT64 + +# SECT64: Symbols [ +# SECT64-NEXT: Symbol { +# SECT64-NEXT: Index: 0 +# SECT64-NEXT: Name: +# SECT64-NEXT: Value (OffsetInDWARF): 0x0 +# SECT64-NEXT: Section: N_UNDEF +# SECT64-NEXT: Type: 0x0 +# SECT64-NEXT: StorageClass: C_DWARF (0x70) +# SECT64-NEXT: NumberOfAuxEntries: 1 +# SECT64-NEXT: Sect Auxiliary Entry For DWARF { +# SECT64-NEXT: Index: 1 +# SECT64-NEXT: LengthOfSectionPortion: 0x2 +# SECT64-NEXT: NumberOfRelocEntries: 3 +# SECT64-NEXT: Auxiliary Type: AUX_SECT (0xFA) +# SECT64-NEXT: } +# SECT64-NEXT: } +# SECT64-NEXT: ] + +## The specified value of NumberOfAuxEntries should greater than the actual number of aux entries. +# RUN: not yaml2obj %s --docnum=13 -o %t16 2>&1 | FileCheck %s --check-prefix=AUXCOUNT + +# AUXCOUNT: yaml2obj: error: specified NumberOfAuxEntries is less than the actual number of auxiliary entries + +--- !XCOFF +FileHeader: + MagicNumber: 0x1DF +Symbols: + - StorageClass: C_EXT + NumberOfAuxEntries: 1 + AuxEntries: + - Type: AUX_FCN + - Type: AUX_CSECT 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 @@ -132,7 +132,14 @@ Sym.Type = SymbolEntRef.getSymbolType(); Sym.StorageClass = SymbolEntRef.getStorageClass(); Sym.NumberOfAuxEntries = SymbolEntRef.getNumberOfAuxEntries(); - Symbols.push_back(Sym); + + // TODO:: dump auxiliary symbols. + for (size_t I = 0; I < *Sym.NumberOfAuxEntries; I++) { + std::unique_ptr AuxSym; + Sym.AuxEntries.push_back(std::move(AuxSym)); + } + + Symbols.push_back(std::move(Sym)); } return Error::success();