Home | History | Annotate | Line # | Download | only in llvm-objdump
      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 
     16 #include "llvm-objdump.h"
     17 #include "llvm/Demangle/Demangle.h"
     18 
     19 using namespace llvm;
     20 using namespace llvm::object;
     21 
     22 Error objdump::getXCOFFRelocationValueString(const XCOFFObjectFile *Obj,
     23                                              const RelocationRef &Rel,
     24                                              SmallVectorImpl<char> &Result) {
     25   symbol_iterator SymI = Rel.getSymbol();
     26   if (SymI == Obj->symbol_end())
     27     return make_error<GenericBinaryError>(
     28         "invalid symbol reference in relocation entry",
     29         object_error::parse_failed);
     30 
     31   Expected<StringRef> SymNameOrErr = SymI->getName();
     32   if (!SymNameOrErr)
     33     return SymNameOrErr.takeError();
     34 
     35   std::string SymName = (*SymNameOrErr).str();
     36   if (Demangle)
     37     SymName = demangle(SymName);
     38 
     39   if (SymbolDescription)
     40     SymName = getXCOFFSymbolDescription(createSymbolInfo(Obj, *SymI), SymName);
     41 
     42   Result.append(SymName.begin(), SymName.end());
     43   return Error::success();
     44 }
     45 
     46 Optional<XCOFF::StorageMappingClass>
     47 objdump::getXCOFFSymbolCsectSMC(const XCOFFObjectFile *Obj,
     48                                 const SymbolRef &Sym) {
     49   XCOFFSymbolRef SymRef(Sym.getRawDataRefImpl(), Obj);
     50 
     51   if (SymRef.hasCsectAuxEnt())
     52     return SymRef.getXCOFFCsectAuxEnt32()->StorageMappingClass;
     53 
     54   return None;
     55 }
     56 
     57 bool objdump::isLabel(const XCOFFObjectFile *Obj, const SymbolRef &Sym) {
     58 
     59   XCOFFSymbolRef SymRef(Sym.getRawDataRefImpl(), Obj);
     60 
     61   if (SymRef.hasCsectAuxEnt())
     62     return SymRef.getXCOFFCsectAuxEnt32()->isLabel();
     63 
     64   return false;
     65 }
     66 
     67 std::string objdump::getXCOFFSymbolDescription(const SymbolInfoTy &SymbolInfo,
     68                                                StringRef SymbolName) {
     69   assert(SymbolInfo.isXCOFF() && "Must be a XCOFFSymInfo.");
     70 
     71   std::string Result;
     72   // Dummy symbols have no symbol index.
     73   if (SymbolInfo.XCOFFSymInfo.Index)
     74     Result = ("(idx: " + Twine(SymbolInfo.XCOFFSymInfo.Index.getValue()) +
     75               ") " + SymbolName)
     76                  .str();
     77   else
     78     Result.append(SymbolName.begin(), SymbolName.end());
     79 
     80   if (SymbolInfo.XCOFFSymInfo.StorageMappingClass &&
     81       !SymbolInfo.XCOFFSymInfo.IsLabel) {
     82     const XCOFF::StorageMappingClass Smc =
     83         SymbolInfo.XCOFFSymInfo.StorageMappingClass.getValue();
     84     Result.append(("[" + XCOFF::getMappingClassString(Smc) + "]").str());
     85   }
     86 
     87   return Result;
     88 }
     89