Home | History | Annotate | Download | only in ObjectYAML
      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 {
     47       Input &In = (Input &)IO;
     48       std::string Tag = In.getCurrentNode()->getRawTag();
     49       if (Tag.empty())
     50         IO.setError("YAML Object File missing document type tag!");
     51       else
     52         IO.setError(
     53             llvm::Twine("YAML Object File unsupported document type tag '") +
     54             llvm::Twine(Tag.c_str()) + llvm::Twine("'!"));
     55     }
     56   }
     57 }
     58