1303231Sdim//===- ObjectYAML.cpp - YAML utilities for object files -------------------===// 2303231Sdim// 3353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4353358Sdim// See https://llvm.org/LICENSE.txt for license information. 5353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6303231Sdim// 7303231Sdim//===----------------------------------------------------------------------===// 8303231Sdim// 9303231Sdim// This file defines a wrapper class for handling tagged YAML input 10303231Sdim// 11303231Sdim//===----------------------------------------------------------------------===// 12303231Sdim 13303231Sdim#include "llvm/ObjectYAML/ObjectYAML.h" 14321369Sdim#include "llvm/ADT/Twine.h" 15321369Sdim#include "llvm/Support/YAMLParser.h" 16321369Sdim#include "llvm/Support/YAMLTraits.h" 17321369Sdim#include <string> 18303231Sdim 19303231Sdimusing namespace llvm; 20303231Sdimusing namespace yaml; 21303231Sdim 22303231Sdimvoid MappingTraits<YamlObjectFile>::mapping(IO &IO, 23303231Sdim YamlObjectFile &ObjectFile) { 24303231Sdim if (IO.outputting()) { 25303231Sdim if (ObjectFile.Elf) 26303231Sdim MappingTraits<ELFYAML::Object>::mapping(IO, *ObjectFile.Elf); 27303231Sdim if (ObjectFile.Coff) 28303231Sdim MappingTraits<COFFYAML::Object>::mapping(IO, *ObjectFile.Coff); 29303231Sdim if (ObjectFile.MachO) 30303231Sdim MappingTraits<MachOYAML::Object>::mapping(IO, *ObjectFile.MachO); 31303231Sdim if (ObjectFile.FatMachO) 32303231Sdim MappingTraits<MachOYAML::UniversalBinary>::mapping(IO, 33303231Sdim *ObjectFile.FatMachO); 34303231Sdim } else { 35353358Sdim Input &In = (Input &)IO; 36303231Sdim if (IO.mapTag("!ELF")) { 37303231Sdim ObjectFile.Elf.reset(new ELFYAML::Object()); 38303231Sdim MappingTraits<ELFYAML::Object>::mapping(IO, *ObjectFile.Elf); 39303231Sdim } else if (IO.mapTag("!COFF")) { 40303231Sdim ObjectFile.Coff.reset(new COFFYAML::Object()); 41303231Sdim MappingTraits<COFFYAML::Object>::mapping(IO, *ObjectFile.Coff); 42303231Sdim } else if (IO.mapTag("!mach-o")) { 43303231Sdim ObjectFile.MachO.reset(new MachOYAML::Object()); 44303231Sdim MappingTraits<MachOYAML::Object>::mapping(IO, *ObjectFile.MachO); 45303231Sdim } else if (IO.mapTag("!fat-mach-o")) { 46303231Sdim ObjectFile.FatMachO.reset(new MachOYAML::UniversalBinary()); 47303231Sdim MappingTraits<MachOYAML::UniversalBinary>::mapping(IO, 48303231Sdim *ObjectFile.FatMachO); 49353358Sdim } else if (IO.mapTag("!minidump")) { 50353358Sdim ObjectFile.Minidump.reset(new MinidumpYAML::Object()); 51353358Sdim MappingTraits<MinidumpYAML::Object>::mapping(IO, *ObjectFile.Minidump); 52321369Sdim } else if (IO.mapTag("!WASM")) { 53321369Sdim ObjectFile.Wasm.reset(new WasmYAML::Object()); 54321369Sdim MappingTraits<WasmYAML::Object>::mapping(IO, *ObjectFile.Wasm); 55353358Sdim } else if (const Node *N = In.getCurrentNode()) { 56353358Sdim if (N->getRawTag().empty()) 57303231Sdim IO.setError("YAML Object File missing document type tag!"); 58303231Sdim else 59353358Sdim IO.setError("YAML Object File unsupported document type tag '" + 60353358Sdim N->getRawTag() + "'!"); 61303231Sdim } 62303231Sdim } 63303231Sdim} 64