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