1 //===- ObjectYAML.cpp - YAML utilities for object files -------------------===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 // This file defines a wrapper class for handling tagged YAML input
11 //===----------------------------------------------------------------------===//
13 #include "llvm/ObjectYAML/ObjectYAML.h"
14 #include "llvm/ADT/Twine.h"
15 #include "llvm/Support/YAMLParser.h"
16 #include "llvm/Support/YAMLTraits.h"
22 void MappingTraits
<YamlObjectFile
>::mapping(IO
&IO
,
23 YamlObjectFile
&ObjectFile
) {
24 if (IO
.outputting()) {
26 MappingTraits
<ELFYAML::Object
>::mapping(IO
, *ObjectFile
.Elf
);
28 MappingTraits
<COFFYAML::Object
>::mapping(IO
, *ObjectFile
.Coff
);
30 MappingTraits
<GOFFYAML::Object
>::mapping(IO
, *ObjectFile
.Goff
);
32 MappingTraits
<MachOYAML::Object
>::mapping(IO
, *ObjectFile
.MachO
);
33 if (ObjectFile
.FatMachO
)
34 MappingTraits
<MachOYAML::UniversalBinary
>::mapping(IO
,
35 *ObjectFile
.FatMachO
);
37 Input
&In
= (Input
&)IO
;
38 if (IO
.mapTag("!Arch")) {
39 ObjectFile
.Arch
.reset(new ArchYAML::Archive());
40 MappingTraits
<ArchYAML::Archive
>::mapping(IO
, *ObjectFile
.Arch
);
42 MappingTraits
<ArchYAML::Archive
>::validate(IO
, *ObjectFile
.Arch
);
45 } else if (IO
.mapTag("!ELF")) {
46 ObjectFile
.Elf
.reset(new ELFYAML::Object());
47 MappingTraits
<ELFYAML::Object
>::mapping(IO
, *ObjectFile
.Elf
);
48 } else if (IO
.mapTag("!COFF")) {
49 ObjectFile
.Coff
.reset(new COFFYAML::Object());
50 MappingTraits
<COFFYAML::Object
>::mapping(IO
, *ObjectFile
.Coff
);
51 } else if (IO
.mapTag("!GOFF")) {
52 ObjectFile
.Goff
.reset(new GOFFYAML::Object());
53 MappingTraits
<GOFFYAML::Object
>::mapping(IO
, *ObjectFile
.Goff
);
54 } else if (IO
.mapTag("!mach-o")) {
55 ObjectFile
.MachO
.reset(new MachOYAML::Object());
56 MappingTraits
<MachOYAML::Object
>::mapping(IO
, *ObjectFile
.MachO
);
57 } else if (IO
.mapTag("!fat-mach-o")) {
58 ObjectFile
.FatMachO
.reset(new MachOYAML::UniversalBinary());
59 MappingTraits
<MachOYAML::UniversalBinary
>::mapping(IO
,
60 *ObjectFile
.FatMachO
);
61 } else if (IO
.mapTag("!minidump")) {
62 ObjectFile
.Minidump
.reset(new MinidumpYAML::Object());
63 MappingTraits
<MinidumpYAML::Object
>::mapping(IO
, *ObjectFile
.Minidump
);
64 } else if (IO
.mapTag("!Offload")) {
65 ObjectFile
.Offload
.reset(new OffloadYAML::Binary());
66 MappingTraits
<OffloadYAML::Binary
>::mapping(IO
, *ObjectFile
.Offload
);
67 } else if (IO
.mapTag("!WASM")) {
68 ObjectFile
.Wasm
.reset(new WasmYAML::Object());
69 MappingTraits
<WasmYAML::Object
>::mapping(IO
, *ObjectFile
.Wasm
);
70 } else if (IO
.mapTag("!XCOFF")) {
71 ObjectFile
.Xcoff
.reset(new XCOFFYAML::Object());
72 MappingTraits
<XCOFFYAML::Object
>::mapping(IO
, *ObjectFile
.Xcoff
);
73 } else if (IO
.mapTag("!dxcontainer")) {
74 ObjectFile
.DXContainer
.reset(new DXContainerYAML::Object());
75 MappingTraits
<DXContainerYAML::Object
>::mapping(IO
,
76 *ObjectFile
.DXContainer
);
77 } else if (const Node
*N
= In
.getCurrentNode()) {
78 if (N
->getRawTag().empty())
79 IO
.setError("YAML Object File missing document type tag!");
81 IO
.setError("YAML Object File unsupported document type tag '" +
82 N
->getRawTag() + "'!");