mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-26 04:32:44 +01:00
92e836cfd2
Mostly this change adds support converting to and from YAML which will allow us to write more test cases for the WebAssembly MC and lld ports. Better support for objdump, readelf, and nm will be in followup CLs. I had to update the two wasm test binaries because they used the old style 'name' section which is no longer supported. Differential Revision: https://reviews.llvm.org/D31099 Patch by Sam Clegg llvm-svn: 299101
61 lines
2.4 KiB
C++
61 lines
2.4 KiB
C++
//===- ObjectYAML.cpp - YAML utilities for object files -------------------===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file defines a wrapper class for handling tagged YAML input
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "llvm/ObjectYAML/YAML.h"
|
|
#include "llvm/ObjectYAML/ObjectYAML.h"
|
|
|
|
using namespace llvm;
|
|
using namespace yaml;
|
|
|
|
void MappingTraits<YamlObjectFile>::mapping(IO &IO,
|
|
YamlObjectFile &ObjectFile) {
|
|
if (IO.outputting()) {
|
|
if (ObjectFile.Elf)
|
|
MappingTraits<ELFYAML::Object>::mapping(IO, *ObjectFile.Elf);
|
|
if (ObjectFile.Coff)
|
|
MappingTraits<COFFYAML::Object>::mapping(IO, *ObjectFile.Coff);
|
|
if (ObjectFile.MachO)
|
|
MappingTraits<MachOYAML::Object>::mapping(IO, *ObjectFile.MachO);
|
|
if (ObjectFile.FatMachO)
|
|
MappingTraits<MachOYAML::UniversalBinary>::mapping(IO,
|
|
*ObjectFile.FatMachO);
|
|
} else {
|
|
if (IO.mapTag("!ELF")) {
|
|
ObjectFile.Elf.reset(new ELFYAML::Object());
|
|
MappingTraits<ELFYAML::Object>::mapping(IO, *ObjectFile.Elf);
|
|
} else if (IO.mapTag("!COFF")) {
|
|
ObjectFile.Coff.reset(new COFFYAML::Object());
|
|
MappingTraits<COFFYAML::Object>::mapping(IO, *ObjectFile.Coff);
|
|
} else if (IO.mapTag("!mach-o")) {
|
|
ObjectFile.MachO.reset(new MachOYAML::Object());
|
|
MappingTraits<MachOYAML::Object>::mapping(IO, *ObjectFile.MachO);
|
|
} else if (IO.mapTag("!fat-mach-o")) {
|
|
ObjectFile.FatMachO.reset(new MachOYAML::UniversalBinary());
|
|
MappingTraits<MachOYAML::UniversalBinary>::mapping(IO,
|
|
*ObjectFile.FatMachO);
|
|
} else if (IO.mapTag("!WASM")) {
|
|
ObjectFile.Wasm.reset(new WasmYAML::Object());
|
|
MappingTraits<WasmYAML::Object>::mapping(IO, *ObjectFile.Wasm);
|
|
} else {
|
|
Input &In = (Input &)IO;
|
|
std::string Tag = In.getCurrentNode()->getRawTag();
|
|
if (Tag.empty())
|
|
IO.setError("YAML Object File missing document type tag!");
|
|
else
|
|
IO.setError(
|
|
llvm::Twine("YAML Object File unsupported document type tag '") +
|
|
llvm::Twine(Tag) + llvm::Twine("'!"));
|
|
}
|
|
}
|
|
}
|