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
<MachOYAML::Object
>::mapping(IO
, *ObjectFile
.MachO
);
31 if (ObjectFile
.FatMachO
)
32 MappingTraits
<MachOYAML::UniversalBinary
>::mapping(IO
,
33 *ObjectFile
.FatMachO
);
35 Input
&In
= (Input
&)IO
;
36 if (IO
.mapTag("!ELF")) {
37 ObjectFile
.Elf
.reset(new ELFYAML::Object());
38 MappingTraits
<ELFYAML::Object
>::mapping(IO
, *ObjectFile
.Elf
);
39 } else if (IO
.mapTag("!COFF")) {
40 ObjectFile
.Coff
.reset(new COFFYAML::Object());
41 MappingTraits
<COFFYAML::Object
>::mapping(IO
, *ObjectFile
.Coff
);
42 } else if (IO
.mapTag("!mach-o")) {
43 ObjectFile
.MachO
.reset(new MachOYAML::Object());
44 MappingTraits
<MachOYAML::Object
>::mapping(IO
, *ObjectFile
.MachO
);
45 } else if (IO
.mapTag("!fat-mach-o")) {
46 ObjectFile
.FatMachO
.reset(new MachOYAML::UniversalBinary());
47 MappingTraits
<MachOYAML::UniversalBinary
>::mapping(IO
,
48 *ObjectFile
.FatMachO
);
49 } else if (IO
.mapTag("!minidump")) {
50 ObjectFile
.Minidump
.reset(new MinidumpYAML::Object());
51 MappingTraits
<MinidumpYAML::Object
>::mapping(IO
, *ObjectFile
.Minidump
);
52 } else if (IO
.mapTag("!WASM")) {
53 ObjectFile
.Wasm
.reset(new WasmYAML::Object());
54 MappingTraits
<WasmYAML::Object
>::mapping(IO
, *ObjectFile
.Wasm
);
55 } else if (const Node
*N
= In
.getCurrentNode()) {
56 if (N
->getRawTag().empty())
57 IO
.setError("YAML Object File missing document type tag!");
59 IO
.setError("YAML Object File unsupported document type tag '" +
60 N
->getRawTag() + "'!");