106f32e7eSjoerg //===- ObjectYAML.cpp - YAML utilities for object files -------------------===//
206f32e7eSjoerg //
306f32e7eSjoerg // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
406f32e7eSjoerg // See https://llvm.org/LICENSE.txt for license information.
506f32e7eSjoerg // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
606f32e7eSjoerg //
706f32e7eSjoerg //===----------------------------------------------------------------------===//
806f32e7eSjoerg //
906f32e7eSjoerg // This file defines a wrapper class for handling tagged YAML input
1006f32e7eSjoerg //
1106f32e7eSjoerg //===----------------------------------------------------------------------===//
1206f32e7eSjoerg 
1306f32e7eSjoerg #include "llvm/ObjectYAML/ObjectYAML.h"
1406f32e7eSjoerg #include "llvm/ADT/Twine.h"
1506f32e7eSjoerg #include "llvm/Support/YAMLParser.h"
1606f32e7eSjoerg #include "llvm/Support/YAMLTraits.h"
1706f32e7eSjoerg #include <string>
1806f32e7eSjoerg 
1906f32e7eSjoerg using namespace llvm;
2006f32e7eSjoerg using namespace yaml;
2106f32e7eSjoerg 
mapping(IO & IO,YamlObjectFile & ObjectFile)2206f32e7eSjoerg void MappingTraits<YamlObjectFile>::mapping(IO &IO,
2306f32e7eSjoerg                                             YamlObjectFile &ObjectFile) {
2406f32e7eSjoerg   if (IO.outputting()) {
2506f32e7eSjoerg     if (ObjectFile.Elf)
2606f32e7eSjoerg       MappingTraits<ELFYAML::Object>::mapping(IO, *ObjectFile.Elf);
2706f32e7eSjoerg     if (ObjectFile.Coff)
2806f32e7eSjoerg       MappingTraits<COFFYAML::Object>::mapping(IO, *ObjectFile.Coff);
2906f32e7eSjoerg     if (ObjectFile.MachO)
3006f32e7eSjoerg       MappingTraits<MachOYAML::Object>::mapping(IO, *ObjectFile.MachO);
3106f32e7eSjoerg     if (ObjectFile.FatMachO)
3206f32e7eSjoerg       MappingTraits<MachOYAML::UniversalBinary>::mapping(IO,
3306f32e7eSjoerg                                                          *ObjectFile.FatMachO);
3406f32e7eSjoerg   } else {
3506f32e7eSjoerg     Input &In = (Input &)IO;
36*da58b97aSjoerg     if (IO.mapTag("!Arch")) {
37*da58b97aSjoerg       ObjectFile.Arch.reset(new ArchYAML::Archive());
38*da58b97aSjoerg       MappingTraits<ArchYAML::Archive>::mapping(IO, *ObjectFile.Arch);
39*da58b97aSjoerg       std::string Err =
40*da58b97aSjoerg           MappingTraits<ArchYAML::Archive>::validate(IO, *ObjectFile.Arch);
41*da58b97aSjoerg       if (!Err.empty())
42*da58b97aSjoerg         IO.setError(Err);
43*da58b97aSjoerg     } else if (IO.mapTag("!ELF")) {
4406f32e7eSjoerg       ObjectFile.Elf.reset(new ELFYAML::Object());
4506f32e7eSjoerg       MappingTraits<ELFYAML::Object>::mapping(IO, *ObjectFile.Elf);
4606f32e7eSjoerg     } else if (IO.mapTag("!COFF")) {
4706f32e7eSjoerg       ObjectFile.Coff.reset(new COFFYAML::Object());
4806f32e7eSjoerg       MappingTraits<COFFYAML::Object>::mapping(IO, *ObjectFile.Coff);
4906f32e7eSjoerg     } else if (IO.mapTag("!mach-o")) {
5006f32e7eSjoerg       ObjectFile.MachO.reset(new MachOYAML::Object());
5106f32e7eSjoerg       MappingTraits<MachOYAML::Object>::mapping(IO, *ObjectFile.MachO);
5206f32e7eSjoerg     } else if (IO.mapTag("!fat-mach-o")) {
5306f32e7eSjoerg       ObjectFile.FatMachO.reset(new MachOYAML::UniversalBinary());
5406f32e7eSjoerg       MappingTraits<MachOYAML::UniversalBinary>::mapping(IO,
5506f32e7eSjoerg                                                          *ObjectFile.FatMachO);
5606f32e7eSjoerg     } else if (IO.mapTag("!minidump")) {
5706f32e7eSjoerg       ObjectFile.Minidump.reset(new MinidumpYAML::Object());
5806f32e7eSjoerg       MappingTraits<MinidumpYAML::Object>::mapping(IO, *ObjectFile.Minidump);
5906f32e7eSjoerg     } else if (IO.mapTag("!WASM")) {
6006f32e7eSjoerg       ObjectFile.Wasm.reset(new WasmYAML::Object());
6106f32e7eSjoerg       MappingTraits<WasmYAML::Object>::mapping(IO, *ObjectFile.Wasm);
6206f32e7eSjoerg     } else if (const Node *N = In.getCurrentNode()) {
6306f32e7eSjoerg       if (N->getRawTag().empty())
6406f32e7eSjoerg         IO.setError("YAML Object File missing document type tag!");
6506f32e7eSjoerg       else
6606f32e7eSjoerg         IO.setError("YAML Object File unsupported document type tag '" +
6706f32e7eSjoerg                     N->getRawTag() + "'!");
6806f32e7eSjoerg     }
6906f32e7eSjoerg   }
7006f32e7eSjoerg }
71