1//===- ELFYAML.cpp - ELF YAMLIO implementation ----------------------------===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file defines classes for handling the YAML representation of ELF.
11//
12//===----------------------------------------------------------------------===//
13
14#include "llvm/Object/ELFYAML.h"
15#include "llvm/Support/Casting.h"
16
17namespace llvm {
18
19ELFYAML::Section::~Section() {}
20
21namespace yaml {
22
23void
24ScalarEnumerationTraits<ELFYAML::ELF_ET>::enumeration(IO &IO,
25                                                      ELFYAML::ELF_ET &Value) {
26#define ECase(X) IO.enumCase(Value, #X, ELF::X);
27  ECase(ET_NONE)
28  ECase(ET_REL)
29  ECase(ET_EXEC)
30  ECase(ET_DYN)
31  ECase(ET_CORE)
32#undef ECase
33}
34
35void
36ScalarEnumerationTraits<ELFYAML::ELF_EM>::enumeration(IO &IO,
37                                                      ELFYAML::ELF_EM &Value) {
38#define ECase(X) IO.enumCase(Value, #X, ELF::X);
39  ECase(EM_NONE)
40  ECase(EM_M32)
41  ECase(EM_SPARC)
42  ECase(EM_386)
43  ECase(EM_68K)
44  ECase(EM_88K)
45  ECase(EM_486)
46  ECase(EM_860)
47  ECase(EM_MIPS)
48  ECase(EM_S370)
49  ECase(EM_MIPS_RS3_LE)
50  ECase(EM_PARISC)
51  ECase(EM_VPP500)
52  ECase(EM_SPARC32PLUS)
53  ECase(EM_960)
54  ECase(EM_PPC)
55  ECase(EM_PPC64)
56  ECase(EM_S390)
57  ECase(EM_SPU)
58  ECase(EM_V800)
59  ECase(EM_FR20)
60  ECase(EM_RH32)
61  ECase(EM_RCE)
62  ECase(EM_ARM)
63  ECase(EM_ALPHA)
64  ECase(EM_SH)
65  ECase(EM_SPARCV9)
66  ECase(EM_TRICORE)
67  ECase(EM_ARC)
68  ECase(EM_H8_300)
69  ECase(EM_H8_300H)
70  ECase(EM_H8S)
71  ECase(EM_H8_500)
72  ECase(EM_IA_64)
73  ECase(EM_MIPS_X)
74  ECase(EM_COLDFIRE)
75  ECase(EM_68HC12)
76  ECase(EM_MMA)
77  ECase(EM_PCP)
78  ECase(EM_NCPU)
79  ECase(EM_NDR1)
80  ECase(EM_STARCORE)
81  ECase(EM_ME16)
82  ECase(EM_ST100)
83  ECase(EM_TINYJ)
84  ECase(EM_X86_64)
85  ECase(EM_PDSP)
86  ECase(EM_PDP10)
87  ECase(EM_PDP11)
88  ECase(EM_FX66)
89  ECase(EM_ST9PLUS)
90  ECase(EM_ST7)
91  ECase(EM_68HC16)
92  ECase(EM_68HC11)
93  ECase(EM_68HC08)
94  ECase(EM_68HC05)
95  ECase(EM_SVX)
96  ECase(EM_ST19)
97  ECase(EM_VAX)
98  ECase(EM_CRIS)
99  ECase(EM_JAVELIN)
100  ECase(EM_FIREPATH)
101  ECase(EM_ZSP)
102  ECase(EM_MMIX)
103  ECase(EM_HUANY)
104  ECase(EM_PRISM)
105  ECase(EM_AVR)
106  ECase(EM_FR30)
107  ECase(EM_D10V)
108  ECase(EM_D30V)
109  ECase(EM_V850)
110  ECase(EM_M32R)
111  ECase(EM_MN10300)
112  ECase(EM_MN10200)
113  ECase(EM_PJ)
114  ECase(EM_OPENRISC)
115  ECase(EM_ARC_COMPACT)
116  ECase(EM_XTENSA)
117  ECase(EM_VIDEOCORE)
118  ECase(EM_TMM_GPP)
119  ECase(EM_NS32K)
120  ECase(EM_TPC)
121  ECase(EM_SNP1K)
122  ECase(EM_ST200)
123  ECase(EM_IP2K)
124  ECase(EM_MAX)
125  ECase(EM_CR)
126  ECase(EM_F2MC16)
127  ECase(EM_MSP430)
128  ECase(EM_BLACKFIN)
129  ECase(EM_SE_C33)
130  ECase(EM_SEP)
131  ECase(EM_ARCA)
132  ECase(EM_UNICORE)
133  ECase(EM_EXCESS)
134  ECase(EM_DXP)
135  ECase(EM_ALTERA_NIOS2)
136  ECase(EM_CRX)
137  ECase(EM_XGATE)
138  ECase(EM_C166)
139  ECase(EM_M16C)
140  ECase(EM_DSPIC30F)
141  ECase(EM_CE)
142  ECase(EM_M32C)
143  ECase(EM_TSK3000)
144  ECase(EM_RS08)
145  ECase(EM_SHARC)
146  ECase(EM_ECOG2)
147  ECase(EM_SCORE7)
148  ECase(EM_DSP24)
149  ECase(EM_VIDEOCORE3)
150  ECase(EM_LATTICEMICO32)
151  ECase(EM_SE_C17)
152  ECase(EM_TI_C6000)
153  ECase(EM_TI_C2000)
154  ECase(EM_TI_C5500)
155  ECase(EM_MMDSP_PLUS)
156  ECase(EM_CYPRESS_M8C)
157  ECase(EM_R32C)
158  ECase(EM_TRIMEDIA)
159  ECase(EM_HEXAGON)
160  ECase(EM_8051)
161  ECase(EM_STXP7X)
162  ECase(EM_NDS32)
163  ECase(EM_ECOG1)
164  ECase(EM_ECOG1X)
165  ECase(EM_MAXQ30)
166  ECase(EM_XIMO16)
167  ECase(EM_MANIK)
168  ECase(EM_CRAYNV2)
169  ECase(EM_RX)
170  ECase(EM_METAG)
171  ECase(EM_MCST_ELBRUS)
172  ECase(EM_ECOG16)
173  ECase(EM_CR16)
174  ECase(EM_ETPU)
175  ECase(EM_SLE9X)
176  ECase(EM_L10M)
177  ECase(EM_K10M)
178  ECase(EM_AARCH64)
179  ECase(EM_AVR32)
180  ECase(EM_STM8)
181  ECase(EM_TILE64)
182  ECase(EM_TILEPRO)
183  ECase(EM_CUDA)
184  ECase(EM_TILEGX)
185  ECase(EM_CLOUDSHIELD)
186  ECase(EM_COREA_1ST)
187  ECase(EM_COREA_2ND)
188  ECase(EM_ARC_COMPACT2)
189  ECase(EM_OPEN8)
190  ECase(EM_RL78)
191  ECase(EM_VIDEOCORE5)
192  ECase(EM_78KOR)
193  ECase(EM_56800EX)
194#undef ECase
195}
196
197void ScalarEnumerationTraits<ELFYAML::ELF_ELFCLASS>::enumeration(
198    IO &IO, ELFYAML::ELF_ELFCLASS &Value) {
199#define ECase(X) IO.enumCase(Value, #X, ELF::X);
200  // Since the semantics of ELFCLASSNONE is "invalid", just don't accept it
201  // here.
202  ECase(ELFCLASS32)
203  ECase(ELFCLASS64)
204#undef ECase
205}
206
207void ScalarEnumerationTraits<ELFYAML::ELF_ELFDATA>::enumeration(
208    IO &IO, ELFYAML::ELF_ELFDATA &Value) {
209#define ECase(X) IO.enumCase(Value, #X, ELF::X);
210  // Since the semantics of ELFDATANONE is "invalid", just don't accept it
211  // here.
212  ECase(ELFDATA2LSB)
213  ECase(ELFDATA2MSB)
214#undef ECase
215}
216
217void ScalarEnumerationTraits<ELFYAML::ELF_ELFOSABI>::enumeration(
218    IO &IO, ELFYAML::ELF_ELFOSABI &Value) {
219#define ECase(X) IO.enumCase(Value, #X, ELF::X);
220  ECase(ELFOSABI_NONE)
221  ECase(ELFOSABI_HPUX)
222  ECase(ELFOSABI_NETBSD)
223  ECase(ELFOSABI_GNU)
224  ECase(ELFOSABI_GNU)
225  ECase(ELFOSABI_HURD)
226  ECase(ELFOSABI_SOLARIS)
227  ECase(ELFOSABI_AIX)
228  ECase(ELFOSABI_IRIX)
229  ECase(ELFOSABI_FREEBSD)
230  ECase(ELFOSABI_TRU64)
231  ECase(ELFOSABI_MODESTO)
232  ECase(ELFOSABI_OPENBSD)
233  ECase(ELFOSABI_OPENVMS)
234  ECase(ELFOSABI_NSK)
235  ECase(ELFOSABI_AROS)
236  ECase(ELFOSABI_FENIXOS)
237  ECase(ELFOSABI_C6000_ELFABI)
238  ECase(ELFOSABI_C6000_LINUX)
239  ECase(ELFOSABI_ARM)
240  ECase(ELFOSABI_STANDALONE)
241#undef ECase
242}
243
244void ScalarBitSetTraits<ELFYAML::ELF_EF>::bitset(IO &IO,
245                                                 ELFYAML::ELF_EF &Value) {
246  const auto *Object = static_cast<ELFYAML::Object *>(IO.getContext());
247  assert(Object && "The IO context is not initialized");
248#define BCase(X) IO.bitSetCase(Value, #X, ELF::X);
249#define BCaseMask(X, M) IO.maskedBitSetCase(Value, #X, ELF::X, ELF::M);
250  switch (Object->Header.Machine) {
251  case ELF::EM_ARM:
252    BCase(EF_ARM_SOFT_FLOAT)
253    BCase(EF_ARM_VFP_FLOAT)
254    BCaseMask(EF_ARM_EABI_UNKNOWN, EF_ARM_EABIMASK)
255    BCaseMask(EF_ARM_EABI_VER1, EF_ARM_EABIMASK)
256    BCaseMask(EF_ARM_EABI_VER2, EF_ARM_EABIMASK)
257    BCaseMask(EF_ARM_EABI_VER3, EF_ARM_EABIMASK)
258    BCaseMask(EF_ARM_EABI_VER4, EF_ARM_EABIMASK)
259    BCaseMask(EF_ARM_EABI_VER5, EF_ARM_EABIMASK)
260    break;
261  case ELF::EM_MIPS:
262    BCase(EF_MIPS_NOREORDER)
263    BCase(EF_MIPS_PIC)
264    BCase(EF_MIPS_CPIC)
265    BCase(EF_MIPS_ABI2)
266    BCase(EF_MIPS_32BITMODE)
267    BCase(EF_MIPS_ABI_O32)
268    BCase(EF_MIPS_MICROMIPS)
269    BCase(EF_MIPS_ARCH_ASE_M16)
270    BCaseMask(EF_MIPS_ARCH_1, EF_MIPS_ARCH)
271    BCaseMask(EF_MIPS_ARCH_2, EF_MIPS_ARCH)
272    BCaseMask(EF_MIPS_ARCH_3, EF_MIPS_ARCH)
273    BCaseMask(EF_MIPS_ARCH_4, EF_MIPS_ARCH)
274    BCaseMask(EF_MIPS_ARCH_5, EF_MIPS_ARCH)
275    BCaseMask(EF_MIPS_ARCH_32, EF_MIPS_ARCH)
276    BCaseMask(EF_MIPS_ARCH_64, EF_MIPS_ARCH)
277    BCaseMask(EF_MIPS_ARCH_32R2, EF_MIPS_ARCH)
278    BCaseMask(EF_MIPS_ARCH_64R2, EF_MIPS_ARCH)
279    BCaseMask(EF_MIPS_ARCH_32R6, EF_MIPS_ARCH)
280    BCaseMask(EF_MIPS_ARCH_64R6, EF_MIPS_ARCH)
281    break;
282  case ELF::EM_HEXAGON:
283    BCase(EF_HEXAGON_MACH_V2)
284    BCase(EF_HEXAGON_MACH_V3)
285    BCase(EF_HEXAGON_MACH_V4)
286    BCase(EF_HEXAGON_MACH_V5)
287    BCase(EF_HEXAGON_ISA_V2)
288    BCase(EF_HEXAGON_ISA_V3)
289    BCase(EF_HEXAGON_ISA_V4)
290    BCase(EF_HEXAGON_ISA_V5)
291    break;
292  default:
293    llvm_unreachable("Unsupported architecture");
294  }
295#undef BCase
296#undef BCaseMask
297}
298
299void ScalarEnumerationTraits<ELFYAML::ELF_SHT>::enumeration(
300    IO &IO, ELFYAML::ELF_SHT &Value) {
301#define ECase(X) IO.enumCase(Value, #X, ELF::X);
302  ECase(SHT_NULL)
303  ECase(SHT_PROGBITS)
304  // No SHT_SYMTAB. Use the top-level `Symbols` key instead.
305  // FIXME: Issue a diagnostic with this information.
306  ECase(SHT_STRTAB)
307  ECase(SHT_RELA)
308  ECase(SHT_HASH)
309  ECase(SHT_DYNAMIC)
310  ECase(SHT_NOTE)
311  ECase(SHT_NOBITS)
312  ECase(SHT_REL)
313  ECase(SHT_SHLIB)
314  ECase(SHT_DYNSYM)
315  ECase(SHT_INIT_ARRAY)
316  ECase(SHT_FINI_ARRAY)
317  ECase(SHT_PREINIT_ARRAY)
318  ECase(SHT_GROUP)
319  ECase(SHT_SYMTAB_SHNDX)
320  ECase(SHT_LOOS)
321  ECase(SHT_GNU_ATTRIBUTES)
322  ECase(SHT_GNU_HASH)
323  ECase(SHT_GNU_verdef)
324  ECase(SHT_GNU_verneed)
325  ECase(SHT_GNU_versym)
326  ECase(SHT_HIOS)
327  ECase(SHT_LOPROC)
328  ECase(SHT_ARM_EXIDX)
329  ECase(SHT_ARM_PREEMPTMAP)
330  ECase(SHT_ARM_ATTRIBUTES)
331  ECase(SHT_ARM_DEBUGOVERLAY)
332  ECase(SHT_ARM_OVERLAYSECTION)
333  ECase(SHT_HEX_ORDERED)
334  ECase(SHT_X86_64_UNWIND)
335  ECase(SHT_MIPS_REGINFO)
336  ECase(SHT_MIPS_OPTIONS)
337#undef ECase
338}
339
340void ScalarBitSetTraits<ELFYAML::ELF_SHF>::bitset(IO &IO,
341                                                  ELFYAML::ELF_SHF &Value) {
342#define BCase(X) IO.bitSetCase(Value, #X, ELF::X);
343  BCase(SHF_WRITE)
344  BCase(SHF_ALLOC)
345  BCase(SHF_EXCLUDE)
346  BCase(SHF_EXECINSTR)
347  BCase(SHF_MERGE)
348  BCase(SHF_STRINGS)
349  BCase(SHF_INFO_LINK)
350  BCase(SHF_LINK_ORDER)
351  BCase(SHF_OS_NONCONFORMING)
352  BCase(SHF_GROUP)
353  BCase(SHF_TLS)
354#undef BCase
355}
356
357void ScalarEnumerationTraits<ELFYAML::ELF_STT>::enumeration(
358    IO &IO, ELFYAML::ELF_STT &Value) {
359#define ECase(X) IO.enumCase(Value, #X, ELF::X);
360  ECase(STT_NOTYPE)
361  ECase(STT_OBJECT)
362  ECase(STT_FUNC)
363  ECase(STT_SECTION)
364  ECase(STT_FILE)
365  ECase(STT_COMMON)
366  ECase(STT_TLS)
367  ECase(STT_GNU_IFUNC)
368#undef ECase
369}
370
371void ScalarEnumerationTraits<ELFYAML::ELF_STV>::enumeration(
372    IO &IO, ELFYAML::ELF_STV &Value) {
373#define ECase(X) IO.enumCase(Value, #X, ELF::X);
374  ECase(STV_DEFAULT)
375  ECase(STV_INTERNAL)
376  ECase(STV_HIDDEN)
377  ECase(STV_PROTECTED)
378#undef ECase
379}
380
381void ScalarEnumerationTraits<ELFYAML::ELF_REL>::enumeration(
382    IO &IO, ELFYAML::ELF_REL &Value) {
383  const auto *Object = static_cast<ELFYAML::Object *>(IO.getContext());
384  assert(Object && "The IO context is not initialized");
385#define ECase(X) IO.enumCase(Value, #X, ELF::X);
386  switch (Object->Header.Machine) {
387  case ELF::EM_X86_64:
388    ECase(R_X86_64_NONE)
389    ECase(R_X86_64_64)
390    ECase(R_X86_64_PC32)
391    ECase(R_X86_64_GOT32)
392    ECase(R_X86_64_PLT32)
393    ECase(R_X86_64_COPY)
394    ECase(R_X86_64_GLOB_DAT)
395    ECase(R_X86_64_JUMP_SLOT)
396    ECase(R_X86_64_RELATIVE)
397    ECase(R_X86_64_GOTPCREL)
398    ECase(R_X86_64_32)
399    ECase(R_X86_64_32S)
400    ECase(R_X86_64_16)
401    ECase(R_X86_64_PC16)
402    ECase(R_X86_64_8)
403    ECase(R_X86_64_PC8)
404    ECase(R_X86_64_DTPMOD64)
405    ECase(R_X86_64_DTPOFF64)
406    ECase(R_X86_64_TPOFF64)
407    ECase(R_X86_64_TLSGD)
408    ECase(R_X86_64_TLSLD)
409    ECase(R_X86_64_DTPOFF32)
410    ECase(R_X86_64_GOTTPOFF)
411    ECase(R_X86_64_TPOFF32)
412    ECase(R_X86_64_PC64)
413    ECase(R_X86_64_GOTOFF64)
414    ECase(R_X86_64_GOTPC32)
415    ECase(R_X86_64_GOT64)
416    ECase(R_X86_64_GOTPCREL64)
417    ECase(R_X86_64_GOTPC64)
418    ECase(R_X86_64_GOTPLT64)
419    ECase(R_X86_64_PLTOFF64)
420    ECase(R_X86_64_SIZE32)
421    ECase(R_X86_64_SIZE64)
422    ECase(R_X86_64_GOTPC32_TLSDESC)
423    ECase(R_X86_64_TLSDESC_CALL)
424    ECase(R_X86_64_TLSDESC)
425    ECase(R_X86_64_IRELATIVE)
426    break;
427  case ELF::EM_MIPS:
428    ECase(R_MIPS_NONE)
429    ECase(R_MIPS_16)
430    ECase(R_MIPS_32)
431    ECase(R_MIPS_REL32)
432    ECase(R_MIPS_26)
433    ECase(R_MIPS_HI16)
434    ECase(R_MIPS_LO16)
435    ECase(R_MIPS_GPREL16)
436    ECase(R_MIPS_LITERAL)
437    ECase(R_MIPS_GOT16)
438    ECase(R_MIPS_PC16)
439    ECase(R_MIPS_CALL16)
440    ECase(R_MIPS_GPREL32)
441    ECase(R_MIPS_UNUSED1)
442    ECase(R_MIPS_UNUSED2)
443    ECase(R_MIPS_SHIFT5)
444    ECase(R_MIPS_SHIFT6)
445    ECase(R_MIPS_64)
446    ECase(R_MIPS_GOT_DISP)
447    ECase(R_MIPS_GOT_PAGE)
448    ECase(R_MIPS_GOT_OFST)
449    ECase(R_MIPS_GOT_HI16)
450    ECase(R_MIPS_GOT_LO16)
451    ECase(R_MIPS_SUB)
452    ECase(R_MIPS_INSERT_A)
453    ECase(R_MIPS_INSERT_B)
454    ECase(R_MIPS_DELETE)
455    ECase(R_MIPS_HIGHER)
456    ECase(R_MIPS_HIGHEST)
457    ECase(R_MIPS_CALL_HI16)
458    ECase(R_MIPS_CALL_LO16)
459    ECase(R_MIPS_SCN_DISP)
460    ECase(R_MIPS_REL16)
461    ECase(R_MIPS_ADD_IMMEDIATE)
462    ECase(R_MIPS_PJUMP)
463    ECase(R_MIPS_RELGOT)
464    ECase(R_MIPS_JALR)
465    ECase(R_MIPS_TLS_DTPMOD32)
466    ECase(R_MIPS_TLS_DTPREL32)
467    ECase(R_MIPS_TLS_DTPMOD64)
468    ECase(R_MIPS_TLS_DTPREL64)
469    ECase(R_MIPS_TLS_GD)
470    ECase(R_MIPS_TLS_LDM)
471    ECase(R_MIPS_TLS_DTPREL_HI16)
472    ECase(R_MIPS_TLS_DTPREL_LO16)
473    ECase(R_MIPS_TLS_GOTTPREL)
474    ECase(R_MIPS_TLS_TPREL32)
475    ECase(R_MIPS_TLS_TPREL64)
476    ECase(R_MIPS_TLS_TPREL_HI16)
477    ECase(R_MIPS_TLS_TPREL_LO16)
478    ECase(R_MIPS_GLOB_DAT)
479    ECase(R_MIPS_PC21_S2)
480    ECase(R_MIPS_PC26_S2)
481    ECase(R_MIPS_PC18_S3)
482    ECase(R_MIPS_PC19_S2)
483    ECase(R_MIPS_PCHI16)
484    ECase(R_MIPS_PCLO16)
485    ECase(R_MIPS16_GOT16)
486    ECase(R_MIPS16_HI16)
487    ECase(R_MIPS16_LO16)
488    ECase(R_MIPS_COPY)
489    ECase(R_MIPS_JUMP_SLOT)
490    ECase(R_MICROMIPS_26_S1)
491    ECase(R_MICROMIPS_HI16)
492    ECase(R_MICROMIPS_LO16)
493    ECase(R_MICROMIPS_GOT16)
494    ECase(R_MICROMIPS_PC16_S1)
495    ECase(R_MICROMIPS_CALL16)
496    ECase(R_MICROMIPS_GOT_DISP)
497    ECase(R_MICROMIPS_GOT_PAGE)
498    ECase(R_MICROMIPS_GOT_OFST)
499    ECase(R_MICROMIPS_TLS_GD)
500    ECase(R_MICROMIPS_TLS_LDM)
501    ECase(R_MICROMIPS_TLS_DTPREL_HI16)
502    ECase(R_MICROMIPS_TLS_DTPREL_LO16)
503    ECase(R_MICROMIPS_TLS_TPREL_HI16)
504    ECase(R_MICROMIPS_TLS_TPREL_LO16)
505    ECase(R_MIPS_NUM)
506    ECase(R_MIPS_PC32)
507    break;
508  case ELF::EM_HEXAGON:
509    ECase(R_HEX_NONE)
510    ECase(R_HEX_B22_PCREL)
511    ECase(R_HEX_B15_PCREL)
512    ECase(R_HEX_B7_PCREL)
513    ECase(R_HEX_LO16)
514    ECase(R_HEX_HI16)
515    ECase(R_HEX_32)
516    ECase(R_HEX_16)
517    ECase(R_HEX_8)
518    ECase(R_HEX_GPREL16_0)
519    ECase(R_HEX_GPREL16_1)
520    ECase(R_HEX_GPREL16_2)
521    ECase(R_HEX_GPREL16_3)
522    ECase(R_HEX_HL16)
523    ECase(R_HEX_B13_PCREL)
524    ECase(R_HEX_B9_PCREL)
525    ECase(R_HEX_B32_PCREL_X)
526    ECase(R_HEX_32_6_X)
527    ECase(R_HEX_B22_PCREL_X)
528    ECase(R_HEX_B15_PCREL_X)
529    ECase(R_HEX_B13_PCREL_X)
530    ECase(R_HEX_B9_PCREL_X)
531    ECase(R_HEX_B7_PCREL_X)
532    ECase(R_HEX_16_X)
533    ECase(R_HEX_12_X)
534    ECase(R_HEX_11_X)
535    ECase(R_HEX_10_X)
536    ECase(R_HEX_9_X)
537    ECase(R_HEX_8_X)
538    ECase(R_HEX_7_X)
539    ECase(R_HEX_6_X)
540    ECase(R_HEX_32_PCREL)
541    ECase(R_HEX_COPY)
542    ECase(R_HEX_GLOB_DAT)
543    ECase(R_HEX_JMP_SLOT)
544    ECase(R_HEX_RELATIVE)
545    ECase(R_HEX_PLT_B22_PCREL)
546    ECase(R_HEX_GOTREL_LO16)
547    ECase(R_HEX_GOTREL_HI16)
548    ECase(R_HEX_GOTREL_32)
549    ECase(R_HEX_GOT_LO16)
550    ECase(R_HEX_GOT_HI16)
551    ECase(R_HEX_GOT_32)
552    ECase(R_HEX_GOT_16)
553    ECase(R_HEX_DTPMOD_32)
554    ECase(R_HEX_DTPREL_LO16)
555    ECase(R_HEX_DTPREL_HI16)
556    ECase(R_HEX_DTPREL_32)
557    ECase(R_HEX_DTPREL_16)
558    ECase(R_HEX_GD_PLT_B22_PCREL)
559    ECase(R_HEX_GD_GOT_LO16)
560    ECase(R_HEX_GD_GOT_HI16)
561    ECase(R_HEX_GD_GOT_32)
562    ECase(R_HEX_GD_GOT_16)
563    ECase(R_HEX_IE_LO16)
564    ECase(R_HEX_IE_HI16)
565    ECase(R_HEX_IE_32)
566    ECase(R_HEX_IE_GOT_LO16)
567    ECase(R_HEX_IE_GOT_HI16)
568    ECase(R_HEX_IE_GOT_32)
569    ECase(R_HEX_IE_GOT_16)
570    ECase(R_HEX_TPREL_LO16)
571    ECase(R_HEX_TPREL_HI16)
572    ECase(R_HEX_TPREL_32)
573    ECase(R_HEX_TPREL_16)
574    ECase(R_HEX_6_PCREL_X)
575    ECase(R_HEX_GOTREL_32_6_X)
576    ECase(R_HEX_GOTREL_16_X)
577    ECase(R_HEX_GOTREL_11_X)
578    ECase(R_HEX_GOT_32_6_X)
579    ECase(R_HEX_GOT_16_X)
580    ECase(R_HEX_GOT_11_X)
581    ECase(R_HEX_DTPREL_32_6_X)
582    ECase(R_HEX_DTPREL_16_X)
583    ECase(R_HEX_DTPREL_11_X)
584    ECase(R_HEX_GD_GOT_32_6_X)
585    ECase(R_HEX_GD_GOT_16_X)
586    ECase(R_HEX_GD_GOT_11_X)
587    ECase(R_HEX_IE_32_6_X)
588    ECase(R_HEX_IE_16_X)
589    ECase(R_HEX_IE_GOT_32_6_X)
590    ECase(R_HEX_IE_GOT_16_X)
591    ECase(R_HEX_IE_GOT_11_X)
592    ECase(R_HEX_TPREL_32_6_X)
593    ECase(R_HEX_TPREL_16_X)
594    ECase(R_HEX_TPREL_11_X)
595    break;
596  case ELF::EM_386:
597    ECase(R_386_NONE)
598    ECase(R_386_32)
599    ECase(R_386_PC32)
600    ECase(R_386_GOT32)
601    ECase(R_386_PLT32)
602    ECase(R_386_COPY)
603    ECase(R_386_GLOB_DAT)
604    ECase(R_386_JUMP_SLOT)
605    ECase(R_386_RELATIVE)
606    ECase(R_386_GOTOFF)
607    ECase(R_386_GOTPC)
608    ECase(R_386_32PLT)
609    ECase(R_386_TLS_TPOFF)
610    ECase(R_386_TLS_IE)
611    ECase(R_386_TLS_GOTIE)
612    ECase(R_386_TLS_LE)
613    ECase(R_386_TLS_GD)
614    ECase(R_386_TLS_LDM)
615    ECase(R_386_16)
616    ECase(R_386_PC16)
617    ECase(R_386_8)
618    ECase(R_386_PC8)
619    ECase(R_386_TLS_GD_32)
620    ECase(R_386_TLS_GD_PUSH)
621    ECase(R_386_TLS_GD_CALL)
622    ECase(R_386_TLS_GD_POP)
623    ECase(R_386_TLS_LDM_32)
624    ECase(R_386_TLS_LDM_PUSH)
625    ECase(R_386_TLS_LDM_CALL)
626    ECase(R_386_TLS_LDM_POP)
627    ECase(R_386_TLS_LDO_32)
628    ECase(R_386_TLS_IE_32)
629    ECase(R_386_TLS_LE_32)
630    ECase(R_386_TLS_DTPMOD32)
631    ECase(R_386_TLS_DTPOFF32)
632    ECase(R_386_TLS_TPOFF32)
633    ECase(R_386_TLS_GOTDESC)
634    ECase(R_386_TLS_DESC_CALL)
635    ECase(R_386_TLS_DESC)
636    ECase(R_386_IRELATIVE)
637    ECase(R_386_NUM)
638    break;
639  default:
640    llvm_unreachable("Unsupported architecture");
641  }
642#undef ECase
643}
644
645void MappingTraits<ELFYAML::FileHeader>::mapping(IO &IO,
646                                                 ELFYAML::FileHeader &FileHdr) {
647  IO.mapRequired("Class", FileHdr.Class);
648  IO.mapRequired("Data", FileHdr.Data);
649  IO.mapOptional("OSABI", FileHdr.OSABI, ELFYAML::ELF_ELFOSABI(0));
650  IO.mapRequired("Type", FileHdr.Type);
651  IO.mapRequired("Machine", FileHdr.Machine);
652  IO.mapOptional("Flags", FileHdr.Flags, ELFYAML::ELF_EF(0));
653  IO.mapOptional("Entry", FileHdr.Entry, Hex64(0));
654}
655
656void MappingTraits<ELFYAML::Symbol>::mapping(IO &IO, ELFYAML::Symbol &Symbol) {
657  IO.mapOptional("Name", Symbol.Name, StringRef());
658  IO.mapOptional("Type", Symbol.Type, ELFYAML::ELF_STT(0));
659  IO.mapOptional("Section", Symbol.Section, StringRef());
660  IO.mapOptional("Value", Symbol.Value, Hex64(0));
661  IO.mapOptional("Size", Symbol.Size, Hex64(0));
662  IO.mapOptional("Visibility", Symbol.Visibility, ELFYAML::ELF_STV(0));
663}
664
665void MappingTraits<ELFYAML::LocalGlobalWeakSymbols>::mapping(
666    IO &IO, ELFYAML::LocalGlobalWeakSymbols &Symbols) {
667  IO.mapOptional("Local", Symbols.Local);
668  IO.mapOptional("Global", Symbols.Global);
669  IO.mapOptional("Weak", Symbols.Weak);
670}
671
672static void commonSectionMapping(IO &IO, ELFYAML::Section &Section) {
673  IO.mapOptional("Name", Section.Name, StringRef());
674  IO.mapRequired("Type", Section.Type);
675  IO.mapOptional("Flags", Section.Flags, ELFYAML::ELF_SHF(0));
676  IO.mapOptional("Address", Section.Address, Hex64(0));
677  IO.mapOptional("Link", Section.Link, StringRef());
678  IO.mapOptional("AddressAlign", Section.AddressAlign, Hex64(0));
679}
680
681static void sectionMapping(IO &IO, ELFYAML::RawContentSection &Section) {
682  commonSectionMapping(IO, Section);
683  IO.mapOptional("Content", Section.Content);
684  IO.mapOptional("Size", Section.Size, Hex64(Section.Content.binary_size()));
685}
686
687static void sectionMapping(IO &IO, ELFYAML::RelocationSection &Section) {
688  commonSectionMapping(IO, Section);
689  IO.mapOptional("Info", Section.Info, StringRef());
690  IO.mapOptional("Relocations", Section.Relocations);
691}
692
693void MappingTraits<std::unique_ptr<ELFYAML::Section>>::mapping(
694    IO &IO, std::unique_ptr<ELFYAML::Section> &Section) {
695  ELFYAML::ELF_SHT sectionType;
696  if (IO.outputting())
697    sectionType = Section->Type;
698  else
699    IO.mapRequired("Type", sectionType);
700
701  switch (sectionType) {
702  case ELF::SHT_REL:
703  case ELF::SHT_RELA:
704    if (!IO.outputting())
705      Section.reset(new ELFYAML::RelocationSection());
706    sectionMapping(IO, *cast<ELFYAML::RelocationSection>(Section.get()));
707    break;
708  default:
709    if (!IO.outputting())
710      Section.reset(new ELFYAML::RawContentSection());
711    sectionMapping(IO, *cast<ELFYAML::RawContentSection>(Section.get()));
712  }
713}
714
715StringRef MappingTraits<std::unique_ptr<ELFYAML::Section>>::validate(
716    IO &io, std::unique_ptr<ELFYAML::Section> &Section) {
717  const auto *RawSection = dyn_cast<ELFYAML::RawContentSection>(Section.get());
718  if (!RawSection || RawSection->Size >= RawSection->Content.binary_size())
719    return StringRef();
720  return "Section size must be greater or equal to the content size";
721}
722
723void MappingTraits<ELFYAML::Relocation>::mapping(IO &IO,
724                                                 ELFYAML::Relocation &Rel) {
725  IO.mapRequired("Offset", Rel.Offset);
726  IO.mapRequired("Symbol", Rel.Symbol);
727  IO.mapRequired("Type", Rel.Type);
728  IO.mapOptional("Addend", Rel.Addend);
729}
730
731void MappingTraits<ELFYAML::Object>::mapping(IO &IO, ELFYAML::Object &Object) {
732  assert(!IO.getContext() && "The IO context is initialized already");
733  IO.setContext(&Object);
734  IO.mapRequired("FileHeader", Object.Header);
735  IO.mapOptional("Sections", Object.Sections);
736  IO.mapOptional("Symbols", Object.Symbols);
737  IO.setContext(nullptr);
738}
739
740} // end namespace yaml
741} // end namespace llvm
742