1ab2eb2bfSHubert Tong //===-- XCOFFYAML.cpp - XCOFF YAMLIO implementation -------------*- C++ -*-===//
2ab2eb2bfSHubert Tong //
3ab2eb2bfSHubert Tong // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4ab2eb2bfSHubert Tong // See https://llvm.org/LICENSE.txt for license information.
5ab2eb2bfSHubert Tong // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6ab2eb2bfSHubert Tong //
7ab2eb2bfSHubert Tong //===----------------------------------------------------------------------===//
8ab2eb2bfSHubert Tong //
9ab2eb2bfSHubert Tong // This file defines classes for handling the YAML representation of XCOFF.
10ab2eb2bfSHubert Tong //
11ab2eb2bfSHubert Tong //===----------------------------------------------------------------------===//
12ab2eb2bfSHubert Tong
13ab2eb2bfSHubert Tong #include "llvm/ObjectYAML/XCOFFYAML.h"
149212206dSJason Liu #include "llvm/BinaryFormat/XCOFF.h"
15ab2eb2bfSHubert Tong #include <string.h>
16ab2eb2bfSHubert Tong
17ab2eb2bfSHubert Tong namespace llvm {
18ab2eb2bfSHubert Tong namespace XCOFFYAML {
19ab2eb2bfSHubert Tong
Object()20ab2eb2bfSHubert Tong Object::Object() { memset(&Header, 0, sizeof(Header)); }
21ab2eb2bfSHubert Tong
2281793640SEsme-Yi AuxSymbolEnt::~AuxSymbolEnt() = default;
2381793640SEsme-Yi
24ab2eb2bfSHubert Tong } // namespace XCOFFYAML
25ab2eb2bfSHubert Tong
26ab2eb2bfSHubert Tong namespace yaml {
27ab2eb2bfSHubert Tong
bitset(IO & IO,XCOFF::SectionTypeFlags & Value)2850bb1b93SEsme-Yi void ScalarBitSetTraits<XCOFF::SectionTypeFlags>::bitset(
2950bb1b93SEsme-Yi IO &IO, XCOFF::SectionTypeFlags &Value) {
3050bb1b93SEsme-Yi #define ECase(X) IO.bitSetCase(Value, #X, XCOFF::X)
3150bb1b93SEsme-Yi ECase(STYP_PAD);
3250bb1b93SEsme-Yi ECase(STYP_DWARF);
3350bb1b93SEsme-Yi ECase(STYP_TEXT);
3450bb1b93SEsme-Yi ECase(STYP_DATA);
3550bb1b93SEsme-Yi ECase(STYP_BSS);
3650bb1b93SEsme-Yi ECase(STYP_EXCEPT);
3750bb1b93SEsme-Yi ECase(STYP_INFO);
3850bb1b93SEsme-Yi ECase(STYP_TDATA);
3950bb1b93SEsme-Yi ECase(STYP_TBSS);
4050bb1b93SEsme-Yi ECase(STYP_LOADER);
4150bb1b93SEsme-Yi ECase(STYP_DEBUG);
4250bb1b93SEsme-Yi ECase(STYP_TYPCHK);
4350bb1b93SEsme-Yi ECase(STYP_OVRFLO);
4450bb1b93SEsme-Yi #undef ECase
4550bb1b93SEsme-Yi }
4650bb1b93SEsme-Yi
enumeration(IO & IO,XCOFF::DwarfSectionSubtypeFlags & Value)4726db8455Sstephenpeckham void ScalarEnumerationTraits<XCOFF::DwarfSectionSubtypeFlags>::enumeration(
4826db8455Sstephenpeckham IO &IO, XCOFF::DwarfSectionSubtypeFlags &Value) {
4926db8455Sstephenpeckham #define ECase(X) IO.enumCase(Value, #X, XCOFF::X)
5026db8455Sstephenpeckham ECase(SSUBTYP_DWINFO);
5126db8455Sstephenpeckham ECase(SSUBTYP_DWLINE);
5226db8455Sstephenpeckham ECase(SSUBTYP_DWPBNMS);
5326db8455Sstephenpeckham ECase(SSUBTYP_DWPBTYP);
5426db8455Sstephenpeckham ECase(SSUBTYP_DWARNGE);
5526db8455Sstephenpeckham ECase(SSUBTYP_DWABREV);
5626db8455Sstephenpeckham ECase(SSUBTYP_DWSTR);
5726db8455Sstephenpeckham ECase(SSUBTYP_DWRNGES);
5826db8455Sstephenpeckham ECase(SSUBTYP_DWLOC);
5926db8455Sstephenpeckham ECase(SSUBTYP_DWFRAME);
6026db8455Sstephenpeckham ECase(SSUBTYP_DWMAC);
6126db8455Sstephenpeckham #undef ECase
6226db8455Sstephenpeckham IO.enumFallback<Hex32>(Value);
6326db8455Sstephenpeckham }
6426db8455Sstephenpeckham
enumeration(IO & IO,XCOFF::StorageClass & Value)659212206dSJason Liu void ScalarEnumerationTraits<XCOFF::StorageClass>::enumeration(
669212206dSJason Liu IO &IO, XCOFF::StorageClass &Value) {
679212206dSJason Liu #define ECase(X) IO.enumCase(Value, #X, XCOFF::X)
689212206dSJason Liu ECase(C_NULL);
699212206dSJason Liu ECase(C_AUTO);
709212206dSJason Liu ECase(C_EXT);
719212206dSJason Liu ECase(C_STAT);
729212206dSJason Liu ECase(C_REG);
739212206dSJason Liu ECase(C_EXTDEF);
749212206dSJason Liu ECase(C_LABEL);
759212206dSJason Liu ECase(C_ULABEL);
769212206dSJason Liu ECase(C_MOS);
779212206dSJason Liu ECase(C_ARG);
789212206dSJason Liu ECase(C_STRTAG);
799212206dSJason Liu ECase(C_MOU);
809212206dSJason Liu ECase(C_UNTAG);
819212206dSJason Liu ECase(C_TPDEF);
829212206dSJason Liu ECase(C_USTATIC);
839212206dSJason Liu ECase(C_ENTAG);
849212206dSJason Liu ECase(C_MOE);
859212206dSJason Liu ECase(C_REGPARM);
869212206dSJason Liu ECase(C_FIELD);
879212206dSJason Liu ECase(C_BLOCK);
889212206dSJason Liu ECase(C_FCN);
899212206dSJason Liu ECase(C_EOS);
909212206dSJason Liu ECase(C_FILE);
919212206dSJason Liu ECase(C_LINE);
929212206dSJason Liu ECase(C_ALIAS);
939212206dSJason Liu ECase(C_HIDDEN);
949212206dSJason Liu ECase(C_HIDEXT);
959212206dSJason Liu ECase(C_BINCL);
969212206dSJason Liu ECase(C_EINCL);
979212206dSJason Liu ECase(C_INFO);
989212206dSJason Liu ECase(C_WEAKEXT);
999212206dSJason Liu ECase(C_DWARF);
1009212206dSJason Liu ECase(C_GSYM);
1019212206dSJason Liu ECase(C_LSYM);
1029212206dSJason Liu ECase(C_PSYM);
1039212206dSJason Liu ECase(C_RSYM);
1049212206dSJason Liu ECase(C_RPSYM);
1059212206dSJason Liu ECase(C_STSYM);
1069212206dSJason Liu ECase(C_TCSYM);
1079212206dSJason Liu ECase(C_BCOMM);
1089212206dSJason Liu ECase(C_ECOML);
1099212206dSJason Liu ECase(C_ECOMM);
1109212206dSJason Liu ECase(C_DECL);
1119212206dSJason Liu ECase(C_ENTRY);
1129212206dSJason Liu ECase(C_FUN);
1139212206dSJason Liu ECase(C_BSTAT);
1149212206dSJason Liu ECase(C_ESTAT);
1159212206dSJason Liu ECase(C_GTLS);
1169212206dSJason Liu ECase(C_STTLS);
1179212206dSJason Liu ECase(C_EFCN);
1189212206dSJason Liu #undef ECase
1199212206dSJason Liu }
1209212206dSJason Liu
enumeration(IO & IO,XCOFF::StorageMappingClass & Value)12181793640SEsme-Yi void ScalarEnumerationTraits<XCOFF::StorageMappingClass>::enumeration(
12281793640SEsme-Yi IO &IO, XCOFF::StorageMappingClass &Value) {
12381793640SEsme-Yi #define ECase(X) IO.enumCase(Value, #X, XCOFF::X)
12481793640SEsme-Yi ECase(XMC_PR);
12581793640SEsme-Yi ECase(XMC_RO);
12681793640SEsme-Yi ECase(XMC_DB);
12781793640SEsme-Yi ECase(XMC_GL);
12881793640SEsme-Yi ECase(XMC_XO);
12981793640SEsme-Yi ECase(XMC_SV);
13081793640SEsme-Yi ECase(XMC_SV64);
13181793640SEsme-Yi ECase(XMC_SV3264);
13281793640SEsme-Yi ECase(XMC_TI);
13381793640SEsme-Yi ECase(XMC_TB);
13481793640SEsme-Yi ECase(XMC_RW);
13581793640SEsme-Yi ECase(XMC_TC0);
13681793640SEsme-Yi ECase(XMC_TC);
13781793640SEsme-Yi ECase(XMC_TD);
13881793640SEsme-Yi ECase(XMC_DS);
13981793640SEsme-Yi ECase(XMC_UA);
14081793640SEsme-Yi ECase(XMC_BS);
14181793640SEsme-Yi ECase(XMC_UC);
14281793640SEsme-Yi ECase(XMC_TL);
14381793640SEsme-Yi ECase(XMC_UL);
14481793640SEsme-Yi ECase(XMC_TE);
14581793640SEsme-Yi #undef ECase
14681793640SEsme-Yi }
14781793640SEsme-Yi
enumeration(IO & IO,XCOFF::SymbolType & Value)1485aeabf2dSstephenpeckham void ScalarEnumerationTraits<XCOFF::SymbolType>::enumeration(
1495aeabf2dSstephenpeckham IO &IO, XCOFF::SymbolType &Value) {
1505aeabf2dSstephenpeckham #define ECase(X) IO.enumCase(Value, #X, XCOFF::X)
1515aeabf2dSstephenpeckham ECase(XTY_ER);
1525aeabf2dSstephenpeckham ECase(XTY_SD);
1535aeabf2dSstephenpeckham ECase(XTY_LD);
1545aeabf2dSstephenpeckham ECase(XTY_CM);
1555aeabf2dSstephenpeckham #undef ECase
1565aeabf2dSstephenpeckham IO.enumFallback<Hex8>(Value);
1575aeabf2dSstephenpeckham }
1585aeabf2dSstephenpeckham
enumeration(IO & IO,XCOFFYAML::AuxSymbolType & Type)15981793640SEsme-Yi void ScalarEnumerationTraits<XCOFFYAML::AuxSymbolType>::enumeration(
16081793640SEsme-Yi IO &IO, XCOFFYAML::AuxSymbolType &Type) {
16181793640SEsme-Yi #define ECase(X) IO.enumCase(Type, #X, XCOFFYAML::X)
16281793640SEsme-Yi ECase(AUX_EXCEPT);
16381793640SEsme-Yi ECase(AUX_FCN);
16481793640SEsme-Yi ECase(AUX_SYM);
16581793640SEsme-Yi ECase(AUX_FILE);
16681793640SEsme-Yi ECase(AUX_CSECT);
16781793640SEsme-Yi ECase(AUX_SECT);
16881793640SEsme-Yi ECase(AUX_STAT);
16981793640SEsme-Yi #undef ECase
17081793640SEsme-Yi }
17181793640SEsme-Yi
enumeration(IO & IO,XCOFF::CFileStringType & Type)17281793640SEsme-Yi void ScalarEnumerationTraits<XCOFF::CFileStringType>::enumeration(
17381793640SEsme-Yi IO &IO, XCOFF::CFileStringType &Type) {
17481793640SEsme-Yi #define ECase(X) IO.enumCase(Type, #X, XCOFF::X)
17581793640SEsme-Yi ECase(XFT_FN);
17681793640SEsme-Yi ECase(XFT_CT);
17781793640SEsme-Yi ECase(XFT_CV);
17881793640SEsme-Yi ECase(XFT_CD);
17981793640SEsme-Yi #undef ECase
18081793640SEsme-Yi }
18181793640SEsme-Yi
18250bb1b93SEsme-Yi struct NSectionFlags {
NSectionFlagsllvm::yaml::NSectionFlags18350bb1b93SEsme-Yi NSectionFlags(IO &) : Flags(XCOFF::SectionTypeFlags(0)) {}
NSectionFlagsllvm::yaml::NSectionFlags18450bb1b93SEsme-Yi NSectionFlags(IO &, uint32_t C) : Flags(XCOFF::SectionTypeFlags(C)) {}
18550bb1b93SEsme-Yi
denormalizellvm::yaml::NSectionFlags18650bb1b93SEsme-Yi uint32_t denormalize(IO &) { return Flags; }
18750bb1b93SEsme-Yi
18850bb1b93SEsme-Yi XCOFF::SectionTypeFlags Flags;
18950bb1b93SEsme-Yi };
19050bb1b93SEsme-Yi
mapping(IO & IO,XCOFFYAML::FileHeader & FileHdr)191ab2eb2bfSHubert Tong void MappingTraits<XCOFFYAML::FileHeader>::mapping(
192ab2eb2bfSHubert Tong IO &IO, XCOFFYAML::FileHeader &FileHdr) {
19350bb1b93SEsme-Yi IO.mapOptional("MagicNumber", FileHdr.Magic);
19450bb1b93SEsme-Yi IO.mapOptional("NumberOfSections", FileHdr.NumberOfSections);
19550bb1b93SEsme-Yi IO.mapOptional("CreationTime", FileHdr.TimeStamp);
19650bb1b93SEsme-Yi IO.mapOptional("OffsetToSymbolTable", FileHdr.SymbolTableOffset);
19750bb1b93SEsme-Yi IO.mapOptional("EntriesInSymbolTable", FileHdr.NumberOfSymTableEntries);
19850bb1b93SEsme-Yi IO.mapOptional("AuxiliaryHeaderSize", FileHdr.AuxHeaderSize);
19950bb1b93SEsme-Yi IO.mapOptional("Flags", FileHdr.Flags);
20050bb1b93SEsme-Yi }
20150bb1b93SEsme-Yi
mapping(IO & IO,XCOFFYAML::AuxiliaryHeader & AuxHdr)202ab97ffb9SEsme-Yi void MappingTraits<XCOFFYAML::AuxiliaryHeader>::mapping(
203ab97ffb9SEsme-Yi IO &IO, XCOFFYAML::AuxiliaryHeader &AuxHdr) {
204ab97ffb9SEsme-Yi IO.mapOptional("Magic", AuxHdr.Magic);
205ab97ffb9SEsme-Yi IO.mapOptional("Version", AuxHdr.Version);
206ab97ffb9SEsme-Yi IO.mapOptional("TextStartAddr", AuxHdr.TextStartAddr);
207ab97ffb9SEsme-Yi IO.mapOptional("DataStartAddr", AuxHdr.DataStartAddr);
208ab97ffb9SEsme-Yi IO.mapOptional("TOCAnchorAddr", AuxHdr.TOCAnchorAddr);
209ab97ffb9SEsme-Yi IO.mapOptional("TextSectionSize", AuxHdr.TextSize);
210ab97ffb9SEsme-Yi IO.mapOptional("DataSectionSize", AuxHdr.InitDataSize);
211ab97ffb9SEsme-Yi IO.mapOptional("BssSectionSize", AuxHdr.BssDataSize);
212ab97ffb9SEsme-Yi IO.mapOptional("SecNumOfEntryPoint", AuxHdr.SecNumOfEntryPoint);
213ab97ffb9SEsme-Yi IO.mapOptional("SecNumOfText", AuxHdr.SecNumOfText);
214ab97ffb9SEsme-Yi IO.mapOptional("SecNumOfData", AuxHdr.SecNumOfData);
215ab97ffb9SEsme-Yi IO.mapOptional("SecNumOfTOC", AuxHdr.SecNumOfTOC);
216ab97ffb9SEsme-Yi IO.mapOptional("SecNumOfLoader", AuxHdr.SecNumOfLoader);
217ab97ffb9SEsme-Yi IO.mapOptional("SecNumOfBSS", AuxHdr.SecNumOfBSS);
218ab97ffb9SEsme-Yi IO.mapOptional("MaxAlignOfText", AuxHdr.MaxAlignOfText);
219ab97ffb9SEsme-Yi IO.mapOptional("MaxAlignOfData", AuxHdr.MaxAlignOfData);
220ab97ffb9SEsme-Yi IO.mapOptional("ModuleType", AuxHdr.CpuFlag);
221ab97ffb9SEsme-Yi IO.mapOptional("TextPageSize", AuxHdr.TextPageSize);
222ab97ffb9SEsme-Yi IO.mapOptional("DataPageSize", AuxHdr.DataPageSize);
223ab97ffb9SEsme-Yi IO.mapOptional("StackPageSize", AuxHdr.StackPageSize);
224ab97ffb9SEsme-Yi IO.mapOptional("FlagAndTDataAlignment", AuxHdr.FlagAndTDataAlignment);
225ab97ffb9SEsme-Yi IO.mapOptional("EntryPointAddr", AuxHdr.EntryPointAddr);
226ab97ffb9SEsme-Yi IO.mapOptional("MaxStackSize", AuxHdr.MaxStackSize);
227ab97ffb9SEsme-Yi IO.mapOptional("MaxDataSize", AuxHdr.MaxDataSize);
228ab97ffb9SEsme-Yi IO.mapOptional("SecNumOfTData", AuxHdr.SecNumOfTData);
229ab97ffb9SEsme-Yi IO.mapOptional("SecNumOfTBSS", AuxHdr.SecNumOfTBSS);
230ab97ffb9SEsme-Yi IO.mapOptional("Flag", AuxHdr.Flag);
231ab97ffb9SEsme-Yi }
232ab97ffb9SEsme-Yi
mapping(IO & IO,XCOFFYAML::Relocation & R)23350bb1b93SEsme-Yi void MappingTraits<XCOFFYAML::Relocation>::mapping(IO &IO,
23450bb1b93SEsme-Yi XCOFFYAML::Relocation &R) {
23550bb1b93SEsme-Yi IO.mapOptional("Address", R.VirtualAddress);
23650bb1b93SEsme-Yi IO.mapOptional("Symbol", R.SymbolIndex);
23750bb1b93SEsme-Yi IO.mapOptional("Info", R.Info);
23850bb1b93SEsme-Yi IO.mapOptional("Type", R.Type);
23950bb1b93SEsme-Yi }
24050bb1b93SEsme-Yi
mapping(IO & IO,XCOFFYAML::Section & Sec)24150bb1b93SEsme-Yi void MappingTraits<XCOFFYAML::Section>::mapping(IO &IO,
24250bb1b93SEsme-Yi XCOFFYAML::Section &Sec) {
24350bb1b93SEsme-Yi MappingNormalization<NSectionFlags, uint32_t> NC(IO, Sec.Flags);
24450bb1b93SEsme-Yi IO.mapOptional("Name", Sec.SectionName);
24550bb1b93SEsme-Yi IO.mapOptional("Address", Sec.Address);
24650bb1b93SEsme-Yi IO.mapOptional("Size", Sec.Size);
24750bb1b93SEsme-Yi IO.mapOptional("FileOffsetToData", Sec.FileOffsetToData);
24850bb1b93SEsme-Yi IO.mapOptional("FileOffsetToRelocations", Sec.FileOffsetToRelocations);
24950bb1b93SEsme-Yi IO.mapOptional("FileOffsetToLineNumbers", Sec.FileOffsetToLineNumbers);
25050bb1b93SEsme-Yi IO.mapOptional("NumberOfRelocations", Sec.NumberOfRelocations);
25150bb1b93SEsme-Yi IO.mapOptional("NumberOfLineNumbers", Sec.NumberOfLineNumbers);
25250bb1b93SEsme-Yi IO.mapOptional("Flags", NC->Flags);
25326db8455Sstephenpeckham IO.mapOptional("DWARFSectionSubtype", Sec.SectionSubtype);
25450bb1b93SEsme-Yi IO.mapOptional("SectionData", Sec.SectionData);
25550bb1b93SEsme-Yi IO.mapOptional("Relocations", Sec.Relocations);
256ab2eb2bfSHubert Tong }
257ab2eb2bfSHubert Tong
auxSymMapping(IO & IO,XCOFFYAML::CsectAuxEnt & AuxSym,bool Is64)25881793640SEsme-Yi static void auxSymMapping(IO &IO, XCOFFYAML::CsectAuxEnt &AuxSym, bool Is64) {
25981793640SEsme-Yi IO.mapOptional("ParameterHashIndex", AuxSym.ParameterHashIndex);
26081793640SEsme-Yi IO.mapOptional("TypeChkSectNum", AuxSym.TypeChkSectNum);
26181793640SEsme-Yi IO.mapOptional("SymbolAlignmentAndType", AuxSym.SymbolAlignmentAndType);
2625aeabf2dSstephenpeckham IO.mapOptional("SymbolType", AuxSym.SymbolType);
2635aeabf2dSstephenpeckham IO.mapOptional("SymbolAlignment", AuxSym.SymbolAlignment);
26481793640SEsme-Yi IO.mapOptional("StorageMappingClass", AuxSym.StorageMappingClass);
26581793640SEsme-Yi if (Is64) {
26681793640SEsme-Yi IO.mapOptional("SectionOrLengthLo", AuxSym.SectionOrLengthLo);
26781793640SEsme-Yi IO.mapOptional("SectionOrLengthHi", AuxSym.SectionOrLengthHi);
26881793640SEsme-Yi } else {
26981793640SEsme-Yi IO.mapOptional("SectionOrLength", AuxSym.SectionOrLength);
27081793640SEsme-Yi IO.mapOptional("StabInfoIndex", AuxSym.StabInfoIndex);
27181793640SEsme-Yi IO.mapOptional("StabSectNum", AuxSym.StabSectNum);
27281793640SEsme-Yi }
27381793640SEsme-Yi }
27481793640SEsme-Yi
auxSymMapping(IO & IO,XCOFFYAML::FileAuxEnt & AuxSym)27581793640SEsme-Yi static void auxSymMapping(IO &IO, XCOFFYAML::FileAuxEnt &AuxSym) {
27681793640SEsme-Yi IO.mapOptional("FileNameOrString", AuxSym.FileNameOrString);
27781793640SEsme-Yi IO.mapOptional("FileStringType", AuxSym.FileStringType);
27881793640SEsme-Yi }
27981793640SEsme-Yi
auxSymMapping(IO & IO,XCOFFYAML::BlockAuxEnt & AuxSym,bool Is64)28081793640SEsme-Yi static void auxSymMapping(IO &IO, XCOFFYAML::BlockAuxEnt &AuxSym, bool Is64) {
28181793640SEsme-Yi if (Is64) {
28281793640SEsme-Yi IO.mapOptional("LineNum", AuxSym.LineNum);
28381793640SEsme-Yi } else {
28481793640SEsme-Yi IO.mapOptional("LineNumHi", AuxSym.LineNumHi);
28581793640SEsme-Yi IO.mapOptional("LineNumLo", AuxSym.LineNumLo);
28681793640SEsme-Yi }
28781793640SEsme-Yi }
28881793640SEsme-Yi
auxSymMapping(IO & IO,XCOFFYAML::FunctionAuxEnt & AuxSym,bool Is64)28981793640SEsme-Yi static void auxSymMapping(IO &IO, XCOFFYAML::FunctionAuxEnt &AuxSym,
29081793640SEsme-Yi bool Is64) {
29181793640SEsme-Yi if (!Is64)
29281793640SEsme-Yi IO.mapOptional("OffsetToExceptionTbl", AuxSym.OffsetToExceptionTbl);
29381793640SEsme-Yi IO.mapOptional("SizeOfFunction", AuxSym.SizeOfFunction);
29481793640SEsme-Yi IO.mapOptional("SymIdxOfNextBeyond", AuxSym.SymIdxOfNextBeyond);
29581793640SEsme-Yi IO.mapOptional("PtrToLineNum", AuxSym.PtrToLineNum);
29681793640SEsme-Yi }
29781793640SEsme-Yi
auxSymMapping(IO & IO,XCOFFYAML::ExcpetionAuxEnt & AuxSym)29881793640SEsme-Yi static void auxSymMapping(IO &IO, XCOFFYAML::ExcpetionAuxEnt &AuxSym) {
29981793640SEsme-Yi IO.mapOptional("OffsetToExceptionTbl", AuxSym.OffsetToExceptionTbl);
30081793640SEsme-Yi IO.mapOptional("SizeOfFunction", AuxSym.SizeOfFunction);
30181793640SEsme-Yi IO.mapOptional("SymIdxOfNextBeyond", AuxSym.SymIdxOfNextBeyond);
30281793640SEsme-Yi }
30381793640SEsme-Yi
auxSymMapping(IO & IO,XCOFFYAML::SectAuxEntForDWARF & AuxSym)30481793640SEsme-Yi static void auxSymMapping(IO &IO, XCOFFYAML::SectAuxEntForDWARF &AuxSym) {
30581793640SEsme-Yi IO.mapOptional("LengthOfSectionPortion", AuxSym.LengthOfSectionPortion);
30681793640SEsme-Yi IO.mapOptional("NumberOfRelocEnt", AuxSym.NumberOfRelocEnt);
30781793640SEsme-Yi }
30881793640SEsme-Yi
auxSymMapping(IO & IO,XCOFFYAML::SectAuxEntForStat & AuxSym)30981793640SEsme-Yi static void auxSymMapping(IO &IO, XCOFFYAML::SectAuxEntForStat &AuxSym) {
31081793640SEsme-Yi IO.mapOptional("SectionLength", AuxSym.SectionLength);
31181793640SEsme-Yi IO.mapOptional("NumberOfRelocEnt", AuxSym.NumberOfRelocEnt);
31281793640SEsme-Yi IO.mapOptional("NumberOfLineNum", AuxSym.NumberOfLineNum);
31381793640SEsme-Yi }
31481793640SEsme-Yi
315e4629371Sesmeyi template <typename AuxEntT>
ResetAuxSym(IO & IO,std::unique_ptr<XCOFFYAML::AuxSymbolEnt> & AuxSym)316e4629371Sesmeyi static void ResetAuxSym(IO &IO,
317e4629371Sesmeyi std::unique_ptr<XCOFFYAML::AuxSymbolEnt> &AuxSym) {
318e4629371Sesmeyi if (!IO.outputting())
319e4629371Sesmeyi AuxSym.reset(new AuxEntT);
320e4629371Sesmeyi }
321e4629371Sesmeyi
mapping(IO & IO,std::unique_ptr<XCOFFYAML::AuxSymbolEnt> & AuxSym)32281793640SEsme-Yi void MappingTraits<std::unique_ptr<XCOFFYAML::AuxSymbolEnt>>::mapping(
32381793640SEsme-Yi IO &IO, std::unique_ptr<XCOFFYAML::AuxSymbolEnt> &AuxSym) {
32481793640SEsme-Yi const bool Is64 =
32581793640SEsme-Yi static_cast<XCOFFYAML::Object *>(IO.getContext())->Header.Magic ==
32681793640SEsme-Yi (llvm::yaml::Hex16)XCOFF::XCOFF64;
327e4629371Sesmeyi
32881793640SEsme-Yi XCOFFYAML::AuxSymbolType AuxType;
329e4629371Sesmeyi if (IO.outputting())
330*75bc20ffSKazu Hirata AuxType = AuxSym->Type;
33181793640SEsme-Yi IO.mapRequired("Type", AuxType);
33281793640SEsme-Yi switch (AuxType) {
33381793640SEsme-Yi case XCOFFYAML::AUX_EXCEPT:
334e4629371Sesmeyi if (!Is64) {
33581793640SEsme-Yi IO.setError("an auxiliary symbol of type AUX_EXCEPT cannot be defined in "
33681793640SEsme-Yi "XCOFF32");
337e4629371Sesmeyi return;
338e4629371Sesmeyi }
339e4629371Sesmeyi ResetAuxSym<XCOFFYAML::ExcpetionAuxEnt>(IO, AuxSym);
34081793640SEsme-Yi auxSymMapping(IO, *cast<XCOFFYAML::ExcpetionAuxEnt>(AuxSym.get()));
34181793640SEsme-Yi break;
34281793640SEsme-Yi case XCOFFYAML::AUX_FCN:
343e4629371Sesmeyi ResetAuxSym<XCOFFYAML::FunctionAuxEnt>(IO, AuxSym);
34481793640SEsme-Yi auxSymMapping(IO, *cast<XCOFFYAML::FunctionAuxEnt>(AuxSym.get()), Is64);
34581793640SEsme-Yi break;
34681793640SEsme-Yi case XCOFFYAML::AUX_SYM:
347e4629371Sesmeyi ResetAuxSym<XCOFFYAML::BlockAuxEnt>(IO, AuxSym);
34881793640SEsme-Yi auxSymMapping(IO, *cast<XCOFFYAML::BlockAuxEnt>(AuxSym.get()), Is64);
34981793640SEsme-Yi break;
35081793640SEsme-Yi case XCOFFYAML::AUX_FILE:
351e4629371Sesmeyi ResetAuxSym<XCOFFYAML::FileAuxEnt>(IO, AuxSym);
35281793640SEsme-Yi auxSymMapping(IO, *cast<XCOFFYAML::FileAuxEnt>(AuxSym.get()));
35381793640SEsme-Yi break;
35481793640SEsme-Yi case XCOFFYAML::AUX_CSECT:
355e4629371Sesmeyi ResetAuxSym<XCOFFYAML::CsectAuxEnt>(IO, AuxSym);
35681793640SEsme-Yi auxSymMapping(IO, *cast<XCOFFYAML::CsectAuxEnt>(AuxSym.get()), Is64);
35781793640SEsme-Yi break;
35881793640SEsme-Yi case XCOFFYAML::AUX_SECT:
359e4629371Sesmeyi ResetAuxSym<XCOFFYAML::SectAuxEntForDWARF>(IO, AuxSym);
36081793640SEsme-Yi auxSymMapping(IO, *cast<XCOFFYAML::SectAuxEntForDWARF>(AuxSym.get()));
36181793640SEsme-Yi break;
36281793640SEsme-Yi case XCOFFYAML::AUX_STAT:
363e4629371Sesmeyi if (Is64) {
36481793640SEsme-Yi IO.setError(
36581793640SEsme-Yi "an auxiliary symbol of type AUX_STAT cannot be defined in XCOFF64");
366e4629371Sesmeyi return;
367e4629371Sesmeyi }
368e4629371Sesmeyi ResetAuxSym<XCOFFYAML::SectAuxEntForStat>(IO, AuxSym);
36981793640SEsme-Yi auxSymMapping(IO, *cast<XCOFFYAML::SectAuxEntForStat>(AuxSym.get()));
37081793640SEsme-Yi break;
37181793640SEsme-Yi }
37281793640SEsme-Yi }
37381793640SEsme-Yi
mapping(IO & IO,XCOFFYAML::Symbol & S)3749212206dSJason Liu void MappingTraits<XCOFFYAML::Symbol>::mapping(IO &IO, XCOFFYAML::Symbol &S) {
375909f3d73SEsme-Yi IO.mapOptional("Name", S.SymbolName);
37650bb1b93SEsme-Yi IO.mapOptional("Value", S.Value);
37750bb1b93SEsme-Yi IO.mapOptional("Section", S.SectionName);
378b98c3e95SEsme-Yi IO.mapOptional("SectionIndex", S.SectionIndex);
37950bb1b93SEsme-Yi IO.mapOptional("Type", S.Type);
38050bb1b93SEsme-Yi IO.mapOptional("StorageClass", S.StorageClass);
38150bb1b93SEsme-Yi IO.mapOptional("NumberOfAuxEntries", S.NumberOfAuxEntries);
38281793640SEsme-Yi IO.mapOptional("AuxEntries", S.AuxEntries);
3839212206dSJason Liu }
3849212206dSJason Liu
mapping(IO & IO,XCOFFYAML::StringTable & Str)3855aeabf2dSstephenpeckham void MappingTraits<XCOFFYAML::StringTable>::mapping(
3865aeabf2dSstephenpeckham IO &IO, XCOFFYAML::StringTable &Str) {
387909f3d73SEsme-Yi IO.mapOptional("ContentSize", Str.ContentSize);
388909f3d73SEsme-Yi IO.mapOptional("Length", Str.Length);
389909f3d73SEsme-Yi IO.mapOptional("Strings", Str.Strings);
390909f3d73SEsme-Yi IO.mapOptional("RawContent", Str.RawContent);
391909f3d73SEsme-Yi }
392909f3d73SEsme-Yi
mapping(IO & IO,XCOFFYAML::Object & Obj)393ab2eb2bfSHubert Tong void MappingTraits<XCOFFYAML::Object>::mapping(IO &IO, XCOFFYAML::Object &Obj) {
39481793640SEsme-Yi IO.setContext(&Obj);
395ab2eb2bfSHubert Tong IO.mapTag("!XCOFF", true);
396ab2eb2bfSHubert Tong IO.mapRequired("FileHeader", Obj.Header);
397ab97ffb9SEsme-Yi IO.mapOptional("AuxiliaryHeader", Obj.AuxHeader);
39850bb1b93SEsme-Yi IO.mapOptional("Sections", Obj.Sections);
39950bb1b93SEsme-Yi IO.mapOptional("Symbols", Obj.Symbols);
400909f3d73SEsme-Yi IO.mapOptional("StringTable", Obj.StrTbl);
40181793640SEsme-Yi IO.setContext(nullptr);
402ab2eb2bfSHubert Tong }
403ab2eb2bfSHubert Tong
404ab2eb2bfSHubert Tong } // namespace yaml
405ab2eb2bfSHubert Tong } // namespace llvm
406