1 //===- ObjectYAML.cpp - YAML utilities for object files -------------------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This file defines a wrapper class for handling tagged YAML input 11 // 12 //===----------------------------------------------------------------------===// 13 14 #include "llvm/ObjectYAML/YAML.h" 15 #include "llvm/ObjectYAML/ObjectYAML.h" 16 17 using namespace llvm; 18 using namespace yaml; 19 20 void MappingTraits<YamlObjectFile>::mapping(IO &IO, 21 YamlObjectFile &ObjectFile) { 22 if (IO.outputting()) { 23 if (ObjectFile.Elf) 24 MappingTraits<ELFYAML::Object>::mapping(IO, *ObjectFile.Elf); 25 if (ObjectFile.Coff) 26 MappingTraits<COFFYAML::Object>::mapping(IO, *ObjectFile.Coff); 27 if (ObjectFile.MachO) 28 MappingTraits<MachOYAML::Object>::mapping(IO, *ObjectFile.MachO); 29 if (ObjectFile.FatMachO) 30 MappingTraits<MachOYAML::UniversalBinary>::mapping(IO, 31 *ObjectFile.FatMachO); 32 } else { 33 if (IO.mapTag("!ELF")) { 34 ObjectFile.Elf.reset(new ELFYAML::Object()); 35 MappingTraits<ELFYAML::Object>::mapping(IO, *ObjectFile.Elf); 36 } else if (IO.mapTag("!COFF")) { 37 ObjectFile.Coff.reset(new COFFYAML::Object()); 38 MappingTraits<COFFYAML::Object>::mapping(IO, *ObjectFile.Coff); 39 } else if (IO.mapTag("!mach-o")) { 40 ObjectFile.MachO.reset(new MachOYAML::Object()); 41 MappingTraits<MachOYAML::Object>::mapping(IO, *ObjectFile.MachO); 42 } else if (IO.mapTag("!fat-mach-o")) { 43 ObjectFile.FatMachO.reset(new MachOYAML::UniversalBinary()); 44 MappingTraits<MachOYAML::UniversalBinary>::mapping(IO, 45 *ObjectFile.FatMachO); 46 } else if (IO.mapTag("!WASM")) { 47 ObjectFile.Wasm.reset(new WasmYAML::Object()); 48 MappingTraits<WasmYAML::Object>::mapping(IO, *ObjectFile.Wasm); 49 } else { 50 Input &In = (Input &)IO; 51 std::string Tag = In.getCurrentNode()->getRawTag(); 52 if (Tag.empty()) 53 IO.setError("YAML Object File missing document type tag!"); 54 else 55 IO.setError( 56 llvm::Twine("YAML Object File unsupported document type tag '") + 57 llvm::Twine(Tag) + llvm::Twine("'!")); 58 } 59 } 60 } 61