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