Mercurial > hg > CbC > CbC_llvm
comparison lib/ObjectYAML/COFFYAML.cpp @ 121:803732b1fca8
LLVM 5.0
author | kono |
---|---|
date | Fri, 27 Oct 2017 17:07:41 +0900 |
parents | 1172e4bd9c6f |
children | 3a76565eade5 |
comparison
equal
deleted
inserted
replaced
120:1172e4bd9c6f | 121:803732b1fca8 |
---|---|
10 // This file defines classes for handling the YAML representation of COFF. | 10 // This file defines classes for handling the YAML representation of COFF. |
11 // | 11 // |
12 //===----------------------------------------------------------------------===// | 12 //===----------------------------------------------------------------------===// |
13 | 13 |
14 #include "llvm/ObjectYAML/COFFYAML.h" | 14 #include "llvm/ObjectYAML/COFFYAML.h" |
15 #include "llvm/ADT/StringRef.h" | |
16 #include "llvm/Support/YAMLTraits.h" | |
17 #include <cstdint> | |
18 #include <cstring> | |
15 | 19 |
16 #define ECase(X) IO.enumCase(Value, #X, COFF::X); | 20 #define ECase(X) IO.enumCase(Value, #X, COFF::X); |
21 | |
17 namespace llvm { | 22 namespace llvm { |
18 | 23 |
19 namespace COFFYAML { | 24 namespace COFFYAML { |
25 | |
20 Section::Section() { memset(&Header, 0, sizeof(COFF::section)); } | 26 Section::Section() { memset(&Header, 0, sizeof(COFF::section)); } |
21 Symbol::Symbol() { memset(&Header, 0, sizeof(COFF::symbol)); } | 27 Symbol::Symbol() { memset(&Header, 0, sizeof(COFF::symbol)); } |
22 Object::Object() { memset(&Header, 0, sizeof(COFF::header)); } | 28 Object::Object() { memset(&Header, 0, sizeof(COFF::header)); } |
23 } | 29 |
30 } // end namespace COFFYAML | |
24 | 31 |
25 namespace yaml { | 32 namespace yaml { |
33 | |
26 void ScalarEnumerationTraits<COFFYAML::COMDATType>::enumeration( | 34 void ScalarEnumerationTraits<COFFYAML::COMDATType>::enumeration( |
27 IO &IO, COFFYAML::COMDATType &Value) { | 35 IO &IO, COFFYAML::COMDATType &Value) { |
28 IO.enumCase(Value, "0", 0); | 36 IO.enumCase(Value, "0", 0); |
29 ECase(IMAGE_COMDAT_SELECT_NODUPLICATES); | 37 ECase(IMAGE_COMDAT_SELECT_NODUPLICATES); |
30 ECase(IMAGE_COMDAT_SELECT_ANY); | 38 ECase(IMAGE_COMDAT_SELECT_ANY); |
170 ECase(IMAGE_REL_AMD64_SSPAN32); | 178 ECase(IMAGE_REL_AMD64_SSPAN32); |
171 } | 179 } |
172 | 180 |
173 void ScalarEnumerationTraits<COFF::WindowsSubsystem>::enumeration( | 181 void ScalarEnumerationTraits<COFF::WindowsSubsystem>::enumeration( |
174 IO &IO, COFF::WindowsSubsystem &Value) { | 182 IO &IO, COFF::WindowsSubsystem &Value) { |
175 ECase(IMAGE_SUBSYSTEM_UNKNOWN); | 183 ECase(IMAGE_SUBSYSTEM_UNKNOWN); |
176 ECase(IMAGE_SUBSYSTEM_NATIVE); | 184 ECase(IMAGE_SUBSYSTEM_NATIVE); |
177 ECase(IMAGE_SUBSYSTEM_WINDOWS_GUI); | 185 ECase(IMAGE_SUBSYSTEM_WINDOWS_GUI); |
178 ECase(IMAGE_SUBSYSTEM_WINDOWS_CUI); | 186 ECase(IMAGE_SUBSYSTEM_WINDOWS_CUI); |
179 ECase(IMAGE_SUBSYSTEM_OS2_CUI); | 187 ECase(IMAGE_SUBSYSTEM_OS2_CUI); |
180 ECase(IMAGE_SUBSYSTEM_POSIX_CUI); | 188 ECase(IMAGE_SUBSYSTEM_POSIX_CUI); |
181 ECase(IMAGE_SUBSYSTEM_NATIVE_WINDOWS); | 189 ECase(IMAGE_SUBSYSTEM_NATIVE_WINDOWS); |
182 ECase(IMAGE_SUBSYSTEM_WINDOWS_CE_GUI); | 190 ECase(IMAGE_SUBSYSTEM_WINDOWS_CE_GUI); |
183 ECase(IMAGE_SUBSYSTEM_EFI_APPLICATION); | 191 ECase(IMAGE_SUBSYSTEM_EFI_APPLICATION); |
184 ECase(IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER); | 192 ECase(IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER); |
185 ECase(IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER); | 193 ECase(IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER); |
186 ECase(IMAGE_SUBSYSTEM_EFI_ROM); | 194 ECase(IMAGE_SUBSYSTEM_EFI_ROM); |
187 ECase(IMAGE_SUBSYSTEM_XBOX); | 195 ECase(IMAGE_SUBSYSTEM_XBOX); |
188 ECase(IMAGE_SUBSYSTEM_WINDOWS_BOOT_APPLICATION); | 196 ECase(IMAGE_SUBSYSTEM_WINDOWS_BOOT_APPLICATION); |
189 } | 197 } |
190 #undef ECase | 198 #undef ECase |
191 | 199 |
192 #define BCase(X) IO.bitSetCase(Value, #X, COFF::X); | 200 #define BCase(X) IO.bitSetCase(Value, #X, COFF::X); |
193 void ScalarBitSetTraits<COFF::Characteristics>::bitset( | 201 void ScalarBitSetTraits<COFF::Characteristics>::bitset( |
250 BCase(IMAGE_DLL_CHARACTERISTICS_TERMINAL_SERVER_AWARE); | 258 BCase(IMAGE_DLL_CHARACTERISTICS_TERMINAL_SERVER_AWARE); |
251 } | 259 } |
252 #undef BCase | 260 #undef BCase |
253 | 261 |
254 namespace { | 262 namespace { |
263 | |
255 struct NSectionSelectionType { | 264 struct NSectionSelectionType { |
256 NSectionSelectionType(IO &) | 265 NSectionSelectionType(IO &) |
257 : SelectionType(COFFYAML::COMDATType(0)) {} | 266 : SelectionType(COFFYAML::COMDATType(0)) {} |
258 NSectionSelectionType(IO &, uint8_t C) | 267 NSectionSelectionType(IO &, uint8_t C) |
259 : SelectionType(COFFYAML::COMDATType(C)) {} | 268 : SelectionType(COFFYAML::COMDATType(C)) {} |
269 | |
260 uint8_t denormalize(IO &) { return SelectionType; } | 270 uint8_t denormalize(IO &) { return SelectionType; } |
271 | |
261 COFFYAML::COMDATType SelectionType; | 272 COFFYAML::COMDATType SelectionType; |
262 }; | 273 }; |
263 | 274 |
264 struct NWeakExternalCharacteristics { | 275 struct NWeakExternalCharacteristics { |
265 NWeakExternalCharacteristics(IO &) | 276 NWeakExternalCharacteristics(IO &) |
266 : Characteristics(COFFYAML::WeakExternalCharacteristics(0)) {} | 277 : Characteristics(COFFYAML::WeakExternalCharacteristics(0)) {} |
267 NWeakExternalCharacteristics(IO &, uint32_t C) | 278 NWeakExternalCharacteristics(IO &, uint32_t C) |
268 : Characteristics(COFFYAML::WeakExternalCharacteristics(C)) {} | 279 : Characteristics(COFFYAML::WeakExternalCharacteristics(C)) {} |
280 | |
269 uint32_t denormalize(IO &) { return Characteristics; } | 281 uint32_t denormalize(IO &) { return Characteristics; } |
282 | |
270 COFFYAML::WeakExternalCharacteristics Characteristics; | 283 COFFYAML::WeakExternalCharacteristics Characteristics; |
271 }; | 284 }; |
272 | 285 |
273 struct NSectionCharacteristics { | 286 struct NSectionCharacteristics { |
274 NSectionCharacteristics(IO &) | 287 NSectionCharacteristics(IO &) |
275 : Characteristics(COFF::SectionCharacteristics(0)) {} | 288 : Characteristics(COFF::SectionCharacteristics(0)) {} |
276 NSectionCharacteristics(IO &, uint32_t C) | 289 NSectionCharacteristics(IO &, uint32_t C) |
277 : Characteristics(COFF::SectionCharacteristics(C)) {} | 290 : Characteristics(COFF::SectionCharacteristics(C)) {} |
291 | |
278 uint32_t denormalize(IO &) { return Characteristics; } | 292 uint32_t denormalize(IO &) { return Characteristics; } |
293 | |
279 COFF::SectionCharacteristics Characteristics; | 294 COFF::SectionCharacteristics Characteristics; |
280 }; | 295 }; |
281 | 296 |
282 struct NAuxTokenType { | 297 struct NAuxTokenType { |
283 NAuxTokenType(IO &) | 298 NAuxTokenType(IO &) |
284 : AuxType(COFFYAML::AuxSymbolType(0)) {} | 299 : AuxType(COFFYAML::AuxSymbolType(0)) {} |
285 NAuxTokenType(IO &, uint8_t C) | 300 NAuxTokenType(IO &, uint8_t C) |
286 : AuxType(COFFYAML::AuxSymbolType(C)) {} | 301 : AuxType(COFFYAML::AuxSymbolType(C)) {} |
302 | |
287 uint32_t denormalize(IO &) { return AuxType; } | 303 uint32_t denormalize(IO &) { return AuxType; } |
304 | |
288 COFFYAML::AuxSymbolType AuxType; | 305 COFFYAML::AuxSymbolType AuxType; |
289 }; | 306 }; |
290 | 307 |
291 struct NStorageClass { | 308 struct NStorageClass { |
292 NStorageClass(IO &) : StorageClass(COFF::SymbolStorageClass(0)) {} | 309 NStorageClass(IO &) : StorageClass(COFF::SymbolStorageClass(0)) {} |
293 NStorageClass(IO &, uint8_t S) : StorageClass(COFF::SymbolStorageClass(S)) {} | 310 NStorageClass(IO &, uint8_t S) : StorageClass(COFF::SymbolStorageClass(S)) {} |
311 | |
294 uint8_t denormalize(IO &) { return StorageClass; } | 312 uint8_t denormalize(IO &) { return StorageClass; } |
295 | 313 |
296 COFF::SymbolStorageClass StorageClass; | 314 COFF::SymbolStorageClass StorageClass; |
297 }; | 315 }; |
298 | 316 |
299 struct NMachine { | 317 struct NMachine { |
300 NMachine(IO &) : Machine(COFF::MachineTypes(0)) {} | 318 NMachine(IO &) : Machine(COFF::MachineTypes(0)) {} |
301 NMachine(IO &, uint16_t M) : Machine(COFF::MachineTypes(M)) {} | 319 NMachine(IO &, uint16_t M) : Machine(COFF::MachineTypes(M)) {} |
320 | |
302 uint16_t denormalize(IO &) { return Machine; } | 321 uint16_t denormalize(IO &) { return Machine; } |
322 | |
303 COFF::MachineTypes Machine; | 323 COFF::MachineTypes Machine; |
304 }; | 324 }; |
305 | 325 |
306 struct NHeaderCharacteristics { | 326 struct NHeaderCharacteristics { |
307 NHeaderCharacteristics(IO &) : Characteristics(COFF::Characteristics(0)) {} | 327 NHeaderCharacteristics(IO &) : Characteristics(COFF::Characteristics(0)) {} |
308 NHeaderCharacteristics(IO &, uint16_t C) | 328 NHeaderCharacteristics(IO &, uint16_t C) |
309 : Characteristics(COFF::Characteristics(C)) {} | 329 : Characteristics(COFF::Characteristics(C)) {} |
330 | |
310 uint16_t denormalize(IO &) { return Characteristics; } | 331 uint16_t denormalize(IO &) { return Characteristics; } |
311 | 332 |
312 COFF::Characteristics Characteristics; | 333 COFF::Characteristics Characteristics; |
313 }; | 334 }; |
314 | 335 |
315 template <typename RelocType> | 336 template <typename RelocType> |
316 struct NType { | 337 struct NType { |
317 NType(IO &) : Type(RelocType(0)) {} | 338 NType(IO &) : Type(RelocType(0)) {} |
318 NType(IO &, uint16_t T) : Type(RelocType(T)) {} | 339 NType(IO &, uint16_t T) : Type(RelocType(T)) {} |
340 | |
319 uint16_t denormalize(IO &) { return Type; } | 341 uint16_t denormalize(IO &) { return Type; } |
342 | |
320 RelocType Type; | 343 RelocType Type; |
321 }; | 344 }; |
322 | 345 |
323 struct NWindowsSubsystem { | 346 struct NWindowsSubsystem { |
324 NWindowsSubsystem(IO &) : Subsystem(COFF::WindowsSubsystem(0)) {} | 347 NWindowsSubsystem(IO &) : Subsystem(COFF::WindowsSubsystem(0)) {} |
325 NWindowsSubsystem(IO &, uint16_t C) : Subsystem(COFF::WindowsSubsystem(C)) {} | 348 NWindowsSubsystem(IO &, uint16_t C) : Subsystem(COFF::WindowsSubsystem(C)) {} |
349 | |
326 uint16_t denormalize(IO &) { return Subsystem; } | 350 uint16_t denormalize(IO &) { return Subsystem; } |
327 | 351 |
328 COFF::WindowsSubsystem Subsystem; | 352 COFF::WindowsSubsystem Subsystem; |
329 }; | 353 }; |
330 | 354 |
331 struct NDLLCharacteristics { | 355 struct NDLLCharacteristics { |
332 NDLLCharacteristics(IO &) : Characteristics(COFF::DLLCharacteristics(0)) {} | 356 NDLLCharacteristics(IO &) : Characteristics(COFF::DLLCharacteristics(0)) {} |
333 NDLLCharacteristics(IO &, uint16_t C) | 357 NDLLCharacteristics(IO &, uint16_t C) |
334 : Characteristics(COFF::DLLCharacteristics(C)) {} | 358 : Characteristics(COFF::DLLCharacteristics(C)) {} |
359 | |
335 uint16_t denormalize(IO &) { return Characteristics; } | 360 uint16_t denormalize(IO &) { return Characteristics; } |
336 | 361 |
337 COFF::DLLCharacteristics Characteristics; | 362 COFF::DLLCharacteristics Characteristics; |
338 }; | 363 }; |
339 | 364 |
340 } | 365 } // end anonymous namespace |
341 | 366 |
342 void MappingTraits<COFFYAML::Relocation>::mapping(IO &IO, | 367 void MappingTraits<COFFYAML::Relocation>::mapping(IO &IO, |
343 COFFYAML::Relocation &Rel) { | 368 COFFYAML::Relocation &Rel) { |
344 IO.mapRequired("VirtualAddress", Rel.VirtualAddress); | 369 IO.mapRequired("VirtualAddress", Rel.VirtualAddress); |
345 IO.mapRequired("SymbolName", Rel.SymbolName); | 370 IO.mapRequired("SymbolName", Rel.SymbolName); |
486 IO.mapRequired("Name", Sec.Name); | 511 IO.mapRequired("Name", Sec.Name); |
487 IO.mapRequired("Characteristics", NC->Characteristics); | 512 IO.mapRequired("Characteristics", NC->Characteristics); |
488 IO.mapOptional("VirtualAddress", Sec.Header.VirtualAddress, 0U); | 513 IO.mapOptional("VirtualAddress", Sec.Header.VirtualAddress, 0U); |
489 IO.mapOptional("VirtualSize", Sec.Header.VirtualSize, 0U); | 514 IO.mapOptional("VirtualSize", Sec.Header.VirtualSize, 0U); |
490 IO.mapOptional("Alignment", Sec.Alignment, 0U); | 515 IO.mapOptional("Alignment", Sec.Alignment, 0U); |
491 IO.mapRequired("SectionData", Sec.SectionData); | 516 |
517 // If this is a .debug$S or .debug$T section parse the semantic representation | |
518 // of the symbols/types. If it is any other kind of section, just deal in raw | |
519 // bytes. | |
520 IO.mapOptional("SectionData", Sec.SectionData); | |
521 if (Sec.Name == ".debug$S") | |
522 IO.mapOptional("Subsections", Sec.DebugS); | |
523 else if (Sec.Name == ".debug$T") | |
524 IO.mapOptional("Types", Sec.DebugT); | |
525 | |
492 IO.mapOptional("Relocations", Sec.Relocations); | 526 IO.mapOptional("Relocations", Sec.Relocations); |
493 } | 527 } |
494 | 528 |
495 void MappingTraits<COFFYAML::Object>::mapping(IO &IO, COFFYAML::Object &Obj) { | 529 void MappingTraits<COFFYAML::Object>::mapping(IO &IO, COFFYAML::Object &Obj) { |
496 IO.mapTag("!COFF", true); | 530 IO.mapTag("!COFF", true); |
498 IO.mapRequired("header", Obj.Header); | 532 IO.mapRequired("header", Obj.Header); |
499 IO.mapRequired("sections", Obj.Sections); | 533 IO.mapRequired("sections", Obj.Sections); |
500 IO.mapRequired("symbols", Obj.Symbols); | 534 IO.mapRequired("symbols", Obj.Symbols); |
501 } | 535 } |
502 | 536 |
503 } | 537 } // end namespace yaml |
504 } | 538 |
539 } // end namespace llvm |