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