mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 11:42:57 +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
66 lines
2.1 KiB
C++
66 lines
2.1 KiB
C++
//===------ utils/obj2yaml.cpp - obj2yaml conversion tool -------*- C++ -*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "Error.h"
|
|
#include "obj2yaml.h"
|
|
#include "llvm/Object/Archive.h"
|
|
#include "llvm/Object/COFF.h"
|
|
#include "llvm/Support/CommandLine.h"
|
|
#include "llvm/Support/ManagedStatic.h"
|
|
#include "llvm/Support/PrettyStackTrace.h"
|
|
#include "llvm/Support/Signals.h"
|
|
|
|
using namespace llvm;
|
|
using namespace llvm::object;
|
|
|
|
static std::error_code dumpObject(const ObjectFile &Obj) {
|
|
if (Obj.isCOFF())
|
|
return coff2yaml(outs(), cast<COFFObjectFile>(Obj));
|
|
if (Obj.isELF())
|
|
return elf2yaml(outs(), Obj);
|
|
if (Obj.isWasm())
|
|
return wasm2yaml(outs(), cast<WasmObjectFile>(Obj));
|
|
|
|
return obj2yaml_error::unsupported_obj_file_format;
|
|
}
|
|
|
|
static std::error_code dumpInput(StringRef File) {
|
|
Expected<OwningBinary<Binary>> BinaryOrErr = createBinary(File);
|
|
if (!BinaryOrErr)
|
|
return errorToErrorCode(BinaryOrErr.takeError());
|
|
|
|
Binary &Binary = *BinaryOrErr.get().getBinary();
|
|
// Universal MachO is not a subclass of ObjectFile, so it needs to be handled
|
|
// here with the other binary types.
|
|
if (Binary.isMachO() || Binary.isMachOUniversalBinary())
|
|
return macho2yaml(outs(), Binary);
|
|
// TODO: If this is an archive, then burst it and dump each entry
|
|
if (ObjectFile *Obj = dyn_cast<ObjectFile>(&Binary))
|
|
return dumpObject(*Obj);
|
|
|
|
return obj2yaml_error::unrecognized_file_format;
|
|
}
|
|
|
|
cl::opt<std::string> InputFilename(cl::Positional, cl::desc("<input file>"),
|
|
cl::init("-"));
|
|
|
|
int main(int argc, char *argv[]) {
|
|
cl::ParseCommandLineOptions(argc, argv);
|
|
sys::PrintStackTraceOnErrorSignal(argv[0]);
|
|
PrettyStackTraceProgram X(argc, argv);
|
|
llvm_shutdown_obj Y; // Call llvm_shutdown() on exit.
|
|
|
|
if (std::error_code EC = dumpInput(InputFilename)) {
|
|
errs() << "Error: '" << EC.message() << "'\n";
|
|
return 1;
|
|
}
|
|
|
|
return 0;
|
|
}
|