xref: /freebsd/contrib/llvm-project/llvm/tools/llvm-objdump/llvm-objdump.h (revision 5f757f3ff9144b609b3c433dfd370cc6bdc191ad)
1fe6060f1SDimitry Andric //===--- llvm-objdump.h -----------------------------------------*- C++ -*-===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric 
90b57cec5SDimitry Andric #ifndef LLVM_TOOLS_LLVM_OBJDUMP_LLVM_OBJDUMP_H
100b57cec5SDimitry Andric #define LLVM_TOOLS_LLVM_OBJDUMP_LLVM_OBJDUMP_H
110b57cec5SDimitry Andric 
125ffd83dbSDimitry Andric #include "llvm/ADT/StringSet.h"
130b57cec5SDimitry Andric #include "llvm/DebugInfo/DIContext.h"
145ffd83dbSDimitry Andric #include "llvm/MC/MCDisassembler/MCDisassembler.h"
1506c3fb27SDimitry Andric #include "llvm/MC/MCSubtargetInfo.h"
165ffd83dbSDimitry Andric #include "llvm/Object/Archive.h"
1706c3fb27SDimitry Andric #include "llvm/Object/ObjectFile.h"
180b57cec5SDimitry Andric #include "llvm/Support/Compiler.h"
190b57cec5SDimitry Andric #include "llvm/Support/DataTypes.h"
2006c3fb27SDimitry Andric #include "llvm/Support/FormattedStream.h"
21*5f757f3fSDimitry Andric #include <functional>
2206c3fb27SDimitry Andric #include <memory>
230b57cec5SDimitry Andric 
240b57cec5SDimitry Andric namespace llvm {
250b57cec5SDimitry Andric class StringRef;
26e8d8bef9SDimitry Andric class Twine;
270b57cec5SDimitry Andric 
28bdd1243dSDimitry Andric namespace opt {
29bdd1243dSDimitry Andric class Arg;
30bdd1243dSDimitry Andric } // namespace opt
31bdd1243dSDimitry Andric 
320b57cec5SDimitry Andric namespace object {
330b57cec5SDimitry Andric class RelocationRef;
34349cc55cSDimitry Andric struct VersionEntry;
3506c3fb27SDimitry Andric 
3606c3fb27SDimitry Andric class COFFObjectFile;
3706c3fb27SDimitry Andric class ELFObjectFileBase;
3806c3fb27SDimitry Andric class MachOObjectFile;
3906c3fb27SDimitry Andric class WasmObjectFile;
4006c3fb27SDimitry Andric class XCOFFObjectFile;
415ffd83dbSDimitry Andric } // namespace object
420b57cec5SDimitry Andric 
435ffd83dbSDimitry Andric namespace objdump {
445ffd83dbSDimitry Andric 
45349cc55cSDimitry Andric enum DebugVarsFormat { DVDisabled, DVUnicode, DVASCII, DVInvalid };
46fe6060f1SDimitry Andric 
47fe6060f1SDimitry Andric extern bool ArchiveHeaders;
48fe6060f1SDimitry Andric extern int DbgIndent;
49fe6060f1SDimitry Andric extern DebugVarsFormat DbgVariables;
50fe6060f1SDimitry Andric extern bool Demangle;
51fe6060f1SDimitry Andric extern bool Disassemble;
52fe6060f1SDimitry Andric extern bool DisassembleAll;
53fe6060f1SDimitry Andric extern DIDumpType DwarfDumpType;
54fe6060f1SDimitry Andric extern std::vector<std::string> FilterSections;
55fe6060f1SDimitry Andric extern bool LeadingAddr;
56fe6060f1SDimitry Andric extern std::vector<std::string> MAttrs;
57fe6060f1SDimitry Andric extern std::string MCPU;
58fe6060f1SDimitry Andric extern std::string Prefix;
59fe6060f1SDimitry Andric extern uint32_t PrefixStrip;
60fe6060f1SDimitry Andric extern bool PrintImmHex;
61fe6060f1SDimitry Andric extern bool PrintLines;
62fe6060f1SDimitry Andric extern bool PrintSource;
63fe6060f1SDimitry Andric extern bool PrivateHeaders;
64fe6060f1SDimitry Andric extern bool Relocations;
65fe6060f1SDimitry Andric extern bool SectionHeaders;
66fe6060f1SDimitry Andric extern bool SectionContents;
67fe6060f1SDimitry Andric extern bool ShowRawInsn;
68fe6060f1SDimitry Andric extern bool SymbolDescription;
6906c3fb27SDimitry Andric extern bool TracebackTable;
70fe6060f1SDimitry Andric extern bool SymbolTable;
71fe6060f1SDimitry Andric extern std::string TripleName;
72fe6060f1SDimitry Andric extern bool UnwindInfo;
735ffd83dbSDimitry Andric 
745ffd83dbSDimitry Andric extern StringSet<> FoundSectionSet;
750b57cec5SDimitry Andric 
7606c3fb27SDimitry Andric class Dumper {
7706c3fb27SDimitry Andric   const object::ObjectFile &O;
7806c3fb27SDimitry Andric   StringSet<> Warnings;
790b57cec5SDimitry Andric 
80*5f757f3fSDimitry Andric protected:
81*5f757f3fSDimitry Andric   std::function<Error(const Twine &Msg)> WarningHandler;
82*5f757f3fSDimitry Andric 
830b57cec5SDimitry Andric public:
84*5f757f3fSDimitry Andric   Dumper(const object::ObjectFile &O);
8506c3fb27SDimitry Andric   virtual ~Dumper() {}
860b57cec5SDimitry Andric 
8706c3fb27SDimitry Andric   void reportUniqueWarning(Error Err);
8806c3fb27SDimitry Andric   void reportUniqueWarning(const Twine &Msg);
8906c3fb27SDimitry Andric 
90*5f757f3fSDimitry Andric   virtual void printPrivateHeaders();
9106c3fb27SDimitry Andric   virtual void printDynamicRelocations() {}
9206c3fb27SDimitry Andric   void printSymbolTable(StringRef ArchiveName,
9306c3fb27SDimitry Andric                         StringRef ArchitectureName = StringRef(),
9406c3fb27SDimitry Andric                         bool DumpDynamic = false);
9506c3fb27SDimitry Andric   void printSymbol(const object::SymbolRef &Symbol,
9606c3fb27SDimitry Andric                    ArrayRef<object::VersionEntry> SymbolVersions,
9706c3fb27SDimitry Andric                    StringRef FileName, StringRef ArchiveName,
9806c3fb27SDimitry Andric                    StringRef ArchitectureName, bool DumpDynamic);
9906c3fb27SDimitry Andric   void printRelocations();
1000b57cec5SDimitry Andric };
1010b57cec5SDimitry Andric 
10206c3fb27SDimitry Andric std::unique_ptr<Dumper> createCOFFDumper(const object::COFFObjectFile &Obj);
10306c3fb27SDimitry Andric std::unique_ptr<Dumper> createELFDumper(const object::ELFObjectFileBase &Obj);
10406c3fb27SDimitry Andric std::unique_ptr<Dumper> createMachODumper(const object::MachOObjectFile &Obj);
10506c3fb27SDimitry Andric std::unique_ptr<Dumper> createWasmDumper(const object::WasmObjectFile &Obj);
10606c3fb27SDimitry Andric std::unique_ptr<Dumper> createXCOFFDumper(const object::XCOFFObjectFile &Obj);
1070b57cec5SDimitry Andric 
1080b57cec5SDimitry Andric // Various helper functions.
1098bcb0991SDimitry Andric 
1108bcb0991SDimitry Andric /// Creates a SectionFilter with a standard predicate that conditionally skips
1118bcb0991SDimitry Andric /// sections when the --section objdump flag is provided.
1128bcb0991SDimitry Andric ///
1138bcb0991SDimitry Andric /// Idx is an optional output parameter that keeps track of which section index
1148bcb0991SDimitry Andric /// this is. This may be different than the actual section number, as some
1158bcb0991SDimitry Andric /// sections may be filtered (e.g. symbol tables).
11606c3fb27SDimitry Andric object::SectionFilter ToolSectionFilter(const llvm::object::ObjectFile &O,
1178bcb0991SDimitry Andric                                         uint64_t *Idx = nullptr);
1180b57cec5SDimitry Andric 
1190b57cec5SDimitry Andric bool isRelocAddressLess(object::RelocationRef A, object::RelocationRef B);
120fcaf7f86SDimitry Andric void printSectionHeaders(object::ObjectFile &O);
1210b57cec5SDimitry Andric void printSectionContents(const object::ObjectFile *O);
122349cc55cSDimitry Andric [[noreturn]] void reportError(StringRef File, const Twine &Message);
123349cc55cSDimitry Andric [[noreturn]] void reportError(Error E, StringRef FileName,
1248bcb0991SDimitry Andric                               StringRef ArchiveName = "",
1258bcb0991SDimitry Andric                               StringRef ArchitectureName = "");
126e8d8bef9SDimitry Andric void reportWarning(const Twine &Message, StringRef File);
1270b57cec5SDimitry Andric 
1280b57cec5SDimitry Andric template <typename T, typename... Ts>
1290b57cec5SDimitry Andric T unwrapOrError(Expected<T> EO, Ts &&... Args) {
1300b57cec5SDimitry Andric   if (EO)
1310b57cec5SDimitry Andric     return std::move(*EO);
1328bcb0991SDimitry Andric   reportError(EO.takeError(), std::forward<Ts>(Args)...);
1330b57cec5SDimitry Andric }
1340b57cec5SDimitry Andric 
135bdd1243dSDimitry Andric void invalidArgValue(const opt::Arg *A);
136bdd1243dSDimitry Andric 
1378bcb0991SDimitry Andric std::string getFileNameForError(const object::Archive::Child &C,
1388bcb0991SDimitry Andric                                 unsigned Index);
139753f127fSDimitry Andric SymbolInfoTy createSymbolInfo(const object::ObjectFile &Obj,
140*5f757f3fSDimitry Andric                               const object::SymbolRef &Symbol,
141*5f757f3fSDimitry Andric                               bool IsMappingSymbol = false);
14206c3fb27SDimitry Andric unsigned getInstStartColumn(const MCSubtargetInfo &STI);
14306c3fb27SDimitry Andric void printRawData(llvm::ArrayRef<uint8_t> Bytes, uint64_t Address,
14406c3fb27SDimitry Andric                   llvm::formatted_raw_ostream &OS,
14506c3fb27SDimitry Andric                   llvm::MCSubtargetInfo const &STI);
1468bcb0991SDimitry Andric 
1475ffd83dbSDimitry Andric } // namespace objdump
1480b57cec5SDimitry Andric } // end namespace llvm
1490b57cec5SDimitry Andric 
1500b57cec5SDimitry Andric #endif
151