Path: blob/main/contrib/llvm-project/llvm/tools/llvm-readobj/ObjDumper.h
35230 views
//===-- ObjDumper.h ---------------------------------------------*- C++ -*-===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//78#ifndef LLVM_TOOLS_LLVM_READOBJ_OBJDUMPER_H9#define LLVM_TOOLS_LLVM_READOBJ_OBJDUMPER_H1011#include <functional>12#include <memory>13#include <system_error>1415#include "llvm/ADT/SmallVector.h"16#include "llvm/ADT/StringRef.h"17#include "llvm/Object/ObjectFile.h"18#include "llvm/Support/CommandLine.h"1920#include <unordered_set>2122namespace llvm {23namespace object {24class Archive;25class COFFImportFile;26class ObjectFile;27class XCOFFObjectFile;28class ELFObjectFileBase;29} // namespace object30namespace codeview {31class GlobalTypeTableBuilder;32class MergingTypeTableBuilder;33} // namespace codeview3435class ScopedPrinter;3637// Comparator to compare symbols.38// Usage: the caller registers predicates (i.e., how to compare the symbols) by39// calling addPredicate(). The order in which predicates are registered is also40// their priority.41class SymbolComparator {42public:43using CompPredicate =44std::function<bool(object::SymbolRef, object::SymbolRef)>;4546// Each Obj format has a slightly different way of retrieving a symbol's info47// So we defer the predicate's impl to each format.48void addPredicate(CompPredicate Pred) { Predicates.push_back(Pred); }4950bool operator()(object::SymbolRef LHS, object::SymbolRef RHS) {51for (CompPredicate Pred : Predicates) {52if (Pred(LHS, RHS))53return true;54if (Pred(RHS, LHS))55return false;56}57return false;58}5960private:61SmallVector<CompPredicate, 2> Predicates;62};6364class ObjDumper {65public:66ObjDumper(ScopedPrinter &Writer, StringRef ObjName);67virtual ~ObjDumper();6869virtual bool canDumpContent() { return true; }7071virtual void printFileSummary(StringRef FileStr, object::ObjectFile &Obj,72ArrayRef<std::string> InputFilenames,73const object::Archive *A);74virtual void printFileHeaders() = 0;75virtual void printSectionHeaders() = 0;76virtual void printRelocations() = 0;77virtual void printSymbols(bool PrintSymbols, bool PrintDynamicSymbols,78bool ExtraSymInfo) {79if (PrintSymbols)80printSymbols(ExtraSymInfo);81if (PrintDynamicSymbols)82printDynamicSymbols();83}84virtual void printSymbols(bool PrintSymbols, bool PrintDynamicSymbols,85bool ExtraSymInfo,86std::optional<SymbolComparator> SymComp) {87if (SymComp) {88if (PrintSymbols)89printSymbols(SymComp);90if (PrintDynamicSymbols)91printDynamicSymbols(SymComp);92} else {93printSymbols(PrintSymbols, PrintDynamicSymbols, ExtraSymInfo);94}95}96virtual void printProgramHeaders(bool PrintProgramHeaders,97cl::boolOrDefault PrintSectionMapping) {98if (PrintProgramHeaders)99printProgramHeaders();100if (PrintSectionMapping == cl::BOU_TRUE)101printSectionMapping();102}103104virtual void printUnwindInfo() = 0;105106// Symbol comparison functions.107virtual bool canCompareSymbols() const { return false; }108virtual bool compareSymbolsByName(object::SymbolRef LHS,109object::SymbolRef RHS) const {110return true;111}112virtual bool compareSymbolsByType(object::SymbolRef LHS,113object::SymbolRef RHS) const {114return true;115}116117// Only implemented for ELF at this time.118virtual void printDependentLibs() {}119virtual void printDynamicRelocations() { }120virtual void printDynamicTable() { }121virtual void printNeededLibraries() { }122virtual void printSectionAsHex(StringRef SectionName) {}123virtual void printHashTable() { }124virtual void printGnuHashTable() {}125virtual void printHashSymbols() {}126virtual void printLoadName() {}127virtual void printVersionInfo() {}128virtual void printGroupSections() {}129virtual void printHashHistograms() {}130virtual void printCGProfile() {}131// If PrettyPGOAnalysis is true, prints BFI as relative frequency and BPI as132// percentage. Otherwise raw values are displayed.133virtual void printBBAddrMaps(bool PrettyPGOAnalysis) {}134virtual void printAddrsig() {}135virtual void printNotes() {}136virtual void printELFLinkerOptions() {}137virtual void printStackSizes() {}138virtual void printSectionDetails() {}139virtual void printArchSpecificInfo() {}140virtual void printMemtag() {}141142// Only implemented for PE/COFF.143virtual void printCOFFImports() { }144virtual void printCOFFExports() { }145virtual void printCOFFDirectives() { }146virtual void printCOFFBaseReloc() { }147virtual void printCOFFDebugDirectory() { }148virtual void printCOFFTLSDirectory() {}149virtual void printCOFFResources() {}150virtual void printCOFFLoadConfig() { }151virtual void printCodeViewDebugInfo() { }152virtual void153mergeCodeViewTypes(llvm::codeview::MergingTypeTableBuilder &CVIDs,154llvm::codeview::MergingTypeTableBuilder &CVTypes,155llvm::codeview::GlobalTypeTableBuilder &GlobalCVIDs,156llvm::codeview::GlobalTypeTableBuilder &GlobalCVTypes,157bool GHash) {}158159// Only implemented for XCOFF.160virtual void printStringTable() {}161virtual void printAuxiliaryHeader() {}162virtual void printExceptionSection() {}163virtual void printLoaderSection(bool PrintHeader, bool PrintSymbols,164bool PrintRelocations) {}165166// Only implemented for MachO.167virtual void printMachODataInCode() { }168virtual void printMachOVersionMin() { }169virtual void printMachODysymtab() { }170virtual void printMachOSegment() { }171virtual void printMachOIndirectSymbols() { }172virtual void printMachOLinkerOptions() { }173174virtual void printStackMap() const = 0;175176void printAsStringList(StringRef StringContent, size_t StringDataOffset = 0);177178void printSectionsAsString(const object::ObjectFile &Obj,179ArrayRef<std::string> Sections, bool Decompress);180void printSectionsAsHex(const object::ObjectFile &Obj,181ArrayRef<std::string> Sections, bool Decompress);182183std::function<Error(const Twine &Msg)> WarningHandler;184void reportUniqueWarning(Error Err) const;185void reportUniqueWarning(const Twine &Msg) const;186187protected:188ScopedPrinter &W;189190private:191virtual void printSymbols(bool ExtraSymInfo) {}192virtual void printSymbols(std::optional<SymbolComparator> Comp) {}193virtual void printDynamicSymbols() {}194virtual void printDynamicSymbols(std::optional<SymbolComparator> Comp) {}195virtual void printProgramHeaders() {}196virtual void printSectionMapping() {}197198std::unordered_set<std::string> Warnings;199};200201std::unique_ptr<ObjDumper> createCOFFDumper(const object::COFFObjectFile &Obj,202ScopedPrinter &Writer);203204std::unique_ptr<ObjDumper> createELFDumper(const object::ELFObjectFileBase &Obj,205ScopedPrinter &Writer);206207std::unique_ptr<ObjDumper> createMachODumper(const object::MachOObjectFile &Obj,208ScopedPrinter &Writer);209210std::unique_ptr<ObjDumper> createWasmDumper(const object::WasmObjectFile &Obj,211ScopedPrinter &Writer);212213std::unique_ptr<ObjDumper> createXCOFFDumper(const object::XCOFFObjectFile &Obj,214ScopedPrinter &Writer);215216void dumpCOFFImportFile(const object::COFFImportFile *File,217ScopedPrinter &Writer);218219void dumpCodeViewMergedTypes(ScopedPrinter &Writer,220ArrayRef<ArrayRef<uint8_t>> IpiRecords,221ArrayRef<ArrayRef<uint8_t>> TpiRecords);222223} // namespace llvm224225#endif226227228