aboutsummaryrefslogtreecommitdiff
path: root/llvm/tools/llvm-readobj/ObjDumper.h
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/tools/llvm-readobj/ObjDumper.h')
-rw-r--r--llvm/tools/llvm-readobj/ObjDumper.h58
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() {}