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/MC/MCSubtargetInfo.h"
16#include "llvm/Object/Archive.h"
17#include "llvm/Object/ObjectFile.h"
18#include "llvm/Support/Compiler.h"
19#include "llvm/Support/DataTypes.h"
20#include "llvm/Support/FormattedStream.h"
21#include <functional>
22#include <memory>
23
24namespace llvm {
25class StringRef;
26class Twine;
27
28namespace opt {
29class Arg;
30} // namespace opt
31
32namespace object {
33class RelocationRef;
34struct VersionEntry;
35
36class COFFObjectFile;
37class ELFObjectFileBase;
38class MachOObjectFile;
39class WasmObjectFile;
40class XCOFFObjectFile;
41} // namespace object
42
43namespace objdump {
44
45enum DebugVarsFormat { DVDisabled, DVUnicode, DVASCII, DVInvalid };
46
47extern bool ArchiveHeaders;
48extern int DbgIndent;
49extern DebugVarsFormat DbgVariables;
50extern bool Demangle;
51extern bool Disassemble;
52extern bool DisassembleAll;
53extern DIDumpType DwarfDumpType;
54extern std::vector<std::string> FilterSections;
55extern bool LeadingAddr;
56extern std::vector<std::string> MAttrs;
57extern std::string MCPU;
58extern std::string Prefix;
59extern uint32_t PrefixStrip;
60extern bool PrintImmHex;
61extern bool PrintLines;
62extern bool PrintSource;
63extern bool PrivateHeaders;
64extern bool Relocations;
65extern bool SectionHeaders;
66extern bool SectionContents;
67extern bool ShowRawInsn;
68extern bool SymbolDescription;
69extern bool TracebackTable;
70extern bool SymbolTable;
71extern std::string TripleName;
72extern bool UnwindInfo;
73
74extern StringSet<> FoundSectionSet;
75
76class Dumper {
77 const object::ObjectFile &O;
78 StringSet<> Warnings;
79
80protected:
81 std::function<Error(const Twine &Msg)> WarningHandler;
82
83public:
84 Dumper(const object::ObjectFile &O);
85 virtual ~Dumper() {}
86
87 void reportUniqueWarning(Error Err);
88 void reportUniqueWarning(const Twine &Msg);
89
90 virtual void printPrivateHeaders();
91 virtual void printDynamicRelocations() {}
92 void printSymbolTable(StringRef ArchiveName,
93 StringRef ArchitectureName = StringRef(),
94 bool DumpDynamic = false);
95 void printSymbol(const object::SymbolRef &Symbol,
96 ArrayRef<object::VersionEntry> SymbolVersions,
97 StringRef FileName, StringRef ArchiveName,
98 StringRef ArchitectureName, bool DumpDynamic);
99 void printRelocations();
100};
101
102std::unique_ptr<Dumper> createCOFFDumper(const object::COFFObjectFile &Obj);
103std::unique_ptr<Dumper> createELFDumper(const object::ELFObjectFileBase &Obj);
104std::unique_ptr<Dumper> createMachODumper(const object::MachOObjectFile &Obj);
105std::unique_ptr<Dumper> createWasmDumper(const object::WasmObjectFile &Obj);
106std::unique_ptr<Dumper> createXCOFFDumper(const object::XCOFFObjectFile &Obj);
107
108// Various helper functions.
109
110/// Creates a SectionFilter with a standard predicate that conditionally skips
111/// sections when the --section objdump flag is provided.
112///
113/// Idx is an optional output parameter that keeps track of which section index
114/// this is. This may be different than the actual section number, as some
115/// sections may be filtered (e.g. symbol tables).
116object::SectionFilter ToolSectionFilter(const llvm::object::ObjectFile &O,
117 uint64_t *Idx = nullptr);
118
119bool isRelocAddressLess(object::RelocationRef A, object::RelocationRef B);
120void printSectionHeaders(object::ObjectFile &O);
121void printSectionContents(const object::ObjectFile *O);
122[[noreturn]] void reportError(StringRef File, const Twine &Message);
123[[noreturn]] void reportError(Error E, StringRef FileName,
124 StringRef ArchiveName = "",
125 StringRef ArchitectureName = "");
126void reportWarning(const Twine &Message, StringRef File);
127
128template <typename T, typename... Ts>
129T unwrapOrError(Expected<T> EO, Ts &&... Args) {
130 if (EO)
131 return std::move(*EO);
132 reportError(EO.takeError(), std::forward<Ts>(Args)...);
133}
134
135void invalidArgValue(const opt::Arg *A);
136
137std::string getFileNameForError(const object::Archive::Child &C,
138 unsigned Index);
139SymbolInfoTy createSymbolInfo(const object::ObjectFile &Obj,
140 const object::SymbolRef &Symbol,
141 bool IsMappingSymbol = false);
142unsigned getInstStartColumn(const MCSubtargetInfo &STI);
143void printRawData(llvm::ArrayRef<uint8_t> Bytes, uint64_t Address,
144 llvm::formatted_raw_ostream &OS,
145 llvm::MCSubtargetInfo const &STI);
146
147} // namespace objdump
148} // end namespace llvm
149
150#endif
151