blob: 33fb3f207f8e5ce9ceae008622e1d00bd25da1d4 [file] [log] [blame]
Chris Wailesbcf972c2021-10-21 11:03:28 -07001//===--- llvm-objdump.h -----------------------------------------*- C++ -*-===//
Inna Palantff3f07a2019-07-11 16:15:26 -07002//
Chih-Hung Hsieh08600532019-12-19 15:55:38 -08003// 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
Inna Palantff3f07a2019-07-11 16:15:26 -07006//
7//===----------------------------------------------------------------------===//
8
9#ifndef LLVM_TOOLS_LLVM_OBJDUMP_LLVM_OBJDUMP_H
10#define LLVM_TOOLS_LLVM_OBJDUMP_LLVM_OBJDUMP_H
11
Thiébaud Weksteene40e7362020-10-28 15:03:00 +010012#include "llvm/ADT/StringSet.h"
Inna Palantff3f07a2019-07-11 16:15:26 -070013#include "llvm/DebugInfo/DIContext.h"
Thiébaud Weksteene40e7362020-10-28 15:03:00 +010014#include "llvm/MC/MCDisassembler/MCDisassembler.h"
15#include "llvm/Object/Archive.h"
Inna Palantff3f07a2019-07-11 16:15:26 -070016#include "llvm/Support/Compiler.h"
17#include "llvm/Support/DataTypes.h"
Inna Palantff3f07a2019-07-11 16:15:26 -070018
19namespace llvm {
20class StringRef;
Chris Wailese3116c42021-07-13 14:40:48 -070021class Twine;
Inna Palantff3f07a2019-07-11 16:15:26 -070022
23namespace object {
Chih-Hung Hsieh08600532019-12-19 15:55:38 -080024class ELFObjectFileBase;
25class ELFSectionRef;
26class MachOObjectFile;
27class MachOUniversalBinary;
28class RelocationRef;
Thiébaud Weksteene40e7362020-10-28 15:03:00 +010029} // namespace object
Inna Palantff3f07a2019-07-11 16:15:26 -070030
Thiébaud Weksteene40e7362020-10-28 15:03:00 +010031namespace objdump {
32
Chris Wailesbcf972c2021-10-21 11:03:28 -070033enum DebugVarsFormat {
34 DVDisabled,
35 DVUnicode,
36 DVASCII,
37};
38
39extern bool ArchiveHeaders;
40extern int DbgIndent;
41extern DebugVarsFormat DbgVariables;
42extern bool Demangle;
43extern bool Disassemble;
44extern bool DisassembleAll;
45extern DIDumpType DwarfDumpType;
46extern std::vector<std::string> FilterSections;
47extern bool LeadingAddr;
48extern std::vector<std::string> MAttrs;
49extern std::string MCPU;
50extern std::string Prefix;
51extern uint32_t PrefixStrip;
52extern bool PrintImmHex;
53extern bool PrintLines;
54extern bool PrintSource;
55extern bool PrivateHeaders;
56extern bool Relocations;
57extern bool SectionHeaders;
58extern bool SectionContents;
59extern bool ShowRawInsn;
60extern bool SymbolDescription;
61extern bool SymbolTable;
62extern std::string TripleName;
63extern bool UnwindInfo;
Thiébaud Weksteene40e7362020-10-28 15:03:00 +010064
65extern StringSet<> FoundSectionSet;
Chih-Hung Hsieh08600532019-12-19 15:55:38 -080066
67typedef std::function<bool(llvm::object::SectionRef const &)> FilterPredicate;
68
Jeff Vander Stoep247d86b2020-08-11 14:27:44 +020069/// A filtered iterator for SectionRefs that skips sections based on some given
70/// predicate.
Chih-Hung Hsieh08600532019-12-19 15:55:38 -080071class SectionFilterIterator {
72public:
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
89private:
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
Jeff Vander Stoep247d86b2020-08-11 14:27:44 +0200100/// Creates an iterator range of SectionFilterIterators for a given Object and
101/// predicate.
Chih-Hung Hsieh08600532019-12-19 15:55:38 -0800102class SectionFilter {
103public:
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
115private:
116 FilterPredicate Predicate;
117 llvm::object::ObjectFile const &Object;
118};
Inna Palantff3f07a2019-07-11 16:15:26 -0700119
120// Various helper functions.
Jeff Vander Stoep247d86b2020-08-11 14:27:44 +0200121
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).
128SectionFilter ToolSectionFilter(llvm::object::ObjectFile const &O,
129 uint64_t *Idx = nullptr);
Chih-Hung Hsieh08600532019-12-19 15:55:38 -0800130
Inna Palantff3f07a2019-07-11 16:15:26 -0700131bool isRelocAddressLess(object::RelocationRef A, object::RelocationRef B);
Inna Palantff3f07a2019-07-11 16:15:26 -0700132void printRelocations(const object::ObjectFile *O);
133void printDynamicRelocations(const object::ObjectFile *O);
134void printSectionHeaders(const object::ObjectFile *O);
135void printSectionContents(const object::ObjectFile *O);
136void printSymbolTable(const object::ObjectFile *O, StringRef ArchiveName,
Thiébaud Weksteene40e7362020-10-28 15:03:00 +0100137 StringRef ArchitectureName = StringRef(),
138 bool DumpDynamic = false);
139void printSymbol(const object::ObjectFile *O, const object::SymbolRef &Symbol,
140 StringRef FileName, StringRef ArchiveName,
141 StringRef ArchitectureName, bool DumpDynamic);
Chris Wailese3116c42021-07-13 14:40:48 -0700142LLVM_ATTRIBUTE_NORETURN void reportError(StringRef File, const Twine &Message);
Jeff Vander Stoep247d86b2020-08-11 14:27:44 +0200143LLVM_ATTRIBUTE_NORETURN void reportError(Error E, StringRef FileName,
144 StringRef ArchiveName = "",
145 StringRef ArchitectureName = "");
Chris Wailese3116c42021-07-13 14:40:48 -0700146void reportWarning(const Twine &Message, StringRef File);
Chih-Hung Hsieh08600532019-12-19 15:55:38 -0800147
148template <typename T, typename... Ts>
149T unwrapOrError(Expected<T> EO, Ts &&... Args) {
150 if (EO)
151 return std::move(*EO);
Jeff Vander Stoep247d86b2020-08-11 14:27:44 +0200152 reportError(EO.takeError(), std::forward<Ts>(Args)...);
Chih-Hung Hsieh08600532019-12-19 15:55:38 -0800153}
Inna Palantff3f07a2019-07-11 16:15:26 -0700154
Jeff Vander Stoep247d86b2020-08-11 14:27:44 +0200155std::string getFileNameForError(const object::Archive::Child &C,
156 unsigned Index);
Thiébaud Weksteene40e7362020-10-28 15:03:00 +0100157SymbolInfoTy createSymbolInfo(const object::ObjectFile *Obj,
158 const object::SymbolRef &Symbol);
Jeff Vander Stoep247d86b2020-08-11 14:27:44 +0200159
Thiébaud Weksteene40e7362020-10-28 15:03:00 +0100160} // namespace objdump
Inna Palantff3f07a2019-07-11 16:15:26 -0700161} // end namespace llvm
162
163#endif