//===--- llvm-objdump.h -----------------------------------------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #ifndef LLVM_TOOLS_LLVM_OBJDUMP_LLVM_OBJDUMP_H #define LLVM_TOOLS_LLVM_OBJDUMP_LLVM_OBJDUMP_H #include "llvm/ADT/StringSet.h" #include "llvm/DebugInfo/DIContext.h" #include "llvm/MC/MCDisassembler/MCDisassembler.h" #include "llvm/MC/MCSubtargetInfo.h" #include "llvm/Object/Archive.h" #include "llvm/Object/ObjectFile.h" #include "llvm/Support/Compiler.h" #include "llvm/Support/DataTypes.h" #include "llvm/Support/FormattedStream.h" #include #include namespace llvm { class StringRef; class Twine; namespace opt { class Arg; } // namespace opt namespace object { class RelocationRef; struct VersionEntry; class COFFObjectFile; class ELFObjectFileBase; class MachOObjectFile; class WasmObjectFile; class XCOFFObjectFile; } // namespace object namespace objdump { enum DebugVarsFormat { DVDisabled, DVUnicode, DVASCII, DVInvalid }; extern bool ArchiveHeaders; extern int DbgIndent; extern DebugVarsFormat DbgVariables; extern bool Demangle; extern bool Disassemble; extern bool DisassembleAll; extern DIDumpType DwarfDumpType; extern std::vector FilterSections; extern bool LeadingAddr; extern std::vector MAttrs; extern std::string MCPU; extern std::string Prefix; extern uint32_t PrefixStrip; extern bool PrintImmHex; extern bool PrintLines; extern bool PrintSource; extern bool PrivateHeaders; extern bool Relocations; extern bool SectionHeaders; extern bool SectionContents; extern bool ShowRawInsn; extern bool SymbolDescription; extern bool TracebackTable; extern bool SymbolTable; extern std::string TripleName; extern bool UnwindInfo; extern StringSet<> FoundSectionSet; class Dumper { const object::ObjectFile &O; StringSet<> Warnings; protected: std::function WarningHandler; public: Dumper(const object::ObjectFile &O); virtual ~Dumper() {} void reportUniqueWarning(Error Err); void reportUniqueWarning(const Twine &Msg); virtual void printPrivateHeaders(); virtual void printDynamicRelocations() {} void printSymbolTable(StringRef ArchiveName, StringRef ArchitectureName = StringRef(), bool DumpDynamic = false); void printSymbol(const object::SymbolRef &Symbol, ArrayRef SymbolVersions, StringRef FileName, StringRef ArchiveName, StringRef ArchitectureName, bool DumpDynamic); void printRelocations(); }; std::unique_ptr createCOFFDumper(const object::COFFObjectFile &Obj); std::unique_ptr createELFDumper(const object::ELFObjectFileBase &Obj); std::unique_ptr createMachODumper(const object::MachOObjectFile &Obj); std::unique_ptr createWasmDumper(const object::WasmObjectFile &Obj); std::unique_ptr createXCOFFDumper(const object::XCOFFObjectFile &Obj); // Various helper functions. /// Creates a SectionFilter with a standard predicate that conditionally skips /// sections when the --section objdump flag is provided. /// /// Idx is an optional output parameter that keeps track of which section index /// this is. This may be different than the actual section number, as some /// sections may be filtered (e.g. symbol tables). object::SectionFilter ToolSectionFilter(const llvm::object::ObjectFile &O, uint64_t *Idx = nullptr); bool isRelocAddressLess(object::RelocationRef A, object::RelocationRef B); void printSectionHeaders(object::ObjectFile &O); void printSectionContents(const object::ObjectFile *O); [[noreturn]] void reportError(StringRef File, const Twine &Message); [[noreturn]] void reportError(Error E, StringRef FileName, StringRef ArchiveName = "", StringRef ArchitectureName = ""); void reportWarning(const Twine &Message, StringRef File); template T unwrapOrError(Expected EO, Ts &&... Args) { if (EO) return std::move(*EO); reportError(EO.takeError(), std::forward(Args)...); } void invalidArgValue(const opt::Arg *A); std::string getFileNameForError(const object::Archive::Child &C, unsigned Index); SymbolInfoTy createSymbolInfo(const object::ObjectFile &Obj, const object::SymbolRef &Symbol, bool IsMappingSymbol = false); unsigned getInstStartColumn(const MCSubtargetInfo &STI); void printRawData(llvm::ArrayRef Bytes, uint64_t Address, llvm::formatted_raw_ostream &OS, llvm::MCSubtargetInfo const &STI); } // namespace objdump } // end namespace llvm #endif