1*5ffd83dbSDimitry Andric //===-- XCOFFDump.cpp - XCOFF-specific dumper -----------------------------===// 2*5ffd83dbSDimitry Andric // 3*5ffd83dbSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*5ffd83dbSDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5*5ffd83dbSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*5ffd83dbSDimitry Andric // 7*5ffd83dbSDimitry Andric //===----------------------------------------------------------------------===// 8*5ffd83dbSDimitry Andric /// 9*5ffd83dbSDimitry Andric /// \file 10*5ffd83dbSDimitry Andric /// This file implements the XCOFF-specific dumper for llvm-objdump. 11*5ffd83dbSDimitry Andric /// 12*5ffd83dbSDimitry Andric //===----------------------------------------------------------------------===// 13*5ffd83dbSDimitry Andric 14*5ffd83dbSDimitry Andric #include "XCOFFDump.h" 15*5ffd83dbSDimitry Andric 16*5ffd83dbSDimitry Andric #include "llvm-objdump.h" 17*5ffd83dbSDimitry Andric #include "llvm/Demangle/Demangle.h" 18*5ffd83dbSDimitry Andric 19*5ffd83dbSDimitry Andric using namespace llvm; 20*5ffd83dbSDimitry Andric using namespace llvm::object; 21*5ffd83dbSDimitry Andric 22*5ffd83dbSDimitry Andric Error objdump::getXCOFFRelocationValueString(const XCOFFObjectFile *Obj, 23*5ffd83dbSDimitry Andric const RelocationRef &Rel, 24*5ffd83dbSDimitry Andric SmallVectorImpl<char> &Result) { 25*5ffd83dbSDimitry Andric symbol_iterator SymI = Rel.getSymbol(); 26*5ffd83dbSDimitry Andric if (SymI == Obj->symbol_end()) 27*5ffd83dbSDimitry Andric return make_error<GenericBinaryError>( 28*5ffd83dbSDimitry Andric "invalid symbol reference in relocation entry", 29*5ffd83dbSDimitry Andric object_error::parse_failed); 30*5ffd83dbSDimitry Andric 31*5ffd83dbSDimitry Andric Expected<StringRef> SymNameOrErr = SymI->getName(); 32*5ffd83dbSDimitry Andric if (!SymNameOrErr) 33*5ffd83dbSDimitry Andric return SymNameOrErr.takeError(); 34*5ffd83dbSDimitry Andric 35*5ffd83dbSDimitry Andric std::string SymName = (*SymNameOrErr).str(); 36*5ffd83dbSDimitry Andric if (Demangle) 37*5ffd83dbSDimitry Andric SymName = demangle(SymName); 38*5ffd83dbSDimitry Andric 39*5ffd83dbSDimitry Andric if (SymbolDescription) 40*5ffd83dbSDimitry Andric SymName = getXCOFFSymbolDescription(createSymbolInfo(Obj, *SymI), SymName); 41*5ffd83dbSDimitry Andric 42*5ffd83dbSDimitry Andric Result.append(SymName.begin(), SymName.end()); 43*5ffd83dbSDimitry Andric return Error::success(); 44*5ffd83dbSDimitry Andric } 45*5ffd83dbSDimitry Andric 46*5ffd83dbSDimitry Andric Optional<XCOFF::StorageMappingClass> 47*5ffd83dbSDimitry Andric objdump::getXCOFFSymbolCsectSMC(const XCOFFObjectFile *Obj, 48*5ffd83dbSDimitry Andric const SymbolRef &Sym) { 49*5ffd83dbSDimitry Andric XCOFFSymbolRef SymRef(Sym.getRawDataRefImpl(), Obj); 50*5ffd83dbSDimitry Andric 51*5ffd83dbSDimitry Andric if (SymRef.hasCsectAuxEnt()) 52*5ffd83dbSDimitry Andric return SymRef.getXCOFFCsectAuxEnt32()->StorageMappingClass; 53*5ffd83dbSDimitry Andric 54*5ffd83dbSDimitry Andric return None; 55*5ffd83dbSDimitry Andric } 56*5ffd83dbSDimitry Andric 57*5ffd83dbSDimitry Andric bool objdump::isLabel(const XCOFFObjectFile *Obj, const SymbolRef &Sym) { 58*5ffd83dbSDimitry Andric 59*5ffd83dbSDimitry Andric XCOFFSymbolRef SymRef(Sym.getRawDataRefImpl(), Obj); 60*5ffd83dbSDimitry Andric 61*5ffd83dbSDimitry Andric if (SymRef.hasCsectAuxEnt()) 62*5ffd83dbSDimitry Andric return SymRef.getXCOFFCsectAuxEnt32()->isLabel(); 63*5ffd83dbSDimitry Andric 64*5ffd83dbSDimitry Andric return false; 65*5ffd83dbSDimitry Andric } 66*5ffd83dbSDimitry Andric 67*5ffd83dbSDimitry Andric std::string objdump::getXCOFFSymbolDescription(const SymbolInfoTy &SymbolInfo, 68*5ffd83dbSDimitry Andric StringRef SymbolName) { 69*5ffd83dbSDimitry Andric assert(SymbolInfo.isXCOFF() && "Must be a XCOFFSymInfo."); 70*5ffd83dbSDimitry Andric 71*5ffd83dbSDimitry Andric std::string Result; 72*5ffd83dbSDimitry Andric // Dummy symbols have no symbol index. 73*5ffd83dbSDimitry Andric if (SymbolInfo.XCOFFSymInfo.Index) 74*5ffd83dbSDimitry Andric Result = ("(idx: " + Twine(SymbolInfo.XCOFFSymInfo.Index.getValue()) + 75*5ffd83dbSDimitry Andric ") " + SymbolName) 76*5ffd83dbSDimitry Andric .str(); 77*5ffd83dbSDimitry Andric else 78*5ffd83dbSDimitry Andric Result.append(SymbolName.begin(), SymbolName.end()); 79*5ffd83dbSDimitry Andric 80*5ffd83dbSDimitry Andric if (SymbolInfo.XCOFFSymInfo.StorageMappingClass && 81*5ffd83dbSDimitry Andric !SymbolInfo.XCOFFSymInfo.IsLabel) { 82*5ffd83dbSDimitry Andric const XCOFF::StorageMappingClass Smc = 83*5ffd83dbSDimitry Andric SymbolInfo.XCOFFSymInfo.StorageMappingClass.getValue(); 84*5ffd83dbSDimitry Andric Result.append(("[" + XCOFF::getMappingClassString(Smc) + "]").str()); 85*5ffd83dbSDimitry Andric } 86*5ffd83dbSDimitry Andric 87*5ffd83dbSDimitry Andric return Result; 88*5ffd83dbSDimitry Andric } 89