1fe6060f1SDimitry Andric //===--- llvm-objdump.h -----------------------------------------*- C++ -*-===// 20b57cec5SDimitry Andric // 30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 60b57cec5SDimitry Andric // 70b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 80b57cec5SDimitry Andric 90b57cec5SDimitry Andric #ifndef LLVM_TOOLS_LLVM_OBJDUMP_LLVM_OBJDUMP_H 100b57cec5SDimitry Andric #define LLVM_TOOLS_LLVM_OBJDUMP_LLVM_OBJDUMP_H 110b57cec5SDimitry Andric 125ffd83dbSDimitry Andric #include "llvm/ADT/StringSet.h" 130b57cec5SDimitry Andric #include "llvm/DebugInfo/DIContext.h" 145ffd83dbSDimitry Andric #include "llvm/MC/MCDisassembler/MCDisassembler.h" 1506c3fb27SDimitry Andric #include "llvm/MC/MCSubtargetInfo.h" 165ffd83dbSDimitry Andric #include "llvm/Object/Archive.h" 1706c3fb27SDimitry Andric #include "llvm/Object/ObjectFile.h" 180b57cec5SDimitry Andric #include "llvm/Support/Compiler.h" 190b57cec5SDimitry Andric #include "llvm/Support/DataTypes.h" 2006c3fb27SDimitry Andric #include "llvm/Support/FormattedStream.h" 21*5f757f3fSDimitry Andric #include <functional> 2206c3fb27SDimitry Andric #include <memory> 230b57cec5SDimitry Andric 240b57cec5SDimitry Andric namespace llvm { 250b57cec5SDimitry Andric class StringRef; 26e8d8bef9SDimitry Andric class Twine; 270b57cec5SDimitry Andric 28bdd1243dSDimitry Andric namespace opt { 29bdd1243dSDimitry Andric class Arg; 30bdd1243dSDimitry Andric } // namespace opt 31bdd1243dSDimitry Andric 320b57cec5SDimitry Andric namespace object { 330b57cec5SDimitry Andric class RelocationRef; 34349cc55cSDimitry Andric struct VersionEntry; 3506c3fb27SDimitry Andric 3606c3fb27SDimitry Andric class COFFObjectFile; 3706c3fb27SDimitry Andric class ELFObjectFileBase; 3806c3fb27SDimitry Andric class MachOObjectFile; 3906c3fb27SDimitry Andric class WasmObjectFile; 4006c3fb27SDimitry Andric class XCOFFObjectFile; 415ffd83dbSDimitry Andric } // namespace object 420b57cec5SDimitry Andric 435ffd83dbSDimitry Andric namespace objdump { 445ffd83dbSDimitry Andric 45349cc55cSDimitry Andric enum DebugVarsFormat { DVDisabled, DVUnicode, DVASCII, DVInvalid }; 46fe6060f1SDimitry Andric 47fe6060f1SDimitry Andric extern bool ArchiveHeaders; 48fe6060f1SDimitry Andric extern int DbgIndent; 49fe6060f1SDimitry Andric extern DebugVarsFormat DbgVariables; 50fe6060f1SDimitry Andric extern bool Demangle; 51fe6060f1SDimitry Andric extern bool Disassemble; 52fe6060f1SDimitry Andric extern bool DisassembleAll; 53fe6060f1SDimitry Andric extern DIDumpType DwarfDumpType; 54fe6060f1SDimitry Andric extern std::vector<std::string> FilterSections; 55fe6060f1SDimitry Andric extern bool LeadingAddr; 56fe6060f1SDimitry Andric extern std::vector<std::string> MAttrs; 57fe6060f1SDimitry Andric extern std::string MCPU; 58fe6060f1SDimitry Andric extern std::string Prefix; 59fe6060f1SDimitry Andric extern uint32_t PrefixStrip; 60fe6060f1SDimitry Andric extern bool PrintImmHex; 61fe6060f1SDimitry Andric extern bool PrintLines; 62fe6060f1SDimitry Andric extern bool PrintSource; 63fe6060f1SDimitry Andric extern bool PrivateHeaders; 64fe6060f1SDimitry Andric extern bool Relocations; 65fe6060f1SDimitry Andric extern bool SectionHeaders; 66fe6060f1SDimitry Andric extern bool SectionContents; 67fe6060f1SDimitry Andric extern bool ShowRawInsn; 68fe6060f1SDimitry Andric extern bool SymbolDescription; 6906c3fb27SDimitry Andric extern bool TracebackTable; 70fe6060f1SDimitry Andric extern bool SymbolTable; 71fe6060f1SDimitry Andric extern std::string TripleName; 72fe6060f1SDimitry Andric extern bool UnwindInfo; 735ffd83dbSDimitry Andric 745ffd83dbSDimitry Andric extern StringSet<> FoundSectionSet; 750b57cec5SDimitry Andric 7606c3fb27SDimitry Andric class Dumper { 7706c3fb27SDimitry Andric const object::ObjectFile &O; 7806c3fb27SDimitry Andric StringSet<> Warnings; 790b57cec5SDimitry Andric 80*5f757f3fSDimitry Andric protected: 81*5f757f3fSDimitry Andric std::function<Error(const Twine &Msg)> WarningHandler; 82*5f757f3fSDimitry Andric 830b57cec5SDimitry Andric public: 84*5f757f3fSDimitry Andric Dumper(const object::ObjectFile &O); 8506c3fb27SDimitry Andric virtual ~Dumper() {} 860b57cec5SDimitry Andric 8706c3fb27SDimitry Andric void reportUniqueWarning(Error Err); 8806c3fb27SDimitry Andric void reportUniqueWarning(const Twine &Msg); 8906c3fb27SDimitry Andric 90*5f757f3fSDimitry Andric virtual void printPrivateHeaders(); 9106c3fb27SDimitry Andric virtual void printDynamicRelocations() {} 9206c3fb27SDimitry Andric void printSymbolTable(StringRef ArchiveName, 9306c3fb27SDimitry Andric StringRef ArchitectureName = StringRef(), 9406c3fb27SDimitry Andric bool DumpDynamic = false); 9506c3fb27SDimitry Andric void printSymbol(const object::SymbolRef &Symbol, 9606c3fb27SDimitry Andric ArrayRef<object::VersionEntry> SymbolVersions, 9706c3fb27SDimitry Andric StringRef FileName, StringRef ArchiveName, 9806c3fb27SDimitry Andric StringRef ArchitectureName, bool DumpDynamic); 9906c3fb27SDimitry Andric void printRelocations(); 1000b57cec5SDimitry Andric }; 1010b57cec5SDimitry Andric 10206c3fb27SDimitry Andric std::unique_ptr<Dumper> createCOFFDumper(const object::COFFObjectFile &Obj); 10306c3fb27SDimitry Andric std::unique_ptr<Dumper> createELFDumper(const object::ELFObjectFileBase &Obj); 10406c3fb27SDimitry Andric std::unique_ptr<Dumper> createMachODumper(const object::MachOObjectFile &Obj); 10506c3fb27SDimitry Andric std::unique_ptr<Dumper> createWasmDumper(const object::WasmObjectFile &Obj); 10606c3fb27SDimitry Andric std::unique_ptr<Dumper> createXCOFFDumper(const object::XCOFFObjectFile &Obj); 1070b57cec5SDimitry Andric 1080b57cec5SDimitry Andric // Various helper functions. 1098bcb0991SDimitry Andric 1108bcb0991SDimitry Andric /// Creates a SectionFilter with a standard predicate that conditionally skips 1118bcb0991SDimitry Andric /// sections when the --section objdump flag is provided. 1128bcb0991SDimitry Andric /// 1138bcb0991SDimitry Andric /// Idx is an optional output parameter that keeps track of which section index 1148bcb0991SDimitry Andric /// this is. This may be different than the actual section number, as some 1158bcb0991SDimitry Andric /// sections may be filtered (e.g. symbol tables). 11606c3fb27SDimitry Andric object::SectionFilter ToolSectionFilter(const llvm::object::ObjectFile &O, 1178bcb0991SDimitry Andric uint64_t *Idx = nullptr); 1180b57cec5SDimitry Andric 1190b57cec5SDimitry Andric bool isRelocAddressLess(object::RelocationRef A, object::RelocationRef B); 120fcaf7f86SDimitry Andric void printSectionHeaders(object::ObjectFile &O); 1210b57cec5SDimitry Andric void printSectionContents(const object::ObjectFile *O); 122349cc55cSDimitry Andric [[noreturn]] void reportError(StringRef File, const Twine &Message); 123349cc55cSDimitry Andric [[noreturn]] void reportError(Error E, StringRef FileName, 1248bcb0991SDimitry Andric StringRef ArchiveName = "", 1258bcb0991SDimitry Andric StringRef ArchitectureName = ""); 126e8d8bef9SDimitry Andric void reportWarning(const Twine &Message, StringRef File); 1270b57cec5SDimitry Andric 1280b57cec5SDimitry Andric template <typename T, typename... Ts> 1290b57cec5SDimitry Andric T unwrapOrError(Expected<T> EO, Ts &&... Args) { 1300b57cec5SDimitry Andric if (EO) 1310b57cec5SDimitry Andric return std::move(*EO); 1328bcb0991SDimitry Andric reportError(EO.takeError(), std::forward<Ts>(Args)...); 1330b57cec5SDimitry Andric } 1340b57cec5SDimitry Andric 135bdd1243dSDimitry Andric void invalidArgValue(const opt::Arg *A); 136bdd1243dSDimitry Andric 1378bcb0991SDimitry Andric std::string getFileNameForError(const object::Archive::Child &C, 1388bcb0991SDimitry Andric unsigned Index); 139753f127fSDimitry Andric SymbolInfoTy createSymbolInfo(const object::ObjectFile &Obj, 140*5f757f3fSDimitry Andric const object::SymbolRef &Symbol, 141*5f757f3fSDimitry Andric bool IsMappingSymbol = false); 14206c3fb27SDimitry Andric unsigned getInstStartColumn(const MCSubtargetInfo &STI); 14306c3fb27SDimitry Andric void printRawData(llvm::ArrayRef<uint8_t> Bytes, uint64_t Address, 14406c3fb27SDimitry Andric llvm::formatted_raw_ostream &OS, 14506c3fb27SDimitry Andric llvm::MCSubtargetInfo const &STI); 1468bcb0991SDimitry Andric 1475ffd83dbSDimitry Andric } // namespace objdump 1480b57cec5SDimitry Andric } // end namespace llvm 1490b57cec5SDimitry Andric 1500b57cec5SDimitry Andric #endif 151