diff options
author | Vy Nguyen <vyng@google.com> | 2022-03-31 09:36:10 -0400 |
---|---|---|
committer | Vy Nguyen <vyng@google.com> | 2022-03-31 14:21:41 -0400 |
commit | 1ae449f9a33b9c8cc3bbf38013b24bd4e9e5bb27 (patch) | |
tree | caff71acad145b25803996d3fa82c48748e8d6f5 /llvm/tools/llvm-readobj/llvm-readobj.cpp | |
parent | 3a4ada699143ce4aa2efc7137f87308cfdabf682 (diff) | |
download | llvm-1ae449f9a33b9c8cc3bbf38013b24bd4e9e5bb27.zip llvm-1ae449f9a33b9c8cc3bbf38013b24bd4e9e5bb27.tar.gz llvm-1ae449f9a33b9c8cc3bbf38013b24bd4e9e5bb27.tar.bz2 |
Reland "[llvm-readobj][MachO] Add option to sort the symbol table before dumping (MachO only, for now)."
https://reviews.llvm.org/D116787
This reverts commit 33b3c86afab06ad61d46456c85c0b565cfff8287.
New change: fixed build failures:
- in stabs-sorted:restore the the ERR-KEY statements, which were accidentally deleted during refactoring
- in ObjDumper.h/MachODumper.cpp: refactor so that current dumpers which didn't provide an impl that accept a SymCom still works
Diffstat (limited to 'llvm/tools/llvm-readobj/llvm-readobj.cpp')
-rw-r--r-- | llvm/tools/llvm-readobj/llvm-readobj.cpp | 53 |
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()) |