Home | History | Annotate | Line # | Download | only in llvm-objdump
      1 //===--- llvm-objdump.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_OBJDUMP_LLVM_OBJDUMP_H
     10 #define LLVM_TOOLS_LLVM_OBJDUMP_LLVM_OBJDUMP_H
     11 
     12 #include "llvm/ADT/StringSet.h"
     13 #include "llvm/DebugInfo/DIContext.h"
     14 #include "llvm/MC/MCDisassembler/MCDisassembler.h"
     15 #include "llvm/Object/Archive.h"
     16 #include "llvm/Support/Compiler.h"
     17 #include "llvm/Support/DataTypes.h"
     18 
     19 namespace llvm {
     20 class StringRef;
     21 class Twine;
     22 
     23 namespace object {
     24 class ELFObjectFileBase;
     25 class ELFSectionRef;
     26 class MachOObjectFile;
     27 class MachOUniversalBinary;
     28 class RelocationRef;
     29 } // namespace object
     30 
     31 namespace objdump {
     32 
     33 enum DebugVarsFormat {
     34   DVDisabled,
     35   DVUnicode,
     36   DVASCII,
     37 };
     38 
     39 extern bool ArchiveHeaders;
     40 extern int DbgIndent;
     41 extern DebugVarsFormat DbgVariables;
     42 extern bool Demangle;
     43 extern bool Disassemble;
     44 extern bool DisassembleAll;
     45 extern DIDumpType DwarfDumpType;
     46 extern std::vector<std::string> FilterSections;
     47 extern bool LeadingAddr;
     48 extern std::vector<std::string> MAttrs;
     49 extern std::string MCPU;
     50 extern std::string Prefix;
     51 extern uint32_t PrefixStrip;
     52 extern bool PrintImmHex;
     53 extern bool PrintLines;
     54 extern bool PrintSource;
     55 extern bool PrivateHeaders;
     56 extern bool Relocations;
     57 extern bool SectionHeaders;
     58 extern bool SectionContents;
     59 extern bool ShowRawInsn;
     60 extern bool SymbolDescription;
     61 extern bool SymbolTable;
     62 extern std::string TripleName;
     63 extern bool UnwindInfo;
     64 
     65 extern StringSet<> FoundSectionSet;
     66 
     67 typedef std::function<bool(llvm::object::SectionRef const &)> FilterPredicate;
     68 
     69 /// A filtered iterator for SectionRefs that skips sections based on some given
     70 /// predicate.
     71 class SectionFilterIterator {
     72 public:
     73   SectionFilterIterator(FilterPredicate P,
     74                         llvm::object::section_iterator const &I,
     75                         llvm::object::section_iterator const &E)
     76       : Predicate(std::move(P)), Iterator(I), End(E) {
     77     ScanPredicate();
     78   }
     79   const llvm::object::SectionRef &operator*() const { return *Iterator; }
     80   SectionFilterIterator &operator++() {
     81     ++Iterator;
     82     ScanPredicate();
     83     return *this;
     84   }
     85   bool operator!=(SectionFilterIterator const &Other) const {
     86     return Iterator != Other.Iterator;
     87   }
     88 
     89 private:
     90   void ScanPredicate() {
     91     while (Iterator != End && !Predicate(*Iterator)) {
     92       ++Iterator;
     93     }
     94   }
     95   FilterPredicate Predicate;
     96   llvm::object::section_iterator Iterator;
     97   llvm::object::section_iterator End;
     98 };
     99 
    100 /// Creates an iterator range of SectionFilterIterators for a given Object and
    101 /// predicate.
    102 class SectionFilter {
    103 public:
    104   SectionFilter(FilterPredicate P, llvm::object::ObjectFile const &O)
    105       : Predicate(std::move(P)), Object(O) {}
    106   SectionFilterIterator begin() {
    107     return SectionFilterIterator(Predicate, Object.section_begin(),
    108                                  Object.section_end());
    109   }
    110   SectionFilterIterator end() {
    111     return SectionFilterIterator(Predicate, Object.section_end(),
    112                                  Object.section_end());
    113   }
    114 
    115 private:
    116   FilterPredicate Predicate;
    117   llvm::object::ObjectFile const &Object;
    118 };
    119 
    120 // Various helper functions.
    121 
    122 /// Creates a SectionFilter with a standard predicate that conditionally skips
    123 /// sections when the --section objdump flag is provided.
    124 ///
    125 /// Idx is an optional output parameter that keeps track of which section index
    126 /// this is. This may be different than the actual section number, as some
    127 /// sections may be filtered (e.g. symbol tables).
    128 SectionFilter ToolSectionFilter(llvm::object::ObjectFile const &O,
    129                                 uint64_t *Idx = nullptr);
    130 
    131 bool isRelocAddressLess(object::RelocationRef A, object::RelocationRef B);
    132 void printRelocations(const object::ObjectFile *O);
    133 void printDynamicRelocations(const object::ObjectFile *O);
    134 void printSectionHeaders(const object::ObjectFile *O);
    135 void printSectionContents(const object::ObjectFile *O);
    136 void printSymbolTable(const object::ObjectFile *O, StringRef ArchiveName,
    137                       StringRef ArchitectureName = StringRef(),
    138                       bool DumpDynamic = false);
    139 void printSymbol(const object::ObjectFile *O, const object::SymbolRef &Symbol,
    140                  StringRef FileName, StringRef ArchiveName,
    141                  StringRef ArchitectureName, bool DumpDynamic);
    142 LLVM_ATTRIBUTE_NORETURN void reportError(StringRef File, const Twine &Message);
    143 LLVM_ATTRIBUTE_NORETURN void reportError(Error E, StringRef FileName,
    144                                          StringRef ArchiveName = "",
    145                                          StringRef ArchitectureName = "");
    146 void reportWarning(const Twine &Message, StringRef File);
    147 
    148 template <typename T, typename... Ts>
    149 T unwrapOrError(Expected<T> EO, Ts &&... Args) {
    150   if (EO)
    151     return std::move(*EO);
    152   reportError(EO.takeError(), std::forward<Ts>(Args)...);
    153 }
    154 
    155 std::string getFileNameForError(const object::Archive::Child &C,
    156                                 unsigned Index);
    157 SymbolInfoTy createSymbolInfo(const object::ObjectFile *Obj,
    158                               const object::SymbolRef &Symbol);
    159 
    160 } // namespace objdump
    161 } // end namespace llvm
    162 
    163 #endif
    164