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:
SectionFilterIterator(FilterPredicate P,llvm::object::section_iterator const & I,llvm::object::section_iterator const & E)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:
ScanPredicate()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:
SectionFilter(FilterPredicate P,llvm::object::ObjectFile const & O)104 SectionFilter(FilterPredicate P, llvm::object::ObjectFile const &O)
105 : Predicate(std::move(P)), Object(O) {}
begin()106 SectionFilterIterator begin() {
107 return SectionFilterIterator(Predicate, Object.section_begin(),
108 Object.section_end());
109 }
end()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>
unwrapOrError(Expected<T> EO,Ts &&...Args)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