1 //===-- XCOFFYAML.cpp - XCOFF YAMLIO implementation -------------*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // This file defines classes for handling the YAML representation of XCOFF. 10 // 11 //===----------------------------------------------------------------------===// 12 13 #include "llvm/ObjectYAML/XCOFFYAML.h" 14 #include "llvm/BinaryFormat/XCOFF.h" 15 #include <string.h> 16 17 namespace llvm { 18 namespace XCOFFYAML { 19 20 Object::Object() { memset(&Header, 0, sizeof(Header)); } 21 22 } // namespace XCOFFYAML 23 24 namespace yaml { 25 26 void ScalarBitSetTraits<XCOFF::SectionTypeFlags>::bitset( 27 IO &IO, XCOFF::SectionTypeFlags &Value) { 28 #define ECase(X) IO.bitSetCase(Value, #X, XCOFF::X) 29 ECase(STYP_PAD); 30 ECase(STYP_DWARF); 31 ECase(STYP_TEXT); 32 ECase(STYP_DATA); 33 ECase(STYP_BSS); 34 ECase(STYP_EXCEPT); 35 ECase(STYP_INFO); 36 ECase(STYP_TDATA); 37 ECase(STYP_TBSS); 38 ECase(STYP_LOADER); 39 ECase(STYP_DEBUG); 40 ECase(STYP_TYPCHK); 41 ECase(STYP_OVRFLO); 42 #undef ECase 43 } 44 45 void ScalarEnumerationTraits<XCOFF::StorageClass>::enumeration( 46 IO &IO, XCOFF::StorageClass &Value) { 47 #define ECase(X) IO.enumCase(Value, #X, XCOFF::X) 48 ECase(C_NULL); 49 ECase(C_AUTO); 50 ECase(C_EXT); 51 ECase(C_STAT); 52 ECase(C_REG); 53 ECase(C_EXTDEF); 54 ECase(C_LABEL); 55 ECase(C_ULABEL); 56 ECase(C_MOS); 57 ECase(C_ARG); 58 ECase(C_STRTAG); 59 ECase(C_MOU); 60 ECase(C_UNTAG); 61 ECase(C_TPDEF); 62 ECase(C_USTATIC); 63 ECase(C_ENTAG); 64 ECase(C_MOE); 65 ECase(C_REGPARM); 66 ECase(C_FIELD); 67 ECase(C_BLOCK); 68 ECase(C_FCN); 69 ECase(C_EOS); 70 ECase(C_FILE); 71 ECase(C_LINE); 72 ECase(C_ALIAS); 73 ECase(C_HIDDEN); 74 ECase(C_HIDEXT); 75 ECase(C_BINCL); 76 ECase(C_EINCL); 77 ECase(C_INFO); 78 ECase(C_WEAKEXT); 79 ECase(C_DWARF); 80 ECase(C_GSYM); 81 ECase(C_LSYM); 82 ECase(C_PSYM); 83 ECase(C_RSYM); 84 ECase(C_RPSYM); 85 ECase(C_STSYM); 86 ECase(C_TCSYM); 87 ECase(C_BCOMM); 88 ECase(C_ECOML); 89 ECase(C_ECOMM); 90 ECase(C_DECL); 91 ECase(C_ENTRY); 92 ECase(C_FUN); 93 ECase(C_BSTAT); 94 ECase(C_ESTAT); 95 ECase(C_GTLS); 96 ECase(C_STTLS); 97 ECase(C_EFCN); 98 #undef ECase 99 } 100 101 struct NSectionFlags { 102 NSectionFlags(IO &) : Flags(XCOFF::SectionTypeFlags(0)) {} 103 NSectionFlags(IO &, uint32_t C) : Flags(XCOFF::SectionTypeFlags(C)) {} 104 105 uint32_t denormalize(IO &) { return Flags; } 106 107 XCOFF::SectionTypeFlags Flags; 108 }; 109 110 void MappingTraits<XCOFFYAML::FileHeader>::mapping( 111 IO &IO, XCOFFYAML::FileHeader &FileHdr) { 112 IO.mapOptional("MagicNumber", FileHdr.Magic); 113 IO.mapOptional("NumberOfSections", FileHdr.NumberOfSections); 114 IO.mapOptional("CreationTime", FileHdr.TimeStamp); 115 IO.mapOptional("OffsetToSymbolTable", FileHdr.SymbolTableOffset); 116 IO.mapOptional("EntriesInSymbolTable", FileHdr.NumberOfSymTableEntries); 117 IO.mapOptional("AuxiliaryHeaderSize", FileHdr.AuxHeaderSize); 118 IO.mapOptional("Flags", FileHdr.Flags); 119 } 120 121 void MappingTraits<XCOFFYAML::AuxiliaryHeader>::mapping( 122 IO &IO, XCOFFYAML::AuxiliaryHeader &AuxHdr) { 123 IO.mapOptional("Magic", AuxHdr.Magic); 124 IO.mapOptional("Version", AuxHdr.Version); 125 IO.mapOptional("TextStartAddr", AuxHdr.TextStartAddr); 126 IO.mapOptional("DataStartAddr", AuxHdr.DataStartAddr); 127 IO.mapOptional("TOCAnchorAddr", AuxHdr.TOCAnchorAddr); 128 IO.mapOptional("TextSectionSize", AuxHdr.TextSize); 129 IO.mapOptional("DataSectionSize", AuxHdr.InitDataSize); 130 IO.mapOptional("BssSectionSize", AuxHdr.BssDataSize); 131 IO.mapOptional("SecNumOfEntryPoint", AuxHdr.SecNumOfEntryPoint); 132 IO.mapOptional("SecNumOfText", AuxHdr.SecNumOfText); 133 IO.mapOptional("SecNumOfData", AuxHdr.SecNumOfData); 134 IO.mapOptional("SecNumOfTOC", AuxHdr.SecNumOfTOC); 135 IO.mapOptional("SecNumOfLoader", AuxHdr.SecNumOfLoader); 136 IO.mapOptional("SecNumOfBSS", AuxHdr.SecNumOfBSS); 137 IO.mapOptional("MaxAlignOfText", AuxHdr.MaxAlignOfText); 138 IO.mapOptional("MaxAlignOfData", AuxHdr.MaxAlignOfData); 139 IO.mapOptional("ModuleType", AuxHdr.CpuFlag); 140 IO.mapOptional("TextPageSize", AuxHdr.TextPageSize); 141 IO.mapOptional("DataPageSize", AuxHdr.DataPageSize); 142 IO.mapOptional("StackPageSize", AuxHdr.StackPageSize); 143 IO.mapOptional("FlagAndTDataAlignment", AuxHdr.FlagAndTDataAlignment); 144 IO.mapOptional("EntryPointAddr", AuxHdr.EntryPointAddr); 145 IO.mapOptional("MaxStackSize", AuxHdr.MaxStackSize); 146 IO.mapOptional("MaxDataSize", AuxHdr.MaxDataSize); 147 IO.mapOptional("SecNumOfTData", AuxHdr.SecNumOfTData); 148 IO.mapOptional("SecNumOfTBSS", AuxHdr.SecNumOfTBSS); 149 IO.mapOptional("Flag", AuxHdr.Flag); 150 } 151 152 void MappingTraits<XCOFFYAML::Relocation>::mapping(IO &IO, 153 XCOFFYAML::Relocation &R) { 154 IO.mapOptional("Address", R.VirtualAddress); 155 IO.mapOptional("Symbol", R.SymbolIndex); 156 IO.mapOptional("Info", R.Info); 157 IO.mapOptional("Type", R.Type); 158 } 159 160 void MappingTraits<XCOFFYAML::Section>::mapping(IO &IO, 161 XCOFFYAML::Section &Sec) { 162 MappingNormalization<NSectionFlags, uint32_t> NC(IO, Sec.Flags); 163 IO.mapOptional("Name", Sec.SectionName); 164 IO.mapOptional("Address", Sec.Address); 165 IO.mapOptional("Size", Sec.Size); 166 IO.mapOptional("FileOffsetToData", Sec.FileOffsetToData); 167 IO.mapOptional("FileOffsetToRelocations", Sec.FileOffsetToRelocations); 168 IO.mapOptional("FileOffsetToLineNumbers", Sec.FileOffsetToLineNumbers); 169 IO.mapOptional("NumberOfRelocations", Sec.NumberOfRelocations); 170 IO.mapOptional("NumberOfLineNumbers", Sec.NumberOfLineNumbers); 171 IO.mapOptional("Flags", NC->Flags); 172 IO.mapOptional("SectionData", Sec.SectionData); 173 IO.mapOptional("Relocations", Sec.Relocations); 174 } 175 176 void MappingTraits<XCOFFYAML::Symbol>::mapping(IO &IO, XCOFFYAML::Symbol &S) { 177 IO.mapOptional("Name", S.SymbolName); 178 IO.mapOptional("Value", S.Value); 179 IO.mapOptional("Section", S.SectionName); 180 IO.mapOptional("SectionIndex", S.SectionIndex); 181 IO.mapOptional("Type", S.Type); 182 IO.mapOptional("StorageClass", S.StorageClass); 183 IO.mapOptional("NumberOfAuxEntries", S.NumberOfAuxEntries); 184 } 185 186 void MappingTraits<XCOFFYAML::StringTable>::mapping(IO &IO, XCOFFYAML::StringTable &Str) { 187 IO.mapOptional("ContentSize", Str.ContentSize); 188 IO.mapOptional("Length", Str.Length); 189 IO.mapOptional("Strings", Str.Strings); 190 IO.mapOptional("RawContent", Str.RawContent); 191 } 192 193 void MappingTraits<XCOFFYAML::Object>::mapping(IO &IO, XCOFFYAML::Object &Obj) { 194 IO.mapTag("!XCOFF", true); 195 IO.mapRequired("FileHeader", Obj.Header); 196 IO.mapOptional("AuxiliaryHeader", Obj.AuxHeader); 197 IO.mapOptional("Sections", Obj.Sections); 198 IO.mapOptional("Symbols", Obj.Symbols); 199 IO.mapOptional("StringTable", Obj.StrTbl); 200 } 201 202 } // namespace yaml 203 } // namespace llvm 204