10b57cec5SDimitry Andric //===-- WasmDump.cpp - wasm-specific dumper ---------------------*- C++ -*-===// 20b57cec5SDimitry Andric // 30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 60b57cec5SDimitry Andric // 70b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 80b57cec5SDimitry Andric /// 90b57cec5SDimitry Andric /// \file 100b57cec5SDimitry Andric /// This file implements the wasm-specific dumper for llvm-objdump. 110b57cec5SDimitry Andric /// 120b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 130b57cec5SDimitry Andric 14*5ffd83dbSDimitry Andric #include "WasmDump.h" 15*5ffd83dbSDimitry Andric 160b57cec5SDimitry Andric #include "llvm-objdump.h" 170b57cec5SDimitry Andric #include "llvm/Object/Wasm.h" 180b57cec5SDimitry Andric 19*5ffd83dbSDimitry Andric using namespace llvm; 200b57cec5SDimitry Andric using namespace llvm::object; 210b57cec5SDimitry Andric 22*5ffd83dbSDimitry Andric void objdump::printWasmFileHeader(const object::ObjectFile *Obj) { 230b57cec5SDimitry Andric const auto *File = dyn_cast<const WasmObjectFile>(Obj); 240b57cec5SDimitry Andric 250b57cec5SDimitry Andric outs() << "Program Header:\n"; 260b57cec5SDimitry Andric outs() << "Version: 0x"; 270b57cec5SDimitry Andric outs().write_hex(File->getHeader().Version); 280b57cec5SDimitry Andric outs() << "\n"; 290b57cec5SDimitry Andric } 300b57cec5SDimitry Andric 31*5ffd83dbSDimitry Andric Error objdump::getWasmRelocationValueString(const WasmObjectFile *Obj, 320b57cec5SDimitry Andric const RelocationRef &RelRef, 330b57cec5SDimitry Andric SmallVectorImpl<char> &Result) { 340b57cec5SDimitry Andric const wasm::WasmRelocation &Rel = Obj->getWasmRelocation(RelRef); 350b57cec5SDimitry Andric symbol_iterator SI = RelRef.getSymbol(); 360b57cec5SDimitry Andric std::string FmtBuf; 370b57cec5SDimitry Andric raw_string_ostream Fmt(FmtBuf); 380b57cec5SDimitry Andric if (SI == Obj->symbol_end()) { 390b57cec5SDimitry Andric // Not all wasm relocations have symbols associated with them. 400b57cec5SDimitry Andric // In particular R_WASM_TYPE_INDEX_LEB. 410b57cec5SDimitry Andric Fmt << Rel.Index; 420b57cec5SDimitry Andric } else { 430b57cec5SDimitry Andric Expected<StringRef> SymNameOrErr = SI->getName(); 440b57cec5SDimitry Andric if (!SymNameOrErr) 450b57cec5SDimitry Andric return SymNameOrErr.takeError(); 460b57cec5SDimitry Andric StringRef SymName = *SymNameOrErr; 470b57cec5SDimitry Andric Result.append(SymName.begin(), SymName.end()); 480b57cec5SDimitry Andric } 490b57cec5SDimitry Andric Fmt << (Rel.Addend < 0 ? "" : "+") << Rel.Addend; 500b57cec5SDimitry Andric Fmt.flush(); 510b57cec5SDimitry Andric Result.append(FmtBuf.begin(), FmtBuf.end()); 520b57cec5SDimitry Andric return Error::success(); 530b57cec5SDimitry Andric } 54