13ca95b02SDimitry Andric //===- ObjectYAML.cpp - YAML utilities for object files -------------------===//
23ca95b02SDimitry Andric //
33ca95b02SDimitry Andric // The LLVM Compiler Infrastructure
43ca95b02SDimitry Andric //
53ca95b02SDimitry Andric // This file is distributed under the University of Illinois Open Source
63ca95b02SDimitry Andric // License. See LICENSE.TXT for details.
73ca95b02SDimitry Andric //
83ca95b02SDimitry Andric //===----------------------------------------------------------------------===//
93ca95b02SDimitry Andric //
103ca95b02SDimitry Andric // This file defines a wrapper class for handling tagged YAML input
113ca95b02SDimitry Andric //
123ca95b02SDimitry Andric //===----------------------------------------------------------------------===//
133ca95b02SDimitry Andric
143ca95b02SDimitry Andric #include "llvm/ObjectYAML/ObjectYAML.h"
15*a580b014SDimitry Andric #include "llvm/ADT/Twine.h"
16*a580b014SDimitry Andric #include "llvm/Support/YAMLParser.h"
17*a580b014SDimitry Andric #include "llvm/Support/YAMLTraits.h"
18*a580b014SDimitry Andric #include <string>
193ca95b02SDimitry Andric
203ca95b02SDimitry Andric using namespace llvm;
213ca95b02SDimitry Andric using namespace yaml;
223ca95b02SDimitry Andric
mapping(IO & IO,YamlObjectFile & ObjectFile)233ca95b02SDimitry Andric void MappingTraits<YamlObjectFile>::mapping(IO &IO,
243ca95b02SDimitry Andric YamlObjectFile &ObjectFile) {
253ca95b02SDimitry Andric if (IO.outputting()) {
263ca95b02SDimitry Andric if (ObjectFile.Elf)
273ca95b02SDimitry Andric MappingTraits<ELFYAML::Object>::mapping(IO, *ObjectFile.Elf);
283ca95b02SDimitry Andric if (ObjectFile.Coff)
293ca95b02SDimitry Andric MappingTraits<COFFYAML::Object>::mapping(IO, *ObjectFile.Coff);
303ca95b02SDimitry Andric if (ObjectFile.MachO)
313ca95b02SDimitry Andric MappingTraits<MachOYAML::Object>::mapping(IO, *ObjectFile.MachO);
323ca95b02SDimitry Andric if (ObjectFile.FatMachO)
333ca95b02SDimitry Andric MappingTraits<MachOYAML::UniversalBinary>::mapping(IO,
343ca95b02SDimitry Andric *ObjectFile.FatMachO);
353ca95b02SDimitry Andric } else {
363ca95b02SDimitry Andric if (IO.mapTag("!ELF")) {
373ca95b02SDimitry Andric ObjectFile.Elf.reset(new ELFYAML::Object());
383ca95b02SDimitry Andric MappingTraits<ELFYAML::Object>::mapping(IO, *ObjectFile.Elf);
393ca95b02SDimitry Andric } else if (IO.mapTag("!COFF")) {
403ca95b02SDimitry Andric ObjectFile.Coff.reset(new COFFYAML::Object());
413ca95b02SDimitry Andric MappingTraits<COFFYAML::Object>::mapping(IO, *ObjectFile.Coff);
423ca95b02SDimitry Andric } else if (IO.mapTag("!mach-o")) {
433ca95b02SDimitry Andric ObjectFile.MachO.reset(new MachOYAML::Object());
443ca95b02SDimitry Andric MappingTraits<MachOYAML::Object>::mapping(IO, *ObjectFile.MachO);
453ca95b02SDimitry Andric } else if (IO.mapTag("!fat-mach-o")) {
463ca95b02SDimitry Andric ObjectFile.FatMachO.reset(new MachOYAML::UniversalBinary());
473ca95b02SDimitry Andric MappingTraits<MachOYAML::UniversalBinary>::mapping(IO,
483ca95b02SDimitry Andric *ObjectFile.FatMachO);
497a7e6055SDimitry Andric } else if (IO.mapTag("!WASM")) {
507a7e6055SDimitry Andric ObjectFile.Wasm.reset(new WasmYAML::Object());
517a7e6055SDimitry Andric MappingTraits<WasmYAML::Object>::mapping(IO, *ObjectFile.Wasm);
523ca95b02SDimitry Andric } else {
533ca95b02SDimitry Andric Input &In = (Input &)IO;
543ca95b02SDimitry Andric std::string Tag = In.getCurrentNode()->getRawTag();
553ca95b02SDimitry Andric if (Tag.empty())
563ca95b02SDimitry Andric IO.setError("YAML Object File missing document type tag!");
573ca95b02SDimitry Andric else
583ca95b02SDimitry Andric IO.setError(
59*a580b014SDimitry Andric Twine("YAML Object File unsupported document type tag '") +
60*a580b014SDimitry Andric Twine(Tag) + Twine("'!"));
613ca95b02SDimitry Andric }
623ca95b02SDimitry Andric }
633ca95b02SDimitry Andric }
64