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