1*0b57cec5SDimitry Andric //===-- WasmDump.cpp - wasm-specific dumper ---------------------*- C++ -*-===// 2*0b57cec5SDimitry Andric // 3*0b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*0b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5*0b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*0b57cec5SDimitry Andric // 7*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 8*0b57cec5SDimitry Andric /// 9*0b57cec5SDimitry Andric /// \file 10*0b57cec5SDimitry Andric /// This file implements the wasm-specific dumper for llvm-objdump. 11*0b57cec5SDimitry Andric /// 12*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 13*0b57cec5SDimitry Andric 14*0b57cec5SDimitry Andric #include "llvm-objdump.h" 15*0b57cec5SDimitry Andric #include "llvm/Object/Wasm.h" 16*0b57cec5SDimitry Andric 17*0b57cec5SDimitry Andric using namespace llvm::object; 18*0b57cec5SDimitry Andric 19*0b57cec5SDimitry Andric namespace llvm { 20*0b57cec5SDimitry Andric void printWasmFileHeader(const object::ObjectFile *Obj) { 21*0b57cec5SDimitry Andric const auto *File = dyn_cast<const WasmObjectFile>(Obj); 22*0b57cec5SDimitry Andric 23*0b57cec5SDimitry Andric outs() << "Program Header:\n"; 24*0b57cec5SDimitry Andric outs() << "Version: 0x"; 25*0b57cec5SDimitry Andric outs().write_hex(File->getHeader().Version); 26*0b57cec5SDimitry Andric outs() << "\n"; 27*0b57cec5SDimitry Andric } 28*0b57cec5SDimitry Andric 29*0b57cec5SDimitry Andric Error getWasmRelocationValueString(const WasmObjectFile *Obj, 30*0b57cec5SDimitry Andric const RelocationRef &RelRef, 31*0b57cec5SDimitry Andric SmallVectorImpl<char> &Result) { 32*0b57cec5SDimitry Andric const wasm::WasmRelocation &Rel = Obj->getWasmRelocation(RelRef); 33*0b57cec5SDimitry Andric symbol_iterator SI = RelRef.getSymbol(); 34*0b57cec5SDimitry Andric std::string FmtBuf; 35*0b57cec5SDimitry Andric raw_string_ostream Fmt(FmtBuf); 36*0b57cec5SDimitry Andric if (SI == Obj->symbol_end()) { 37*0b57cec5SDimitry Andric // Not all wasm relocations have symbols associated with them. 38*0b57cec5SDimitry Andric // In particular R_WASM_TYPE_INDEX_LEB. 39*0b57cec5SDimitry Andric Fmt << Rel.Index; 40*0b57cec5SDimitry Andric } else { 41*0b57cec5SDimitry Andric Expected<StringRef> SymNameOrErr = SI->getName(); 42*0b57cec5SDimitry Andric if (!SymNameOrErr) 43*0b57cec5SDimitry Andric return SymNameOrErr.takeError(); 44*0b57cec5SDimitry Andric StringRef SymName = *SymNameOrErr; 45*0b57cec5SDimitry Andric Result.append(SymName.begin(), SymName.end()); 46*0b57cec5SDimitry Andric } 47*0b57cec5SDimitry Andric Fmt << (Rel.Addend < 0 ? "" : "+") << Rel.Addend; 48*0b57cec5SDimitry Andric Fmt.flush(); 49*0b57cec5SDimitry Andric Result.append(FmtBuf.begin(), FmtBuf.end()); 50*0b57cec5SDimitry Andric return Error::success(); 51*0b57cec5SDimitry Andric } 52*0b57cec5SDimitry Andric } // namespace llvm 53