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