1259698Sdim//===- ELFYAML.cpp - ELF YAMLIO implementation ----------------------------===// 2259698Sdim// 3259698Sdim// The LLVM Compiler Infrastructure 4259698Sdim// 5259698Sdim// This file is distributed under the University of Illinois Open Source 6259698Sdim// License. See LICENSE.TXT for details. 7259698Sdim// 8259698Sdim//===----------------------------------------------------------------------===// 9259698Sdim// 10259698Sdim// This file defines classes for handling the YAML representation of ELF. 11259698Sdim// 12259698Sdim//===----------------------------------------------------------------------===// 13259698Sdim 14259698Sdim#include "llvm/Object/ELFYAML.h" 15259698Sdim 16259698Sdimnamespace llvm { 17259698Sdimnamespace yaml { 18259698Sdim 19259698Sdimvoid 20259698SdimScalarEnumerationTraits<ELFYAML::ELF_ET>::enumeration(IO &IO, 21259698Sdim ELFYAML::ELF_ET &Value) { 22259698Sdim#define ECase(X) IO.enumCase(Value, #X, ELF::X); 23259698Sdim ECase(ET_NONE) 24259698Sdim ECase(ET_REL) 25259698Sdim ECase(ET_EXEC) 26259698Sdim ECase(ET_DYN) 27259698Sdim ECase(ET_CORE) 28259698Sdim#undef ECase 29259698Sdim} 30259698Sdim 31259698Sdimvoid 32259698SdimScalarEnumerationTraits<ELFYAML::ELF_EM>::enumeration(IO &IO, 33259698Sdim ELFYAML::ELF_EM &Value) { 34259698Sdim#define ECase(X) IO.enumCase(Value, #X, ELF::X); 35259698Sdim ECase(EM_NONE) 36259698Sdim ECase(EM_M32) 37259698Sdim ECase(EM_SPARC) 38259698Sdim ECase(EM_386) 39259698Sdim ECase(EM_68K) 40259698Sdim ECase(EM_88K) 41259698Sdim ECase(EM_486) 42259698Sdim ECase(EM_860) 43259698Sdim ECase(EM_MIPS) 44259698Sdim ECase(EM_S370) 45259698Sdim ECase(EM_MIPS_RS3_LE) 46259698Sdim ECase(EM_PARISC) 47259698Sdim ECase(EM_VPP500) 48259698Sdim ECase(EM_SPARC32PLUS) 49259698Sdim ECase(EM_960) 50259698Sdim ECase(EM_PPC) 51259698Sdim ECase(EM_PPC64) 52259698Sdim ECase(EM_S390) 53259698Sdim ECase(EM_SPU) 54259698Sdim ECase(EM_V800) 55259698Sdim ECase(EM_FR20) 56259698Sdim ECase(EM_RH32) 57259698Sdim ECase(EM_RCE) 58259698Sdim ECase(EM_ARM) 59259698Sdim ECase(EM_ALPHA) 60259698Sdim ECase(EM_SH) 61259698Sdim ECase(EM_SPARCV9) 62259698Sdim ECase(EM_TRICORE) 63259698Sdim ECase(EM_ARC) 64259698Sdim ECase(EM_H8_300) 65259698Sdim ECase(EM_H8_300H) 66259698Sdim ECase(EM_H8S) 67259698Sdim ECase(EM_H8_500) 68259698Sdim ECase(EM_IA_64) 69259698Sdim ECase(EM_MIPS_X) 70259698Sdim ECase(EM_COLDFIRE) 71259698Sdim ECase(EM_68HC12) 72259698Sdim ECase(EM_MMA) 73259698Sdim ECase(EM_PCP) 74259698Sdim ECase(EM_NCPU) 75259698Sdim ECase(EM_NDR1) 76259698Sdim ECase(EM_STARCORE) 77259698Sdim ECase(EM_ME16) 78259698Sdim ECase(EM_ST100) 79259698Sdim ECase(EM_TINYJ) 80259698Sdim ECase(EM_X86_64) 81259698Sdim ECase(EM_PDSP) 82259698Sdim ECase(EM_PDP10) 83259698Sdim ECase(EM_PDP11) 84259698Sdim ECase(EM_FX66) 85259698Sdim ECase(EM_ST9PLUS) 86259698Sdim ECase(EM_ST7) 87259698Sdim ECase(EM_68HC16) 88259698Sdim ECase(EM_68HC11) 89259698Sdim ECase(EM_68HC08) 90259698Sdim ECase(EM_68HC05) 91259698Sdim ECase(EM_SVX) 92259698Sdim ECase(EM_ST19) 93259698Sdim ECase(EM_VAX) 94259698Sdim ECase(EM_CRIS) 95259698Sdim ECase(EM_JAVELIN) 96259698Sdim ECase(EM_FIREPATH) 97259698Sdim ECase(EM_ZSP) 98259698Sdim ECase(EM_MMIX) 99259698Sdim ECase(EM_HUANY) 100259698Sdim ECase(EM_PRISM) 101259698Sdim ECase(EM_AVR) 102259698Sdim ECase(EM_FR30) 103259698Sdim ECase(EM_D10V) 104259698Sdim ECase(EM_D30V) 105259698Sdim ECase(EM_V850) 106259698Sdim ECase(EM_M32R) 107259698Sdim ECase(EM_MN10300) 108259698Sdim ECase(EM_MN10200) 109259698Sdim ECase(EM_PJ) 110259698Sdim ECase(EM_OPENRISC) 111259698Sdim ECase(EM_ARC_COMPACT) 112259698Sdim ECase(EM_XTENSA) 113259698Sdim ECase(EM_VIDEOCORE) 114259698Sdim ECase(EM_TMM_GPP) 115259698Sdim ECase(EM_NS32K) 116259698Sdim ECase(EM_TPC) 117259698Sdim ECase(EM_SNP1K) 118259698Sdim ECase(EM_ST200) 119259698Sdim ECase(EM_IP2K) 120259698Sdim ECase(EM_MAX) 121259698Sdim ECase(EM_CR) 122259698Sdim ECase(EM_F2MC16) 123259698Sdim ECase(EM_MSP430) 124259698Sdim ECase(EM_BLACKFIN) 125259698Sdim ECase(EM_SE_C33) 126259698Sdim ECase(EM_SEP) 127259698Sdim ECase(EM_ARCA) 128259698Sdim ECase(EM_UNICORE) 129259698Sdim ECase(EM_EXCESS) 130259698Sdim ECase(EM_DXP) 131259698Sdim ECase(EM_ALTERA_NIOS2) 132259698Sdim ECase(EM_CRX) 133259698Sdim ECase(EM_XGATE) 134259698Sdim ECase(EM_C166) 135259698Sdim ECase(EM_M16C) 136259698Sdim ECase(EM_DSPIC30F) 137259698Sdim ECase(EM_CE) 138259698Sdim ECase(EM_M32C) 139259698Sdim ECase(EM_TSK3000) 140259698Sdim ECase(EM_RS08) 141259698Sdim ECase(EM_SHARC) 142259698Sdim ECase(EM_ECOG2) 143259698Sdim ECase(EM_SCORE7) 144259698Sdim ECase(EM_DSP24) 145259698Sdim ECase(EM_VIDEOCORE3) 146259698Sdim ECase(EM_LATTICEMICO32) 147259698Sdim ECase(EM_SE_C17) 148259698Sdim ECase(EM_TI_C6000) 149259698Sdim ECase(EM_TI_C2000) 150259698Sdim ECase(EM_TI_C5500) 151259698Sdim ECase(EM_MMDSP_PLUS) 152259698Sdim ECase(EM_CYPRESS_M8C) 153259698Sdim ECase(EM_R32C) 154259698Sdim ECase(EM_TRIMEDIA) 155259698Sdim ECase(EM_HEXAGON) 156259698Sdim ECase(EM_8051) 157259698Sdim ECase(EM_STXP7X) 158259698Sdim ECase(EM_NDS32) 159259698Sdim ECase(EM_ECOG1) 160259698Sdim ECase(EM_ECOG1X) 161259698Sdim ECase(EM_MAXQ30) 162259698Sdim ECase(EM_XIMO16) 163259698Sdim ECase(EM_MANIK) 164259698Sdim ECase(EM_CRAYNV2) 165259698Sdim ECase(EM_RX) 166259698Sdim ECase(EM_METAG) 167259698Sdim ECase(EM_MCST_ELBRUS) 168259698Sdim ECase(EM_ECOG16) 169259698Sdim ECase(EM_CR16) 170259698Sdim ECase(EM_ETPU) 171259698Sdim ECase(EM_SLE9X) 172259698Sdim ECase(EM_L10M) 173259698Sdim ECase(EM_K10M) 174259698Sdim ECase(EM_AARCH64) 175259698Sdim ECase(EM_AVR32) 176259698Sdim ECase(EM_STM8) 177259698Sdim ECase(EM_TILE64) 178259698Sdim ECase(EM_TILEPRO) 179259698Sdim ECase(EM_CUDA) 180259698Sdim ECase(EM_TILEGX) 181259698Sdim ECase(EM_CLOUDSHIELD) 182259698Sdim ECase(EM_COREA_1ST) 183259698Sdim ECase(EM_COREA_2ND) 184259698Sdim ECase(EM_ARC_COMPACT2) 185259698Sdim ECase(EM_OPEN8) 186259698Sdim ECase(EM_RL78) 187259698Sdim ECase(EM_VIDEOCORE5) 188259698Sdim ECase(EM_78KOR) 189259698Sdim ECase(EM_56800EX) 190259698Sdim#undef ECase 191259698Sdim} 192259698Sdim 193259698Sdimvoid ScalarEnumerationTraits<ELFYAML::ELF_ELFCLASS>::enumeration( 194259698Sdim IO &IO, ELFYAML::ELF_ELFCLASS &Value) { 195259698Sdim#define ECase(X) IO.enumCase(Value, #X, ELF::X); 196259698Sdim // Since the semantics of ELFCLASSNONE is "invalid", just don't accept it 197259698Sdim // here. 198259698Sdim ECase(ELFCLASS32) 199259698Sdim ECase(ELFCLASS64) 200259698Sdim#undef ECase 201259698Sdim} 202259698Sdim 203259698Sdimvoid ScalarEnumerationTraits<ELFYAML::ELF_ELFDATA>::enumeration( 204259698Sdim IO &IO, ELFYAML::ELF_ELFDATA &Value) { 205259698Sdim#define ECase(X) IO.enumCase(Value, #X, ELF::X); 206259698Sdim // Since the semantics of ELFDATANONE is "invalid", just don't accept it 207259698Sdim // here. 208259698Sdim ECase(ELFDATA2LSB) 209259698Sdim ECase(ELFDATA2MSB) 210259698Sdim#undef ECase 211259698Sdim} 212259698Sdim 213259698Sdimvoid ScalarEnumerationTraits<ELFYAML::ELF_ELFOSABI>::enumeration( 214259698Sdim IO &IO, ELFYAML::ELF_ELFOSABI &Value) { 215259698Sdim#define ECase(X) IO.enumCase(Value, #X, ELF::X); 216259698Sdim ECase(ELFOSABI_NONE) 217259698Sdim ECase(ELFOSABI_HPUX) 218259698Sdim ECase(ELFOSABI_NETBSD) 219259698Sdim ECase(ELFOSABI_GNU) 220259698Sdim ECase(ELFOSABI_GNU) 221259698Sdim ECase(ELFOSABI_HURD) 222259698Sdim ECase(ELFOSABI_SOLARIS) 223259698Sdim ECase(ELFOSABI_AIX) 224259698Sdim ECase(ELFOSABI_IRIX) 225259698Sdim ECase(ELFOSABI_FREEBSD) 226259698Sdim ECase(ELFOSABI_TRU64) 227259698Sdim ECase(ELFOSABI_MODESTO) 228259698Sdim ECase(ELFOSABI_OPENBSD) 229259698Sdim ECase(ELFOSABI_OPENVMS) 230259698Sdim ECase(ELFOSABI_NSK) 231259698Sdim ECase(ELFOSABI_AROS) 232259698Sdim ECase(ELFOSABI_FENIXOS) 233259698Sdim ECase(ELFOSABI_C6000_ELFABI) 234259698Sdim ECase(ELFOSABI_C6000_LINUX) 235259698Sdim ECase(ELFOSABI_ARM) 236259698Sdim ECase(ELFOSABI_STANDALONE) 237259698Sdim#undef ECase 238259698Sdim} 239259698Sdim 240259698Sdimvoid ScalarEnumerationTraits<ELFYAML::ELF_SHT>::enumeration( 241259698Sdim IO &IO, ELFYAML::ELF_SHT &Value) { 242259698Sdim#define ECase(X) IO.enumCase(Value, #X, ELF::X); 243259698Sdim ECase(SHT_NULL) 244259698Sdim ECase(SHT_PROGBITS) 245259698Sdim // No SHT_SYMTAB. Use the top-level `Symbols` key instead. 246259698Sdim // FIXME: Issue a diagnostic with this information. 247259698Sdim ECase(SHT_STRTAB) 248259698Sdim ECase(SHT_RELA) 249259698Sdim ECase(SHT_HASH) 250259698Sdim ECase(SHT_DYNAMIC) 251259698Sdim ECase(SHT_NOTE) 252259698Sdim ECase(SHT_NOBITS) 253259698Sdim ECase(SHT_REL) 254259698Sdim ECase(SHT_SHLIB) 255259698Sdim ECase(SHT_DYNSYM) 256259698Sdim ECase(SHT_INIT_ARRAY) 257259698Sdim ECase(SHT_FINI_ARRAY) 258259698Sdim ECase(SHT_PREINIT_ARRAY) 259259698Sdim ECase(SHT_GROUP) 260259698Sdim ECase(SHT_SYMTAB_SHNDX) 261259698Sdim#undef ECase 262259698Sdim} 263259698Sdim 264259698Sdimvoid ScalarBitSetTraits<ELFYAML::ELF_SHF>::bitset(IO &IO, 265259698Sdim ELFYAML::ELF_SHF &Value) { 266259698Sdim#define BCase(X) IO.bitSetCase(Value, #X, ELF::X); 267259698Sdim BCase(SHF_WRITE) 268259698Sdim BCase(SHF_ALLOC) 269259698Sdim BCase(SHF_EXCLUDE) 270259698Sdim BCase(SHF_EXECINSTR) 271259698Sdim BCase(SHF_MERGE) 272259698Sdim BCase(SHF_STRINGS) 273259698Sdim BCase(SHF_INFO_LINK) 274259698Sdim BCase(SHF_LINK_ORDER) 275259698Sdim BCase(SHF_OS_NONCONFORMING) 276259698Sdim BCase(SHF_GROUP) 277259698Sdim BCase(SHF_TLS) 278259698Sdim#undef BCase 279259698Sdim} 280259698Sdim 281259698Sdimvoid ScalarEnumerationTraits<ELFYAML::ELF_STT>::enumeration( 282259698Sdim IO &IO, ELFYAML::ELF_STT &Value) { 283259698Sdim#define ECase(X) IO.enumCase(Value, #X, ELF::X); 284259698Sdim ECase(STT_NOTYPE) 285259698Sdim ECase(STT_OBJECT) 286259698Sdim ECase(STT_FUNC) 287259698Sdim ECase(STT_SECTION) 288259698Sdim ECase(STT_FILE) 289259698Sdim ECase(STT_COMMON) 290259698Sdim ECase(STT_TLS) 291259698Sdim ECase(STT_GNU_IFUNC) 292259698Sdim#undef ECase 293259698Sdim} 294259698Sdim 295259698Sdimvoid MappingTraits<ELFYAML::FileHeader>::mapping(IO &IO, 296259698Sdim ELFYAML::FileHeader &FileHdr) { 297259698Sdim IO.mapRequired("Class", FileHdr.Class); 298259698Sdim IO.mapRequired("Data", FileHdr.Data); 299259698Sdim IO.mapOptional("OSABI", FileHdr.OSABI, ELFYAML::ELF_ELFOSABI(0)); 300259698Sdim IO.mapRequired("Type", FileHdr.Type); 301259698Sdim IO.mapRequired("Machine", FileHdr.Machine); 302259698Sdim IO.mapOptional("Entry", FileHdr.Entry, Hex64(0)); 303259698Sdim} 304259698Sdim 305259698Sdimvoid MappingTraits<ELFYAML::Symbol>::mapping(IO &IO, ELFYAML::Symbol &Symbol) { 306259698Sdim IO.mapOptional("Name", Symbol.Name, StringRef()); 307259698Sdim IO.mapOptional("Type", Symbol.Type, ELFYAML::ELF_STT(0)); 308259698Sdim IO.mapOptional("Section", Symbol.Section, StringRef()); 309259698Sdim IO.mapOptional("Value", Symbol.Value, Hex64(0)); 310259698Sdim IO.mapOptional("Size", Symbol.Size, Hex64(0)); 311259698Sdim} 312259698Sdim 313259698Sdimvoid MappingTraits<ELFYAML::LocalGlobalWeakSymbols>::mapping( 314259698Sdim IO &IO, ELFYAML::LocalGlobalWeakSymbols &Symbols) { 315259698Sdim IO.mapOptional("Local", Symbols.Local); 316259698Sdim IO.mapOptional("Global", Symbols.Global); 317259698Sdim IO.mapOptional("Weak", Symbols.Weak); 318259698Sdim} 319259698Sdim 320259698Sdimvoid MappingTraits<ELFYAML::Section>::mapping(IO &IO, 321259698Sdim ELFYAML::Section &Section) { 322259698Sdim IO.mapOptional("Name", Section.Name, StringRef()); 323259698Sdim IO.mapRequired("Type", Section.Type); 324259698Sdim IO.mapOptional("Flags", Section.Flags, ELFYAML::ELF_SHF(0)); 325259698Sdim IO.mapOptional("Address", Section.Address, Hex64(0)); 326259698Sdim IO.mapOptional("Content", Section.Content); 327259698Sdim IO.mapOptional("Link", Section.Link); 328259698Sdim IO.mapOptional("AddressAlign", Section.AddressAlign, Hex64(0)); 329259698Sdim} 330259698Sdim 331259698Sdimvoid MappingTraits<ELFYAML::Object>::mapping(IO &IO, ELFYAML::Object &Object) { 332259698Sdim IO.mapRequired("FileHeader", Object.Header); 333259698Sdim IO.mapOptional("Sections", Object.Sections); 334259698Sdim IO.mapOptional("Symbols", Object.Symbols); 335259698Sdim} 336259698Sdim 337259698Sdim} // end namespace yaml 338259698Sdim} // end namespace llvm 339