15ffd83dbSDimitry Andric //===-- XCOFFDump.cpp - XCOFF-specific dumper -----------------------------===// 25ffd83dbSDimitry Andric // 35ffd83dbSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 45ffd83dbSDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 55ffd83dbSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 65ffd83dbSDimitry Andric // 75ffd83dbSDimitry Andric //===----------------------------------------------------------------------===// 85ffd83dbSDimitry Andric /// 95ffd83dbSDimitry Andric /// \file 105ffd83dbSDimitry Andric /// This file implements the XCOFF-specific dumper for llvm-objdump. 115ffd83dbSDimitry Andric /// 125ffd83dbSDimitry Andric //===----------------------------------------------------------------------===// 135ffd83dbSDimitry Andric 145ffd83dbSDimitry Andric #include "XCOFFDump.h" 155ffd83dbSDimitry Andric 165ffd83dbSDimitry Andric #include "llvm-objdump.h" 175ffd83dbSDimitry Andric #include "llvm/Demangle/Demangle.h" 185ffd83dbSDimitry Andric 195ffd83dbSDimitry Andric using namespace llvm; 205ffd83dbSDimitry Andric using namespace llvm::object; 215ffd83dbSDimitry Andric 225ffd83dbSDimitry Andric Error objdump::getXCOFFRelocationValueString(const XCOFFObjectFile *Obj, 235ffd83dbSDimitry Andric const RelocationRef &Rel, 245ffd83dbSDimitry Andric SmallVectorImpl<char> &Result) { 255ffd83dbSDimitry Andric symbol_iterator SymI = Rel.getSymbol(); 265ffd83dbSDimitry Andric if (SymI == Obj->symbol_end()) 275ffd83dbSDimitry Andric return make_error<GenericBinaryError>( 285ffd83dbSDimitry Andric "invalid symbol reference in relocation entry", 295ffd83dbSDimitry Andric object_error::parse_failed); 305ffd83dbSDimitry Andric 315ffd83dbSDimitry Andric Expected<StringRef> SymNameOrErr = SymI->getName(); 325ffd83dbSDimitry Andric if (!SymNameOrErr) 335ffd83dbSDimitry Andric return SymNameOrErr.takeError(); 345ffd83dbSDimitry Andric 355ffd83dbSDimitry Andric std::string SymName = (*SymNameOrErr).str(); 365ffd83dbSDimitry Andric if (Demangle) 375ffd83dbSDimitry Andric SymName = demangle(SymName); 385ffd83dbSDimitry Andric 395ffd83dbSDimitry Andric if (SymbolDescription) 405ffd83dbSDimitry Andric SymName = getXCOFFSymbolDescription(createSymbolInfo(Obj, *SymI), SymName); 415ffd83dbSDimitry Andric 425ffd83dbSDimitry Andric Result.append(SymName.begin(), SymName.end()); 435ffd83dbSDimitry Andric return Error::success(); 445ffd83dbSDimitry Andric } 455ffd83dbSDimitry Andric 465ffd83dbSDimitry Andric Optional<XCOFF::StorageMappingClass> 475ffd83dbSDimitry Andric objdump::getXCOFFSymbolCsectSMC(const XCOFFObjectFile *Obj, 485ffd83dbSDimitry Andric const SymbolRef &Sym) { 49*fe6060f1SDimitry Andric const XCOFFSymbolRef SymRef = Obj->toSymbolRef(Sym.getRawDataRefImpl()); 505ffd83dbSDimitry Andric 51*fe6060f1SDimitry Andric if (!SymRef.isCsectSymbol()) 525ffd83dbSDimitry Andric return None; 53*fe6060f1SDimitry Andric 54*fe6060f1SDimitry Andric auto CsectAuxEntOrErr = SymRef.getXCOFFCsectAuxRef(); 55*fe6060f1SDimitry Andric if (!CsectAuxEntOrErr) 56*fe6060f1SDimitry Andric return None; 57*fe6060f1SDimitry Andric 58*fe6060f1SDimitry Andric return CsectAuxEntOrErr.get().getStorageMappingClass(); 595ffd83dbSDimitry Andric } 605ffd83dbSDimitry Andric 615ffd83dbSDimitry Andric bool objdump::isLabel(const XCOFFObjectFile *Obj, const SymbolRef &Sym) { 625ffd83dbSDimitry Andric 63*fe6060f1SDimitry Andric const XCOFFSymbolRef SymRef = Obj->toSymbolRef(Sym.getRawDataRefImpl()); 645ffd83dbSDimitry Andric 65*fe6060f1SDimitry Andric if (!SymRef.isCsectSymbol()) 665ffd83dbSDimitry Andric return false; 67*fe6060f1SDimitry Andric 68*fe6060f1SDimitry Andric auto CsectAuxEntOrErr = SymRef.getXCOFFCsectAuxRef(); 69*fe6060f1SDimitry Andric if (!CsectAuxEntOrErr) 70*fe6060f1SDimitry Andric return false; 71*fe6060f1SDimitry Andric 72*fe6060f1SDimitry Andric return CsectAuxEntOrErr.get().isLabel(); 735ffd83dbSDimitry Andric } 745ffd83dbSDimitry Andric 755ffd83dbSDimitry Andric std::string objdump::getXCOFFSymbolDescription(const SymbolInfoTy &SymbolInfo, 765ffd83dbSDimitry Andric StringRef SymbolName) { 775ffd83dbSDimitry Andric assert(SymbolInfo.isXCOFF() && "Must be a XCOFFSymInfo."); 785ffd83dbSDimitry Andric 795ffd83dbSDimitry Andric std::string Result; 805ffd83dbSDimitry Andric // Dummy symbols have no symbol index. 815ffd83dbSDimitry Andric if (SymbolInfo.XCOFFSymInfo.Index) 825ffd83dbSDimitry Andric Result = ("(idx: " + Twine(SymbolInfo.XCOFFSymInfo.Index.getValue()) + 835ffd83dbSDimitry Andric ") " + SymbolName) 845ffd83dbSDimitry Andric .str(); 855ffd83dbSDimitry Andric else 865ffd83dbSDimitry Andric Result.append(SymbolName.begin(), SymbolName.end()); 875ffd83dbSDimitry Andric 885ffd83dbSDimitry Andric if (SymbolInfo.XCOFFSymInfo.StorageMappingClass && 895ffd83dbSDimitry Andric !SymbolInfo.XCOFFSymInfo.IsLabel) { 905ffd83dbSDimitry Andric const XCOFF::StorageMappingClass Smc = 915ffd83dbSDimitry Andric SymbolInfo.XCOFFSymInfo.StorageMappingClass.getValue(); 925ffd83dbSDimitry Andric Result.append(("[" + XCOFF::getMappingClassString(Smc) + "]").str()); 935ffd83dbSDimitry Andric } 945ffd83dbSDimitry Andric 955ffd83dbSDimitry Andric return Result; 965ffd83dbSDimitry Andric } 97