//===-- WasmDump.cpp - wasm-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 wasm-specific dumper for llvm-objdump. /// //===----------------------------------------------------------------------===// #include "WasmDump.h" #include "llvm-objdump.h" #include "llvm/Object/Wasm.h" using namespace llvm; using namespace llvm::object; void objdump::printWasmFileHeader(const object::ObjectFile *Obj) { const auto *File = dyn_cast<const WasmObjectFile>(Obj); outs() << "Program Header:\n"; outs() << "Version: 0x"; outs().write_hex(File->getHeader().Version); outs() << "\n"; } Error objdump::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_WASM_TYPE_INDEX_LEB. Fmt << Rel.Index; } else { Expected<StringRef> SymNameOrErr = SI->getName(); if (!SymNameOrErr) return 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 Error::success(); } |