aboutsummaryrefslogtreecommitdiff
path: root/contrib/llvm-project/llvm/tools/llvm-readobj/ObjDumper.h
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/llvm-project/llvm/tools/llvm-readobj/ObjDumper.h')
-rw-r--r--contrib/llvm-project/llvm/tools/llvm-readobj/ObjDumper.h224
1 files changed, 224 insertions, 0 deletions
diff --git a/contrib/llvm-project/llvm/tools/llvm-readobj/ObjDumper.h b/contrib/llvm-project/llvm/tools/llvm-readobj/ObjDumper.h
new file mode 100644
index 000000000000..1d679453581b
--- /dev/null
+++ b/contrib/llvm-project/llvm/tools/llvm-readobj/ObjDumper.h
@@ -0,0 +1,224 @@
+//===-- ObjDumper.h ---------------------------------------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_TOOLS_LLVM_READOBJ_OBJDUMPER_H
+#define LLVM_TOOLS_LLVM_READOBJ_OBJDUMPER_H
+
+#include <functional>
+#include <memory>
+#include <system_error>
+
+#include "llvm/ADT/SmallVector.h"
+#include "llvm/ADT/StringRef.h"
+#include "llvm/Object/ObjectFile.h"
+#include "llvm/Support/CommandLine.h"
+
+#include <unordered_set>
+
+namespace llvm {
+namespace object {
+class Archive;
+class COFFImportFile;
+class ObjectFile;
+class XCOFFObjectFile;
+class ELFObjectFileBase;
+} // namespace object
+namespace codeview {
+class GlobalTypeTableBuilder;
+class MergingTypeTableBuilder;
+} // namespace codeview
+
+class ScopedPrinter;
+
+// Comparator to compare symbols.
+// Usage: the caller registers predicates (i.e., how to compare the symbols) by
+// calling addPredicate(). The order in which predicates are registered is also
+// their priority.
+class SymbolComparator {
+public:
+ using CompPredicate =
+ std::function<bool(object::SymbolRef, object::SymbolRef)>;
+
+ // Each Obj format has a slightly different way of retrieving a symbol's info
+ // So we defer the predicate's impl to each format.
+ void addPredicate(CompPredicate Pred) { Predicates.push_back(Pred); }
+
+ bool operator()(object::SymbolRef LHS, object::SymbolRef RHS) {
+ for (CompPredicate Pred : Predicates) {
+ if (Pred(LHS, RHS))
+ return true;
+ if (Pred(RHS, LHS))
+ return false;
+ }
+ return false;
+ }
+
+private:
+ SmallVector<CompPredicate, 2> Predicates;
+};
+
+class ObjDumper {
+public:
+ ObjDumper(ScopedPrinter &Writer, StringRef ObjName);
+ virtual ~ObjDumper();
+
+ virtual bool canDumpContent() { return true; }
+
+ virtual void printFileSummary(StringRef FileStr, object::ObjectFile &Obj,
+ ArrayRef<std::string> InputFilenames,
+ const object::Archive *A);
+ virtual void printFileHeaders() = 0;
+ virtual void printSectionHeaders() = 0;
+ virtual void printRelocations() = 0;
+ virtual void printSymbols(bool PrintSymbols, bool PrintDynamicSymbols,
+ bool ExtraSymInfo) {
+ if (PrintSymbols)
+ printSymbols(ExtraSymInfo);
+ if (PrintDynamicSymbols)
+ printDynamicSymbols();
+ }
+ virtual void printSymbols(bool PrintSymbols, bool PrintDynamicSymbols,
+ bool ExtraSymInfo,
+ std::optional<SymbolComparator> SymComp) {
+ if (SymComp) {
+ if (PrintSymbols)
+ printSymbols(SymComp);
+ if (PrintDynamicSymbols)
+ printDynamicSymbols(SymComp);
+ } else {
+ printSymbols(PrintSymbols, PrintDynamicSymbols, ExtraSymInfo);
+ }
+ }
+ virtual void printProgramHeaders(bool PrintProgramHeaders,
+ cl::boolOrDefault PrintSectionMapping) {
+ if (PrintProgramHeaders)
+ printProgramHeaders();
+ if (PrintSectionMapping == cl::BOU_TRUE)
+ printSectionMapping();
+ }
+
+ virtual void printUnwindInfo() = 0;
+
+ // Symbol comparison functions.
+ virtual bool canCompareSymbols() const { return false; }
+ virtual bool compareSymbolsByName(object::SymbolRef LHS,
+ object::SymbolRef RHS) const {
+ return true;
+ }
+ virtual bool compareSymbolsByType(object::SymbolRef LHS,
+ object::SymbolRef RHS) const {
+ return true;
+ }
+
+ // Only implemented for ELF at this time.
+ virtual void printDependentLibs() {}
+ virtual void printDynamicRelocations() { }
+ virtual void printDynamicTable() { }
+ virtual void printNeededLibraries() { }
+ virtual void printSectionAsHex(StringRef SectionName) {}
+ virtual void printHashTable() { }
+ virtual void printGnuHashTable() {}
+ virtual void printHashSymbols() {}
+ virtual void printLoadName() {}
+ virtual void printVersionInfo() {}
+ virtual void printGroupSections() {}
+ virtual void printHashHistograms() {}
+ virtual void printCGProfile() {}
+ virtual void printBBAddrMaps() {}
+ virtual void printAddrsig() {}
+ virtual void printNotes() {}
+ virtual void printELFLinkerOptions() {}
+ virtual void printStackSizes() {}
+ virtual void printSectionDetails() {}
+ virtual void printArchSpecificInfo() {}
+ virtual void printMemtag() {}
+
+ // Only implemented for PE/COFF.
+ virtual void printCOFFImports() { }
+ virtual void printCOFFExports() { }
+ virtual void printCOFFDirectives() { }
+ virtual void printCOFFBaseReloc() { }
+ virtual void printCOFFDebugDirectory() { }
+ virtual void printCOFFTLSDirectory() {}
+ virtual void printCOFFResources() {}
+ virtual void printCOFFLoadConfig() { }
+ virtual void printCodeViewDebugInfo() { }
+ virtual void
+ mergeCodeViewTypes(llvm::codeview::MergingTypeTableBuilder &CVIDs,
+ llvm::codeview::MergingTypeTableBuilder &CVTypes,
+ llvm::codeview::GlobalTypeTableBuilder &GlobalCVIDs,
+ llvm::codeview::GlobalTypeTableBuilder &GlobalCVTypes,
+ bool GHash) {}
+
+ // Only implemented for XCOFF.
+ virtual void printStringTable() {}
+ virtual void printAuxiliaryHeader() {}
+ virtual void printExceptionSection() {}
+ virtual void printLoaderSection(bool PrintHeader, bool PrintSymbols,
+ bool PrintRelocations) {}
+
+ // Only implemented for MachO.
+ virtual void printMachODataInCode() { }
+ virtual void printMachOVersionMin() { }
+ virtual void printMachODysymtab() { }
+ virtual void printMachOSegment() { }
+ virtual void printMachOIndirectSymbols() { }
+ virtual void printMachOLinkerOptions() { }
+
+ virtual void printStackMap() const = 0;
+
+ void printAsStringList(StringRef StringContent, size_t StringDataOffset = 0);
+
+ void printSectionsAsString(const object::ObjectFile &Obj,
+ ArrayRef<std::string> Sections);
+ void printSectionsAsHex(const object::ObjectFile &Obj,
+ ArrayRef<std::string> Sections);
+
+ std::function<Error(const Twine &Msg)> WarningHandler;
+ void reportUniqueWarning(Error Err) const;
+ void reportUniqueWarning(const Twine &Msg) const;
+
+protected:
+ ScopedPrinter &W;
+
+private:
+ virtual void printSymbols(bool ExtraSymInfo) {}
+ virtual void printSymbols(std::optional<SymbolComparator> Comp) {}
+ virtual void printDynamicSymbols() {}
+ virtual void printDynamicSymbols(std::optional<SymbolComparator> Comp) {}
+ virtual void printProgramHeaders() {}
+ virtual void printSectionMapping() {}
+
+ std::unordered_set<std::string> Warnings;
+};
+
+std::unique_ptr<ObjDumper> createCOFFDumper(const object::COFFObjectFile &Obj,
+ ScopedPrinter &Writer);
+
+std::unique_ptr<ObjDumper> createELFDumper(const object::ELFObjectFileBase &Obj,
+ ScopedPrinter &Writer);
+
+std::unique_ptr<ObjDumper> createMachODumper(const object::MachOObjectFile &Obj,
+ ScopedPrinter &Writer);
+
+std::unique_ptr<ObjDumper> createWasmDumper(const object::WasmObjectFile &Obj,
+ ScopedPrinter &Writer);
+
+std::unique_ptr<ObjDumper> createXCOFFDumper(const object::XCOFFObjectFile &Obj,
+ ScopedPrinter &Writer);
+
+void dumpCOFFImportFile(const object::COFFImportFile *File,
+ ScopedPrinter &Writer);
+
+void dumpCodeViewMergedTypes(ScopedPrinter &Writer,
+ ArrayRef<ArrayRef<uint8_t>> IpiRecords,
+ ArrayRef<ArrayRef<uint8_t>> TpiRecords);
+
+} // namespace llvm
+
+#endif