diff options
Diffstat (limited to 'llvm/tools/llvm-objdump/WasmDump.cpp')
-rw-r--r-- | llvm/tools/llvm-objdump/WasmDump.cpp | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/llvm/tools/llvm-objdump/WasmDump.cpp b/llvm/tools/llvm-objdump/WasmDump.cpp index 045002cd4b3..460fa168808 100644 --- a/llvm/tools/llvm-objdump/WasmDump.cpp +++ b/llvm/tools/llvm-objdump/WasmDump.cpp @@ -26,3 +26,28 @@ void llvm::printWasmFileHeader(const object::ObjectFile *Obj) { outs().write_hex(File->getHeader().Version); outs() << "\n"; } + +std::error_code +llvm::getWasmRelocationValueString(const WasmObjectFile *Obj, + const RelocationRef &RelRef, + SmallVectorImpl<char> &Result) { + const wasm::WasmRelocation &Rel = Obj->getWasmRelocation(RelRef); + symbol_iterator SI = RelRef.getSymbol(); + std::string FmtBuf; + raw_string_ostream Fmt(FmtBuf); + if (SI == Obj->symbol_end()) { + // Not all wasm relocations have symbols associated with them. + // In particular R_WEBASSEMBLY_TYPE_INDEX_LEB. + Fmt << Rel.Index; + } else { + Expected<StringRef> SymNameOrErr = SI->getName(); + if (!SymNameOrErr) + return errorToErrorCode(SymNameOrErr.takeError()); + StringRef SymName = *SymNameOrErr; + Result.append(SymName.begin(), SymName.end()); + } + Fmt << (Rel.Addend < 0 ? "" : "+") << Rel.Addend; + Fmt.flush(); + Result.append(FmtBuf.begin(), FmtBuf.end()); + return std::error_code(); +} |