1 //===-- ObjDumper.h ---------------------------------------------*- C++ -*-===// 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 #ifndef LLVM_TOOLS_LLVM_READOBJ_OBJDUMPER_H 10 #define LLVM_TOOLS_LLVM_READOBJ_OBJDUMPER_H 11 12 #include <memory> 13 #include <system_error> 14 15 #include "llvm/ADT/StringRef.h" 16 #include "llvm/Object/ObjectFile.h" 17 #include "llvm/Support/CommandLine.h" 18 19 namespace llvm { 20 namespace object { 21 class COFFImportFile; 22 class ObjectFile; 23 } 24 namespace codeview { 25 class GlobalTypeTableBuilder; 26 class MergingTypeTableBuilder; 27 } // namespace codeview 28 29 class ScopedPrinter; 30 31 class ObjDumper { 32 public: 33 ObjDumper(ScopedPrinter &Writer); 34 virtual ~ObjDumper(); 35 36 virtual void printFileHeaders() = 0; 37 virtual void printSectionHeaders() = 0; 38 virtual void printRelocations() = 0; printSymbols(bool PrintSymbols,bool PrintDynamicSymbols)39 virtual void printSymbols(bool PrintSymbols, bool PrintDynamicSymbols) { 40 if (PrintSymbols) 41 printSymbols(); 42 if (PrintDynamicSymbols) 43 printDynamicSymbols(); 44 } printProgramHeaders(bool PrintProgramHeaders,cl::boolOrDefault PrintSectionMapping)45 virtual void printProgramHeaders(bool PrintProgramHeaders, 46 cl::boolOrDefault PrintSectionMapping) { 47 if (PrintProgramHeaders) 48 printProgramHeaders(); 49 if (PrintSectionMapping == cl::BOU_TRUE) 50 printSectionMapping(); 51 } 52 53 virtual void printUnwindInfo() = 0; 54 55 // Only implemented for ELF at this time. printDependentLibs()56 virtual void printDependentLibs() {} printDynamicRelocations()57 virtual void printDynamicRelocations() { } printDynamicTable()58 virtual void printDynamicTable() { } printNeededLibraries()59 virtual void printNeededLibraries() { } printSectionAsHex(StringRef SectionName)60 virtual void printSectionAsHex(StringRef SectionName) {} printHashTable()61 virtual void printHashTable() { } printGnuHashTable(const object::ObjectFile * Obj)62 virtual void printGnuHashTable(const object::ObjectFile *Obj) {} printHashSymbols()63 virtual void printHashSymbols() {} printLoadName()64 virtual void printLoadName() {} printVersionInfo()65 virtual void printVersionInfo() {} printGroupSections()66 virtual void printGroupSections() {} printHashHistograms()67 virtual void printHashHistograms() {} printCGProfile()68 virtual void printCGProfile() {} printAddrsig()69 virtual void printAddrsig() {} printNotes()70 virtual void printNotes() {} printELFLinkerOptions()71 virtual void printELFLinkerOptions() {} printStackSizes()72 virtual void printStackSizes() {} printArchSpecificInfo()73 virtual void printArchSpecificInfo() { } 74 printCheriCapRelocs()75 virtual void printCheriCapRelocs() {} printCheriCapTable()76 virtual void printCheriCapTable() {} printCheriCapTableMapping()77 virtual void printCheriCapTableMapping() {} 78 79 // Only implemented for PE/COFF. printCOFFImports()80 virtual void printCOFFImports() { } printCOFFExports()81 virtual void printCOFFExports() { } printCOFFDirectives()82 virtual void printCOFFDirectives() { } printCOFFBaseReloc()83 virtual void printCOFFBaseReloc() { } printCOFFDebugDirectory()84 virtual void printCOFFDebugDirectory() { } printCOFFResources()85 virtual void printCOFFResources() {} printCOFFLoadConfig()86 virtual void printCOFFLoadConfig() { } printCodeViewDebugInfo()87 virtual void printCodeViewDebugInfo() { } 88 virtual void mergeCodeViewTypes(llvm::codeview::MergingTypeTableBuilder & CVIDs,llvm::codeview::MergingTypeTableBuilder & CVTypes,llvm::codeview::GlobalTypeTableBuilder & GlobalCVIDs,llvm::codeview::GlobalTypeTableBuilder & GlobalCVTypes,bool GHash)89 mergeCodeViewTypes(llvm::codeview::MergingTypeTableBuilder &CVIDs, 90 llvm::codeview::MergingTypeTableBuilder &CVTypes, 91 llvm::codeview::GlobalTypeTableBuilder &GlobalCVIDs, 92 llvm::codeview::GlobalTypeTableBuilder &GlobalCVTypes, 93 bool GHash) {} 94 95 // Only implemented for MachO. printMachODataInCode()96 virtual void printMachODataInCode() { } printMachOVersionMin()97 virtual void printMachOVersionMin() { } printMachODysymtab()98 virtual void printMachODysymtab() { } printMachOSegment()99 virtual void printMachOSegment() { } printMachOIndirectSymbols()100 virtual void printMachOIndirectSymbols() { } printMachOLinkerOptions()101 virtual void printMachOLinkerOptions() { } 102 103 virtual void printStackMap() const = 0; 104 105 void printSectionsAsString(const object::ObjectFile *Obj, 106 ArrayRef<std::string> Sections); 107 void printSectionsAsHex(const object::ObjectFile *Obj, 108 ArrayRef<std::string> Sections); 109 110 protected: 111 ScopedPrinter &W; 112 113 private: printSymbols()114 virtual void printSymbols() {} printDynamicSymbols()115 virtual void printDynamicSymbols() {} printProgramHeaders()116 virtual void printProgramHeaders() {} printSectionMapping()117 virtual void printSectionMapping() {} 118 }; 119 120 std::error_code createCOFFDumper(const object::ObjectFile *Obj, 121 ScopedPrinter &Writer, 122 std::unique_ptr<ObjDumper> &Result); 123 124 std::error_code createELFDumper(const object::ObjectFile *Obj, 125 ScopedPrinter &Writer, 126 std::unique_ptr<ObjDumper> &Result); 127 128 std::error_code createMachODumper(const object::ObjectFile *Obj, 129 ScopedPrinter &Writer, 130 std::unique_ptr<ObjDumper> &Result); 131 132 std::error_code createWasmDumper(const object::ObjectFile *Obj, 133 ScopedPrinter &Writer, 134 std::unique_ptr<ObjDumper> &Result); 135 136 std::error_code createXCOFFDumper(const object::ObjectFile *Obj, 137 ScopedPrinter &Writer, 138 std::unique_ptr<ObjDumper> &Result); 139 140 void dumpCOFFImportFile(const object::COFFImportFile *File, 141 ScopedPrinter &Writer); 142 143 void dumpCodeViewMergedTypes(ScopedPrinter &Writer, 144 ArrayRef<ArrayRef<uint8_t>> IpiRecords, 145 ArrayRef<ArrayRef<uint8_t>> TpiRecords); 146 147 } // namespace llvm 148 149 #endif 150