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