xref: /freebsd/contrib/llvm-project/llvm/tools/llvm-objdump/XCOFFDump.cpp (revision 5ffd83dbcc34f10e07f6d3e968ae6365869615f4)
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