Index: include/llvm/Object/Wasm.h =================================================================== --- include/llvm/Object/Wasm.h +++ include/llvm/Object/Wasm.h @@ -215,6 +215,7 @@ std::vector Symbols; ArrayRef CodeSection; uint32_t StartFunction = -1; + bool HasLinkingSection = false; wasm::WasmLinkingData LinkingData; StringMap SymbolMap; Index: lib/Object/WasmObjectFile.cpp =================================================================== --- lib/Object/WasmObjectFile.cpp +++ lib/Object/WasmObjectFile.cpp @@ -291,6 +291,7 @@ Error WasmObjectFile::parseLinkingSection(const uint8_t *Ptr, const uint8_t *End) { + HasLinkingSection = true; while (Ptr < End) { uint8_t Type = readVarint7(Ptr); uint32_t Size = readVaruint32(Ptr); @@ -947,7 +948,9 @@ return SubtargetFeatures(); } -bool WasmObjectFile::isRelocatableObject() const { return false; } +bool WasmObjectFile::isRelocatableObject() const { + return HasLinkingSection; +} const WasmSection &WasmObjectFile::getWasmSection(DataRefImpl Ref) const { assert(Ref.d.a < Sections.size()); Index: test/tools/llvm-objdump/WebAssembly/relocations.test =================================================================== --- /dev/null +++ test/tools/llvm-objdump/WebAssembly/relocations.test @@ -0,0 +1,7 @@ +; RUN: llc -mtriple=wasm32-unknown-unknown-wasm -filetype=obj %s -o - | llvm-objdump -r - | FileCheck %s + +@foo = hidden global i32 1, align 4 +@bar = hidden global i32* @foo, align 4 + +; CHECK: RELOCATION RECORDS FOR [DATA]: +; CHECK-NEXT: 0000000a R_WEBASSEMBLY_GLOBAL_ADDR_I32 0+0 Index: tools/llvm-objdump/llvm-objdump.cpp =================================================================== --- tools/llvm-objdump/llvm-objdump.cpp +++ tools/llvm-objdump/llvm-objdump.cpp @@ -41,6 +41,7 @@ #include "llvm/Object/ELFObjectFile.h" #include "llvm/Object/MachO.h" #include "llvm/Object/ObjectFile.h" +#include "llvm/Object/Wasm.h" #include "llvm/Support/Casting.h" #include "llvm/Support/CommandLine.h" #include "llvm/Support/Debug.h" @@ -886,6 +887,18 @@ fmt << S; } +static std::error_code getRelocationValueString(const WasmObjectFile *Obj, + const RelocationRef &RelRef, + SmallVectorImpl &Result) { + const wasm::WasmRelocation& Rel = Obj->getWasmRelocation(RelRef); + std::string fmtbuf; + raw_string_ostream fmt(fmtbuf); + fmt << Rel.Index << (Rel.Addend < 0 ? "" : "+") << Rel.Addend; + fmt.flush(); + Result.append(fmtbuf.begin(), fmtbuf.end()); + return std::error_code(); +} + static std::error_code getRelocationValueString(const MachOObjectFile *Obj, const RelocationRef &RelRef, SmallVectorImpl &Result) { @@ -1069,10 +1082,13 @@ const ObjectFile *Obj = Rel.getObject(); if (auto *ELF = dyn_cast(Obj)) return getRelocationValueString(ELF, Rel, Result); - if (auto *COFF = dyn_cast(Obj)) + else if (auto *COFF = dyn_cast(Obj)) return getRelocationValueString(COFF, Rel, Result); - auto *MachO = cast(Obj); - return getRelocationValueString(MachO, Rel, Result); + else if (auto *Wasm = dyn_cast(Obj)) + return getRelocationValueString(Wasm, Rel, Result); + else if (auto *MachO = dyn_cast(Obj)) + return getRelocationValueString(MachO, Rel, Result); + llvm_unreachable("unknown object file format"); } /// @brief Indicates whether this relocation should hidden when listing