86 lines · cpp
1//===- ObjectYAML.cpp - YAML utilities for object files -------------------===//2//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-exception6//7//===----------------------------------------------------------------------===//8//9// This file defines a wrapper class for handling tagged YAML input10//11//===----------------------------------------------------------------------===//12 13#include "llvm/ObjectYAML/ObjectYAML.h"14#include "llvm/ADT/Twine.h"15#include "llvm/Support/YAMLParser.h"16#include "llvm/Support/YAMLTraits.h"17#include <string>18 19using namespace llvm;20using namespace yaml;21 22void MappingTraits<YamlObjectFile>::mapping(IO &IO,23 YamlObjectFile &ObjectFile) {24 if (IO.outputting()) {25 if (ObjectFile.Elf)26 MappingTraits<ELFYAML::Object>::mapping(IO, *ObjectFile.Elf);27 if (ObjectFile.Coff)28 MappingTraits<COFFYAML::Object>::mapping(IO, *ObjectFile.Coff);29 if (ObjectFile.Goff)30 MappingTraits<GOFFYAML::Object>::mapping(IO, *ObjectFile.Goff);31 if (ObjectFile.MachO)32 MappingTraits<MachOYAML::Object>::mapping(IO, *ObjectFile.MachO);33 if (ObjectFile.FatMachO)34 MappingTraits<MachOYAML::UniversalBinary>::mapping(IO,35 *ObjectFile.FatMachO);36 } else {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);41 std::string Err =42 MappingTraits<ArchYAML::Archive>::validate(IO, *ObjectFile.Arch);43 if (!Err.empty())44 IO.setError(Err);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!");80 else81 IO.setError("YAML Object File unsupported document type tag '" +82 N->getRawTag() + "'!");83 }84 }85}86