COFFYAML.cpp revision 36b56886974eae4f9c5ebc96befd3e7bfe5de338
1//===- COFFYAML.cpp - COFF 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 COFF.
11//
12//===----------------------------------------------------------------------===//
13
14#include "llvm/Object/COFFYAML.h"
15
16#define ECase(X) IO.enumCase(Value, #X, COFF::X);
17namespace llvm {
18
19namespace COFFYAML {
20Section::Section() { memset(&Header, 0, sizeof(COFF::section)); }
21Symbol::Symbol() { memset(&Header, 0, sizeof(COFF::symbol)); }
22Object::Object() { memset(&Header, 0, sizeof(COFF::header)); }
23}
24
25namespace yaml {
26void ScalarEnumerationTraits<COFFYAML::COMDATType>::enumeration(
27    IO &IO, COFFYAML::COMDATType &Value) {
28  IO.enumCase(Value, "0", 0);
29  ECase(IMAGE_COMDAT_SELECT_NODUPLICATES);
30  ECase(IMAGE_COMDAT_SELECT_ANY);
31  ECase(IMAGE_COMDAT_SELECT_SAME_SIZE);
32  ECase(IMAGE_COMDAT_SELECT_EXACT_MATCH);
33  ECase(IMAGE_COMDAT_SELECT_ASSOCIATIVE);
34  ECase(IMAGE_COMDAT_SELECT_LARGEST);
35  ECase(IMAGE_COMDAT_SELECT_NEWEST);
36}
37
38void
39ScalarEnumerationTraits<COFFYAML::WeakExternalCharacteristics>::enumeration(
40    IO &IO, COFFYAML::WeakExternalCharacteristics &Value) {
41  ECase(IMAGE_WEAK_EXTERN_SEARCH_NOLIBRARY);
42  ECase(IMAGE_WEAK_EXTERN_SEARCH_LIBRARY);
43  ECase(IMAGE_WEAK_EXTERN_SEARCH_ALIAS);
44}
45
46void ScalarEnumerationTraits<COFFYAML::AuxSymbolType>::enumeration(
47    IO &IO, COFFYAML::AuxSymbolType &Value) {
48  ECase(IMAGE_AUX_SYMBOL_TYPE_TOKEN_DEF);
49}
50
51void ScalarEnumerationTraits<COFF::MachineTypes>::enumeration(
52    IO &IO, COFF::MachineTypes &Value) {
53  ECase(IMAGE_FILE_MACHINE_UNKNOWN);
54  ECase(IMAGE_FILE_MACHINE_AM33);
55  ECase(IMAGE_FILE_MACHINE_AMD64);
56  ECase(IMAGE_FILE_MACHINE_ARM);
57  ECase(IMAGE_FILE_MACHINE_ARMNT);
58  ECase(IMAGE_FILE_MACHINE_EBC);
59  ECase(IMAGE_FILE_MACHINE_I386);
60  ECase(IMAGE_FILE_MACHINE_IA64);
61  ECase(IMAGE_FILE_MACHINE_M32R);
62  ECase(IMAGE_FILE_MACHINE_MIPS16);
63  ECase(IMAGE_FILE_MACHINE_MIPSFPU);
64  ECase(IMAGE_FILE_MACHINE_MIPSFPU16);
65  ECase(IMAGE_FILE_MACHINE_POWERPC);
66  ECase(IMAGE_FILE_MACHINE_POWERPCFP);
67  ECase(IMAGE_FILE_MACHINE_R4000);
68  ECase(IMAGE_FILE_MACHINE_SH3);
69  ECase(IMAGE_FILE_MACHINE_SH3DSP);
70  ECase(IMAGE_FILE_MACHINE_SH4);
71  ECase(IMAGE_FILE_MACHINE_SH5);
72  ECase(IMAGE_FILE_MACHINE_THUMB);
73  ECase(IMAGE_FILE_MACHINE_WCEMIPSV2);
74}
75
76void ScalarEnumerationTraits<COFF::SymbolBaseType>::enumeration(
77    IO &IO, COFF::SymbolBaseType &Value) {
78  ECase(IMAGE_SYM_TYPE_NULL);
79  ECase(IMAGE_SYM_TYPE_VOID);
80  ECase(IMAGE_SYM_TYPE_CHAR);
81  ECase(IMAGE_SYM_TYPE_SHORT);
82  ECase(IMAGE_SYM_TYPE_INT);
83  ECase(IMAGE_SYM_TYPE_LONG);
84  ECase(IMAGE_SYM_TYPE_FLOAT);
85  ECase(IMAGE_SYM_TYPE_DOUBLE);
86  ECase(IMAGE_SYM_TYPE_STRUCT);
87  ECase(IMAGE_SYM_TYPE_UNION);
88  ECase(IMAGE_SYM_TYPE_ENUM);
89  ECase(IMAGE_SYM_TYPE_MOE);
90  ECase(IMAGE_SYM_TYPE_BYTE);
91  ECase(IMAGE_SYM_TYPE_WORD);
92  ECase(IMAGE_SYM_TYPE_UINT);
93  ECase(IMAGE_SYM_TYPE_DWORD);
94}
95
96void ScalarEnumerationTraits<COFF::SymbolStorageClass>::enumeration(
97    IO &IO, COFF::SymbolStorageClass &Value) {
98  ECase(IMAGE_SYM_CLASS_END_OF_FUNCTION);
99  ECase(IMAGE_SYM_CLASS_NULL);
100  ECase(IMAGE_SYM_CLASS_AUTOMATIC);
101  ECase(IMAGE_SYM_CLASS_EXTERNAL);
102  ECase(IMAGE_SYM_CLASS_STATIC);
103  ECase(IMAGE_SYM_CLASS_REGISTER);
104  ECase(IMAGE_SYM_CLASS_EXTERNAL_DEF);
105  ECase(IMAGE_SYM_CLASS_LABEL);
106  ECase(IMAGE_SYM_CLASS_UNDEFINED_LABEL);
107  ECase(IMAGE_SYM_CLASS_MEMBER_OF_STRUCT);
108  ECase(IMAGE_SYM_CLASS_ARGUMENT);
109  ECase(IMAGE_SYM_CLASS_STRUCT_TAG);
110  ECase(IMAGE_SYM_CLASS_MEMBER_OF_UNION);
111  ECase(IMAGE_SYM_CLASS_UNION_TAG);
112  ECase(IMAGE_SYM_CLASS_TYPE_DEFINITION);
113  ECase(IMAGE_SYM_CLASS_UNDEFINED_STATIC);
114  ECase(IMAGE_SYM_CLASS_ENUM_TAG);
115  ECase(IMAGE_SYM_CLASS_MEMBER_OF_ENUM);
116  ECase(IMAGE_SYM_CLASS_REGISTER_PARAM);
117  ECase(IMAGE_SYM_CLASS_BIT_FIELD);
118  ECase(IMAGE_SYM_CLASS_BLOCK);
119  ECase(IMAGE_SYM_CLASS_FUNCTION);
120  ECase(IMAGE_SYM_CLASS_END_OF_STRUCT);
121  ECase(IMAGE_SYM_CLASS_FILE);
122  ECase(IMAGE_SYM_CLASS_SECTION);
123  ECase(IMAGE_SYM_CLASS_WEAK_EXTERNAL);
124  ECase(IMAGE_SYM_CLASS_CLR_TOKEN);
125}
126
127void ScalarEnumerationTraits<COFF::SymbolComplexType>::enumeration(
128    IO &IO, COFF::SymbolComplexType &Value) {
129  ECase(IMAGE_SYM_DTYPE_NULL);
130  ECase(IMAGE_SYM_DTYPE_POINTER);
131  ECase(IMAGE_SYM_DTYPE_FUNCTION);
132  ECase(IMAGE_SYM_DTYPE_ARRAY);
133}
134
135void ScalarEnumerationTraits<COFF::RelocationTypeX86>::enumeration(
136    IO &IO, COFF::RelocationTypeX86 &Value) {
137  ECase(IMAGE_REL_I386_ABSOLUTE);
138  ECase(IMAGE_REL_I386_DIR16);
139  ECase(IMAGE_REL_I386_REL16);
140  ECase(IMAGE_REL_I386_DIR32);
141  ECase(IMAGE_REL_I386_DIR32NB);
142  ECase(IMAGE_REL_I386_SEG12);
143  ECase(IMAGE_REL_I386_SECTION);
144  ECase(IMAGE_REL_I386_SECREL);
145  ECase(IMAGE_REL_I386_TOKEN);
146  ECase(IMAGE_REL_I386_SECREL7);
147  ECase(IMAGE_REL_I386_REL32);
148  ECase(IMAGE_REL_AMD64_ABSOLUTE);
149  ECase(IMAGE_REL_AMD64_ADDR64);
150  ECase(IMAGE_REL_AMD64_ADDR32);
151  ECase(IMAGE_REL_AMD64_ADDR32NB);
152  ECase(IMAGE_REL_AMD64_REL32);
153  ECase(IMAGE_REL_AMD64_REL32_1);
154  ECase(IMAGE_REL_AMD64_REL32_2);
155  ECase(IMAGE_REL_AMD64_REL32_3);
156  ECase(IMAGE_REL_AMD64_REL32_4);
157  ECase(IMAGE_REL_AMD64_REL32_5);
158  ECase(IMAGE_REL_AMD64_SECTION);
159  ECase(IMAGE_REL_AMD64_SECREL);
160  ECase(IMAGE_REL_AMD64_SECREL7);
161  ECase(IMAGE_REL_AMD64_TOKEN);
162  ECase(IMAGE_REL_AMD64_SREL32);
163  ECase(IMAGE_REL_AMD64_PAIR);
164  ECase(IMAGE_REL_AMD64_SSPAN32);
165}
166#undef ECase
167
168#define BCase(X) IO.bitSetCase(Value, #X, COFF::X);
169void ScalarBitSetTraits<COFF::Characteristics>::bitset(
170    IO &IO, COFF::Characteristics &Value) {
171  BCase(IMAGE_FILE_RELOCS_STRIPPED);
172  BCase(IMAGE_FILE_EXECUTABLE_IMAGE);
173  BCase(IMAGE_FILE_LINE_NUMS_STRIPPED);
174  BCase(IMAGE_FILE_LOCAL_SYMS_STRIPPED);
175  BCase(IMAGE_FILE_AGGRESSIVE_WS_TRIM);
176  BCase(IMAGE_FILE_LARGE_ADDRESS_AWARE);
177  BCase(IMAGE_FILE_BYTES_REVERSED_LO);
178  BCase(IMAGE_FILE_32BIT_MACHINE);
179  BCase(IMAGE_FILE_DEBUG_STRIPPED);
180  BCase(IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP);
181  BCase(IMAGE_FILE_NET_RUN_FROM_SWAP);
182  BCase(IMAGE_FILE_SYSTEM);
183  BCase(IMAGE_FILE_DLL);
184  BCase(IMAGE_FILE_UP_SYSTEM_ONLY);
185  BCase(IMAGE_FILE_BYTES_REVERSED_HI);
186}
187
188void ScalarBitSetTraits<COFF::SectionCharacteristics>::bitset(
189    IO &IO, COFF::SectionCharacteristics &Value) {
190  BCase(IMAGE_SCN_TYPE_NO_PAD);
191  BCase(IMAGE_SCN_CNT_CODE);
192  BCase(IMAGE_SCN_CNT_INITIALIZED_DATA);
193  BCase(IMAGE_SCN_CNT_UNINITIALIZED_DATA);
194  BCase(IMAGE_SCN_LNK_OTHER);
195  BCase(IMAGE_SCN_LNK_INFO);
196  BCase(IMAGE_SCN_LNK_REMOVE);
197  BCase(IMAGE_SCN_LNK_COMDAT);
198  BCase(IMAGE_SCN_GPREL);
199  BCase(IMAGE_SCN_MEM_PURGEABLE);
200  BCase(IMAGE_SCN_MEM_16BIT);
201  BCase(IMAGE_SCN_MEM_LOCKED);
202  BCase(IMAGE_SCN_MEM_PRELOAD);
203  BCase(IMAGE_SCN_LNK_NRELOC_OVFL);
204  BCase(IMAGE_SCN_MEM_DISCARDABLE);
205  BCase(IMAGE_SCN_MEM_NOT_CACHED);
206  BCase(IMAGE_SCN_MEM_NOT_PAGED);
207  BCase(IMAGE_SCN_MEM_SHARED);
208  BCase(IMAGE_SCN_MEM_EXECUTE);
209  BCase(IMAGE_SCN_MEM_READ);
210  BCase(IMAGE_SCN_MEM_WRITE);
211}
212#undef BCase
213
214namespace {
215struct NSectionSelectionType {
216  NSectionSelectionType(IO &)
217      : SelectionType(COFFYAML::COMDATType(0)) {}
218  NSectionSelectionType(IO &, uint8_t C)
219      : SelectionType(COFFYAML::COMDATType(C)) {}
220  uint8_t denormalize(IO &) { return SelectionType; }
221  COFFYAML::COMDATType SelectionType;
222};
223
224struct NWeakExternalCharacteristics {
225  NWeakExternalCharacteristics(IO &)
226      : Characteristics(COFFYAML::WeakExternalCharacteristics(0)) {}
227  NWeakExternalCharacteristics(IO &, uint32_t C)
228      : Characteristics(COFFYAML::WeakExternalCharacteristics(C)) {}
229  uint32_t denormalize(IO &) { return Characteristics; }
230  COFFYAML::WeakExternalCharacteristics Characteristics;
231};
232
233struct NSectionCharacteristics {
234  NSectionCharacteristics(IO &)
235      : Characteristics(COFF::SectionCharacteristics(0)) {}
236  NSectionCharacteristics(IO &, uint32_t C)
237      : Characteristics(COFF::SectionCharacteristics(C)) {}
238  uint32_t denormalize(IO &) { return Characteristics; }
239  COFF::SectionCharacteristics Characteristics;
240};
241
242struct NAuxTokenType {
243  NAuxTokenType(IO &)
244      : AuxType(COFFYAML::AuxSymbolType(0)) {}
245  NAuxTokenType(IO &, uint8_t C)
246      : AuxType(COFFYAML::AuxSymbolType(C)) {}
247  uint32_t denormalize(IO &) { return AuxType; }
248  COFFYAML::AuxSymbolType AuxType;
249};
250
251struct NStorageClass {
252  NStorageClass(IO &) : StorageClass(COFF::SymbolStorageClass(0)) {}
253  NStorageClass(IO &, uint8_t S) : StorageClass(COFF::SymbolStorageClass(S)) {}
254  uint8_t denormalize(IO &) { return StorageClass; }
255
256  COFF::SymbolStorageClass StorageClass;
257};
258
259struct NMachine {
260  NMachine(IO &) : Machine(COFF::MachineTypes(0)) {}
261  NMachine(IO &, uint16_t M) : Machine(COFF::MachineTypes(M)) {}
262  uint16_t denormalize(IO &) { return Machine; }
263  COFF::MachineTypes Machine;
264};
265
266struct NHeaderCharacteristics {
267  NHeaderCharacteristics(IO &) : Characteristics(COFF::Characteristics(0)) {}
268  NHeaderCharacteristics(IO &, uint16_t C)
269      : Characteristics(COFF::Characteristics(C)) {}
270  uint16_t denormalize(IO &) { return Characteristics; }
271
272  COFF::Characteristics Characteristics;
273};
274
275struct NType {
276  NType(IO &) : Type(COFF::RelocationTypeX86(0)) {}
277  NType(IO &, uint16_t T) : Type(COFF::RelocationTypeX86(T)) {}
278  uint16_t denormalize(IO &) { return Type; }
279  COFF::RelocationTypeX86 Type;
280};
281
282}
283
284void MappingTraits<COFFYAML::Relocation>::mapping(IO &IO,
285                                                  COFFYAML::Relocation &Rel) {
286  MappingNormalization<NType, uint16_t> NT(IO, Rel.Type);
287
288  IO.mapRequired("VirtualAddress", Rel.VirtualAddress);
289  IO.mapRequired("SymbolName", Rel.SymbolName);
290  IO.mapRequired("Type", NT->Type);
291}
292
293void MappingTraits<COFF::header>::mapping(IO &IO, COFF::header &H) {
294  MappingNormalization<NMachine, uint16_t> NM(IO, H.Machine);
295  MappingNormalization<NHeaderCharacteristics, uint16_t> NC(IO,
296                                                            H.Characteristics);
297
298  IO.mapRequired("Machine", NM->Machine);
299  IO.mapOptional("Characteristics", NC->Characteristics);
300}
301
302void MappingTraits<COFF::AuxiliaryFunctionDefinition>::mapping(
303    IO &IO, COFF::AuxiliaryFunctionDefinition &AFD) {
304  IO.mapRequired("TagIndex", AFD.TagIndex);
305  IO.mapRequired("TotalSize", AFD.TotalSize);
306  IO.mapRequired("PointerToLinenumber", AFD.PointerToLinenumber);
307  IO.mapRequired("PointerToNextFunction", AFD.PointerToNextFunction);
308}
309
310void MappingTraits<COFF::AuxiliarybfAndefSymbol>::mapping(
311    IO &IO, COFF::AuxiliarybfAndefSymbol &AAS) {
312  IO.mapRequired("Linenumber", AAS.Linenumber);
313  IO.mapRequired("PointerToNextFunction", AAS.PointerToNextFunction);
314}
315
316void MappingTraits<COFF::AuxiliaryWeakExternal>::mapping(
317    IO &IO, COFF::AuxiliaryWeakExternal &AWE) {
318  MappingNormalization<NWeakExternalCharacteristics, uint32_t> NWEC(
319      IO, AWE.Characteristics);
320  IO.mapRequired("TagIndex", AWE.TagIndex);
321  IO.mapRequired("Characteristics", NWEC->Characteristics);
322}
323
324void MappingTraits<COFF::AuxiliarySectionDefinition>::mapping(
325    IO &IO, COFF::AuxiliarySectionDefinition &ASD) {
326  MappingNormalization<NSectionSelectionType, uint8_t> NSST(
327      IO, ASD.Selection);
328
329  IO.mapRequired("Length", ASD.Length);
330  IO.mapRequired("NumberOfRelocations", ASD.NumberOfRelocations);
331  IO.mapRequired("NumberOfLinenumbers", ASD.NumberOfLinenumbers);
332  IO.mapRequired("CheckSum", ASD.CheckSum);
333  IO.mapRequired("Number", ASD.Number);
334  IO.mapOptional("Selection", NSST->SelectionType, COFFYAML::COMDATType(0));
335}
336
337void MappingTraits<COFF::AuxiliaryCLRToken>::mapping(
338    IO &IO, COFF::AuxiliaryCLRToken &ACT) {
339  MappingNormalization<NAuxTokenType, uint8_t> NATT(IO, ACT.AuxType);
340  IO.mapRequired("AuxType", NATT->AuxType);
341  IO.mapRequired("SymbolTableIndex", ACT.SymbolTableIndex);
342}
343
344void MappingTraits<COFFYAML::Symbol>::mapping(IO &IO, COFFYAML::Symbol &S) {
345  MappingNormalization<NStorageClass, uint8_t> NS(IO, S.Header.StorageClass);
346
347  IO.mapRequired("Name", S.Name);
348  IO.mapRequired("Value", S.Header.Value);
349  IO.mapRequired("SectionNumber", S.Header.SectionNumber);
350  IO.mapRequired("SimpleType", S.SimpleType);
351  IO.mapRequired("ComplexType", S.ComplexType);
352  IO.mapRequired("StorageClass", NS->StorageClass);
353  IO.mapOptional("FunctionDefinition", S.FunctionDefinition);
354  IO.mapOptional("bfAndefSymbol", S.bfAndefSymbol);
355  IO.mapOptional("WeakExternal", S.WeakExternal);
356  IO.mapOptional("File", S.File, StringRef());
357  IO.mapOptional("SectionDefinition", S.SectionDefinition);
358  IO.mapOptional("CLRToken", S.CLRToken);
359}
360
361void MappingTraits<COFFYAML::Section>::mapping(IO &IO, COFFYAML::Section &Sec) {
362  MappingNormalization<NSectionCharacteristics, uint32_t> NC(
363      IO, Sec.Header.Characteristics);
364  IO.mapRequired("Name", Sec.Name);
365  IO.mapRequired("Characteristics", NC->Characteristics);
366  IO.mapOptional("Alignment", Sec.Alignment);
367  IO.mapRequired("SectionData", Sec.SectionData);
368  IO.mapOptional("Relocations", Sec.Relocations);
369}
370
371void MappingTraits<COFFYAML::Object>::mapping(IO &IO, COFFYAML::Object &Obj) {
372  IO.mapRequired("header", Obj.Header);
373  IO.mapRequired("sections", Obj.Sections);
374  IO.mapRequired("symbols", Obj.Symbols);
375}
376
377}
378}
379