aboutsummaryrefslogtreecommitdiff
path: root/llvm/tools/llvm-readobj/llvm-readobj.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/tools/llvm-readobj/llvm-readobj.cpp')
-rw-r--r--llvm/tools/llvm-readobj/llvm-readobj.cpp53
1 files changed, 52 insertions, 1 deletions
diff --git a/llvm/tools/llvm-readobj/llvm-readobj.cpp b/llvm/tools/llvm-readobj/llvm-readobj.cpp
index 543b0de..e1ebbeb 100644
--- a/llvm/tools/llvm-readobj/llvm-readobj.cpp
+++ b/llvm/tools/llvm-readobj/llvm-readobj.cpp
@@ -21,6 +21,7 @@
#include "llvm-readobj.h"
#include "ObjDumper.h"
#include "WindowsResourceDumper.h"
+#include "llvm/ADT/Optional.h"
#include "llvm/DebugInfo/CodeView/GlobalTypeTableBuilder.h"
#include "llvm/DebugInfo/CodeView/MergingTypeTableBuilder.h"
#include "llvm/MC/TargetRegistry.h"
@@ -83,6 +84,14 @@ public:
};
enum OutputFormatTy { bsd, sysv, posix, darwin, just_symbols };
+
+enum SortSymbolKeyTy {
+ NAME = 0,
+ TYPE = 1,
+ UNKNOWN = 100,
+ // TODO: add ADDRESS, SIZE as needed.
+};
+
} // namespace
namespace opts {
@@ -113,6 +122,7 @@ static bool StringTable;
static bool Symbols;
static bool UnwindInfo;
static cl::boolOrDefault SectionMapping;
+static SmallVector<SortSymbolKeyTy> SortKeys;
// ELF specific options.
static bool DynamicTable;
@@ -253,6 +263,19 @@ static void parseOptions(const opt::InputArgList &Args) {
opts::ProgramHeaders = Args.hasArg(OPT_program_headers);
opts::RawRelr = Args.hasArg(OPT_raw_relr);
opts::SectionGroups = Args.hasArg(OPT_section_groups);
+ if (Arg *A = Args.getLastArg(OPT_sort_symbols_EQ)) {
+ std::string SortKeysString = A->getValue();
+ for (StringRef KeyStr : llvm::split(A->getValue(), ",")) {
+ SortSymbolKeyTy KeyType = StringSwitch<SortSymbolKeyTy>(KeyStr)
+ .Case("name", SortSymbolKeyTy::NAME)
+ .Case("type", SortSymbolKeyTy::TYPE)
+ .Default(SortSymbolKeyTy::UNKNOWN);
+ if (KeyType == SortSymbolKeyTy::UNKNOWN)
+ error("--sort-symbols value should be 'name' or 'type', but was '" +
+ Twine(KeyStr) + "'");
+ opts::SortKeys.push_back(KeyType);
+ }
+ }
opts::VersionInfo = Args.hasArg(OPT_version_info);
// Mach-O specific options.
@@ -334,11 +357,39 @@ static void dumpObject(ObjectFile &Obj, ScopedPrinter &Writer,
toString(std::move(ContentErr));
ObjDumper *Dumper;
+ Optional<SymbolComparator> SymComp;
Expected<std::unique_ptr<ObjDumper>> DumperOrErr = createDumper(Obj, Writer);
if (!DumperOrErr)
reportError(DumperOrErr.takeError(), FileStr);
Dumper = (*DumperOrErr).get();
+ if (!opts::SortKeys.empty()) {
+ if (Dumper->canCompareSymbols()) {
+ SymComp = SymbolComparator();
+ for (SortSymbolKeyTy Key : opts::SortKeys) {
+ switch (Key) {
+ case NAME:
+ SymComp->addPredicate([Dumper](SymbolRef LHS, SymbolRef RHS) {
+ return Dumper->compareSymbolsByName(LHS, RHS);
+ });
+ break;
+ case TYPE:
+ SymComp->addPredicate([Dumper](SymbolRef LHS, SymbolRef RHS) {
+ return Dumper->compareSymbolsByType(LHS, RHS);
+ });
+ break;
+ case UNKNOWN:
+ llvm_unreachable("Unsupported sort key");
+ }
+ }
+
+ } else {
+ reportWarning(createStringError(
+ errc::invalid_argument,
+ "--sort-symbols is not supported yet for this format"),
+ FileStr);
+ }
+ }
Dumper->printFileSummary(FileStr, Obj, opts::InputFilenames, A);
if (opts::FileHeaders)
@@ -374,7 +425,7 @@ static void dumpObject(ObjectFile &Obj, ScopedPrinter &Writer,
if (opts::UnwindInfo)
Dumper->printUnwindInfo();
if (opts::Symbols || opts::DynamicSymbols)
- Dumper->printSymbols(opts::Symbols, opts::DynamicSymbols);
+ Dumper->printSymbols(opts::Symbols, opts::DynamicSymbols, SymComp);
if (!opts::StringDump.empty())
Dumper->printSectionsAsString(Obj, opts::StringDump);
if (!opts::HexDump.empty())