diff options
author | jasonliu <jasonliu.development@gmail.com> | 2020-03-27 16:02:27 +0000 |
---|---|---|
committer | jasonliu <jasonliu.development@gmail.com> | 2020-03-27 16:05:42 +0000 |
commit | d60d7d69de9b559beae6cce1e3df79240e0fddf1 (patch) | |
tree | 62b8acb4e144a27bfe5e72240e52504b691dcde2 /llvm/tools/llvm-objdump | |
parent | bd722ef63f18ee672d60358113431f9bb5c55380 (diff) | |
download | llvm-d60d7d69de9b559beae6cce1e3df79240e0fddf1.zip llvm-d60d7d69de9b559beae6cce1e3df79240e0fddf1.tar.gz llvm-d60d7d69de9b559beae6cce1e3df79240e0fddf1.tar.bz2 |
[llvm-objdump][XCOFF][AIX] Implement -r option
Summary:
Implement several XCOFF hooks to get '-r' option working for llvm-objdump -r.
Reviewer: DiggerLin, hubert.reinterpretcast, jhenderson, MaskRay
Differential Revision: https://reviews.llvm.org/D75131
Diffstat (limited to 'llvm/tools/llvm-objdump')
-rw-r--r-- | llvm/tools/llvm-objdump/CMakeLists.txt | 1 | ||||
-rw-r--r-- | llvm/tools/llvm-objdump/XCOFFDump.cpp | 34 | ||||
-rw-r--r-- | llvm/tools/llvm-objdump/llvm-objdump.cpp | 3 | ||||
-rw-r--r-- | llvm/tools/llvm-objdump/llvm-objdump.h | 4 |
4 files changed, 42 insertions, 0 deletions
diff --git a/llvm/tools/llvm-objdump/CMakeLists.txt b/llvm/tools/llvm-objdump/CMakeLists.txt index d8f320e..91c28dd 100644 --- a/llvm/tools/llvm-objdump/CMakeLists.txt +++ b/llvm/tools/llvm-objdump/CMakeLists.txt @@ -20,6 +20,7 @@ add_llvm_tool(llvm-objdump ELFDump.cpp MachODump.cpp WasmDump.cpp + XCOFFDump.cpp ) if(HAVE_LIBXAR) diff --git a/llvm/tools/llvm-objdump/XCOFFDump.cpp b/llvm/tools/llvm-objdump/XCOFFDump.cpp new file mode 100644 index 0000000..6712391 --- /dev/null +++ b/llvm/tools/llvm-objdump/XCOFFDump.cpp @@ -0,0 +1,34 @@ +//===-- XCOFFDump.cpp - XCOFF-specific dumper -------------------*- 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 +// +//===----------------------------------------------------------------------===// +/// +/// \file +/// This file implements the XCOFF-specific dumper for llvm-objdump. +/// +//===----------------------------------------------------------------------===// + +#include "llvm-objdump.h" +#include "llvm/Object/XCOFFObjectFile.h" + +using namespace llvm::object; + +llvm::Error llvm::getXCOFFRelocationValueString(const XCOFFObjectFile *Obj, + const RelocationRef &Rel, + SmallVectorImpl<char> &Result) { + symbol_iterator SymI = Rel.getSymbol(); + if (SymI == Obj->symbol_end()) + return make_error<GenericBinaryError>( + "invalid symbol reference in relocation entry", + object_error::parse_failed); + + Expected<StringRef> SymNameOrErr = SymI->getName(); + if (!SymNameOrErr) + return SymNameOrErr.takeError(); + StringRef SymName = *SymNameOrErr; + Result.append(SymName.begin(), SymName.end()); + return Error::success(); +} diff --git a/llvm/tools/llvm-objdump/llvm-objdump.cpp b/llvm/tools/llvm-objdump/llvm-objdump.cpp index 2bbf4b7..4d5e09f 100644 --- a/llvm/tools/llvm-objdump/llvm-objdump.cpp +++ b/llvm/tools/llvm-objdump/llvm-objdump.cpp @@ -45,6 +45,7 @@ #include "llvm/Object/MachO.h" #include "llvm/Object/MachOUniversal.h" #include "llvm/Object/ObjectFile.h" +#include "llvm/Object/XCOFFObjectFile.h" #include "llvm/Object/Wasm.h" #include "llvm/Support/Casting.h" #include "llvm/Support/CommandLine.h" @@ -500,6 +501,8 @@ static Error getRelocationValueString(const RelocationRef &Rel, return getWasmRelocationValueString(Wasm, Rel, Result); if (auto *MachO = dyn_cast<MachOObjectFile>(Obj)) return getMachORelocationValueString(MachO, Rel, Result); + if (auto *XCOFF = dyn_cast<XCOFFObjectFile>(Obj)) + return getXCOFFRelocationValueString(XCOFF, Rel, Result); llvm_unreachable("unknown object file format"); } diff --git a/llvm/tools/llvm-objdump/llvm-objdump.h b/llvm/tools/llvm-objdump/llvm-objdump.h index 43ce02a..e75b80a 100644 --- a/llvm/tools/llvm-objdump/llvm-objdump.h +++ b/llvm/tools/llvm-objdump/llvm-objdump.h @@ -25,6 +25,7 @@ class ELFSectionRef; class MachOObjectFile; class MachOUniversalBinary; class RelocationRef; +class XCOFFObjectFile; } extern cl::opt<bool> Demangle; @@ -105,6 +106,9 @@ Error getWasmRelocationValueString(const object::WasmObjectFile *Obj, Error getMachORelocationValueString(const object::MachOObjectFile *Obj, const object::RelocationRef &RelRef, llvm::SmallVectorImpl<char> &Result); +Error getXCOFFRelocationValueString(const object::XCOFFObjectFile *Obj, + const object::RelocationRef &RelRef, + llvm::SmallVectorImpl<char> &Result); uint64_t getELFSectionLMA(const object::ELFSectionRef& Sec); |