diff --git a/llvm/tools/llvm-objdump/CMakeLists.txt b/llvm/tools/llvm-objdump/CMakeLists.txt --- a/llvm/tools/llvm-objdump/CMakeLists.txt +++ b/llvm/tools/llvm-objdump/CMakeLists.txt @@ -18,6 +18,7 @@ llvm-objdump.cpp COFFDump.cpp ELFDump.cpp + GOFFDump.cpp MachODump.cpp WasmDump.cpp XCOFFDump.cpp diff --git a/llvm/tools/llvm-objdump/GOFFDump.h b/llvm/tools/llvm-objdump/GOFFDump.h new file mode 100644 --- /dev/null +++ b/llvm/tools/llvm-objdump/GOFFDump.h @@ -0,0 +1,27 @@ +//===-- GOFFDump.h - GOFF-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 +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_TOOLS_LLVM_OBJDUMP_GOFFDUMP_H +#define LLVM_TOOLS_LLVM_OBJDUMP_GOFFDUMP_H + +#include "llvm/Object/GOFFObjectFile.h" + +namespace llvm { + +class Error; + +namespace objdump { + +Error getGOFFRelocationValueString(const object::GOFFObjectFile *Obj, + const object::RelocationRef &Rel, + llvm::SmallVectorImpl &Result); + +} // namespace objdump +} // namespace llvm + +#endif diff --git a/llvm/tools/llvm-objdump/GOFFDump.cpp b/llvm/tools/llvm-objdump/GOFFDump.cpp new file mode 100644 --- /dev/null +++ b/llvm/tools/llvm-objdump/GOFFDump.cpp @@ -0,0 +1,29 @@ +//===-- GOFFDump.cpp - GOFF-specific dumper -------------------------------===// +// +// 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 GOFF-specific dumper for llvm-objdump. +/// +//===----------------------------------------------------------------------===// + +#include "GOFFDump.h" + +using namespace llvm; +using namespace llvm::object; + +Error objdump::getGOFFRelocationValueString(const GOFFObjectFile *Obj, + const RelocationRef &Rel, + SmallVectorImpl &Result) { + symbol_iterator SymI = Rel.getSymbol(); + Expected 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 --- a/llvm/tools/llvm-objdump/llvm-objdump.cpp +++ b/llvm/tools/llvm-objdump/llvm-objdump.cpp @@ -18,14 +18,15 @@ #include "llvm-objdump.h" #include "COFFDump.h" #include "ELFDump.h" +#include "GOFFDump.h" #include "MachODump.h" #include "WasmDump.h" #include "XCOFFDump.h" #include "llvm/ADT/IndexedMap.h" #include "llvm/ADT/Optional.h" -#include "llvm/ADT/SmallSet.h" #include "llvm/ADT/STLExtras.h" #include "llvm/ADT/SetOperations.h" +#include "llvm/ADT/SmallSet.h" #include "llvm/ADT/StringExtras.h" #include "llvm/ADT/StringSet.h" #include "llvm/ADT/Triple.h" @@ -49,6 +50,8 @@ #include "llvm/Object/COFF.h" #include "llvm/Object/COFFImportFile.h" #include "llvm/Object/ELFObjectFile.h" +#include "llvm/Object/GOFF.h" +#include "llvm/Object/GOFFObjectFile.h" #include "llvm/Object/MachO.h" #include "llvm/Object/MachOUniversal.h" #include "llvm/Object/ObjectFile.h" @@ -541,6 +544,8 @@ return getWasmRelocationValueString(Wasm, Rel, Result); if (auto *MachO = dyn_cast(Obj)) return getMachORelocationValueString(MachO, Rel, Result); + if (auto *GOFF = dyn_cast(Obj)) + return getGOFFRelocationValueString(GOFF, Rel, Result); if (auto *XCOFF = dyn_cast(Obj)) return getXCOFFRelocationValueString(XCOFF, Rel, Result); llvm_unreachable("unknown object file format");