mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 03:33:20 +01:00
13fafb5bb5
No changes, LLD code was updated in r366057. Original commit message: ELF.h contains two getSymbol methods which seems to be used only from obj2yaml. One of these methods calls another, which in turn contains untested error message which doesn't provide enough information. Problem is that after improving only just that message, obj2yaml will not show it, ("Error reading file: yaml: Invalid data was encountered while parsing the file" message will be shown instead), because internal errors handling of tool is based on ErrorOr<> class which stores a error code and as a result can only show a predefined error string, what actually isn't very useful. In this patch, I rework obj2yaml's error reporting system for ELF targets to use Error Expected<> classes. Also, I improve the error message produced by getSymbol for demonstration of the new functionality. Differential revision: https://reviews.llvm.org/D64631 llvm-svn: 366058
80 lines
2.4 KiB
C++
80 lines
2.4 KiB
C++
//===------ utils/obj2yaml.cpp - obj2yaml conversion tool -------*- C++ -*-===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "obj2yaml.h"
|
|
#include "Error.h"
|
|
#include "llvm/Object/Archive.h"
|
|
#include "llvm/Object/COFF.h"
|
|
#include "llvm/Object/Minidump.h"
|
|
#include "llvm/Support/CommandLine.h"
|
|
#include "llvm/Support/InitLLVM.h"
|
|
|
|
using namespace llvm;
|
|
using namespace llvm::object;
|
|
|
|
static Error dumpObject(const ObjectFile &Obj) {
|
|
if (Obj.isCOFF())
|
|
return errorCodeToError(coff2yaml(outs(), cast<COFFObjectFile>(Obj)));
|
|
|
|
if (Obj.isXCOFF())
|
|
return errorCodeToError(xcoff2yaml(outs(), cast<XCOFFObjectFile>(Obj)));
|
|
|
|
if (Obj.isELF())
|
|
return elf2yaml(outs(), Obj);
|
|
|
|
if (Obj.isWasm())
|
|
return errorCodeToError(wasm2yaml(outs(), cast<WasmObjectFile>(Obj)));
|
|
|
|
return errorCodeToError(obj2yaml_error::unsupported_obj_file_format);
|
|
}
|
|
|
|
static Error dumpInput(StringRef File) {
|
|
Expected<OwningBinary<Binary>> BinaryOrErr = createBinary(File);
|
|
if (!BinaryOrErr)
|
|
return 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 errorCodeToError(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);
|
|
if (MinidumpFile *Minidump = dyn_cast<MinidumpFile>(&Binary))
|
|
return minidump2yaml(outs(), *Minidump);
|
|
|
|
return Error::success();
|
|
}
|
|
|
|
static void reportError(StringRef Input, Error Err) {
|
|
if (Input == "-")
|
|
Input = "<stdin>";
|
|
std::string ErrMsg;
|
|
raw_string_ostream OS(ErrMsg);
|
|
logAllUnhandledErrors(std::move(Err), OS);
|
|
OS.flush();
|
|
errs() << "Error reading file: " << Input << ": " << ErrMsg;
|
|
errs().flush();
|
|
}
|
|
|
|
cl::opt<std::string> InputFilename(cl::Positional, cl::desc("<input file>"),
|
|
cl::init("-"));
|
|
|
|
int main(int argc, char *argv[]) {
|
|
InitLLVM X(argc, argv);
|
|
cl::ParseCommandLineOptions(argc, argv);
|
|
|
|
if (Error Err = dumpInput(InputFilename)) {
|
|
reportError(InputFilename, std::move(Err));
|
|
return 1;
|
|
}
|
|
|
|
return 0;
|
|
}
|