diff options
Diffstat (limited to 'llvm/tools/llvm-readobj/ObjDumper.h')
-rw-r--r-- | llvm/tools/llvm-readobj/ObjDumper.h | 58 |
1 files changed, 57 insertions, 1 deletions
diff --git a/llvm/tools/llvm-readobj/ObjDumper.h b/llvm/tools/llvm-readobj/ObjDumper.h index a09a243d381e..292efd2ae350 100644 --- a/llvm/tools/llvm-readobj/ObjDumper.h +++ b/llvm/tools/llvm-readobj/ObjDumper.h @@ -9,9 +9,14 @@ #ifndef LLVM_TOOLS_LLVM_READOBJ_OBJDUMPER_H #define LLVM_TOOLS_LLVM_READOBJ_OBJDUMPER_H +#include <functional> #include <memory> #include <system_error> +#include "llvm/ADT/Optional.h" +#include "llvm/ADT/STLFunctionalExtras.h" +#include "llvm/ADT/SmallVector.h" +#include "llvm/ADT/StringMap.h" #include "llvm/ADT/StringRef.h" #include "llvm/Object/ObjectFile.h" #include "llvm/Support/CommandLine.h" @@ -25,7 +30,7 @@ class COFFImportFile; class ObjectFile; class XCOFFObjectFile; class ELFObjectFileBase; -} +} // namespace object namespace codeview { class GlobalTypeTableBuilder; class MergingTypeTableBuilder; @@ -33,6 +38,33 @@ class MergingTypeTableBuilder; 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); @@ -52,6 +84,17 @@ public: if (PrintDynamicSymbols) printDynamicSymbols(); } + virtual void printSymbols(bool PrintSymbols, bool PrintDynamicSymbols, + llvm::Optional<SymbolComparator> SymComp) { + if (SymComp) { + if (PrintSymbols) + printSymbols(SymComp); + if (PrintDynamicSymbols) + printDynamicSymbols(SymComp); + } else { + printSymbols(PrintSymbols, PrintDynamicSymbols); + } + } virtual void printProgramHeaders(bool PrintProgramHeaders, cl::boolOrDefault PrintSectionMapping) { if (PrintProgramHeaders) @@ -62,6 +105,17 @@ public: 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() { } @@ -133,7 +187,9 @@ protected: private: virtual void printSymbols() {} + virtual void printSymbols(llvm::Optional<SymbolComparator> Comp) {} virtual void printDynamicSymbols() {} + virtual void printDynamicSymbols(llvm::Optional<SymbolComparator> Comp) {} virtual void printProgramHeaders() {} virtual void printSectionMapping() {} |