From 77804bed859d4d8c5960e106c2d3aa640af3649c Mon Sep 17 00:00:00 2001 From: Colin LeMahieu Date: Wed, 29 Jul 2015 15:45:39 +0000 Subject: [PATCH] [llvm-objdump] Added -j flag to filter sections that are operated on. llvm-svn: 243526 --- .../tools/llvm-objdump/Inputs/section-filter.obj | Bin 0 -> 441 bytes llvm/test/tools/llvm-objdump/section-filter.test | 7 ++ llvm/tools/llvm-objdump/llvm-objdump.cpp | 101 ++++++++++++++++++--- llvm/tools/llvm-objdump/llvm-objdump.h | 3 +- 4 files changed, 95 insertions(+), 16 deletions(-) create mode 100644 llvm/test/tools/llvm-objdump/Inputs/section-filter.obj create mode 100644 llvm/test/tools/llvm-objdump/section-filter.test diff --git a/llvm/test/tools/llvm-objdump/Inputs/section-filter.obj b/llvm/test/tools/llvm-objdump/Inputs/section-filter.obj new file mode 100644 index 0000000000000000000000000000000000000000..7dc5dae26b797d196c5b64ff429346a300eeb988 GIT binary patch literal 441 zcma)0I}XAy6mtlo3=B++jEDhs;s7i#aR^d@#KJ-{l!?o52#$xHk6I8CSn`XlIM2Cn z_d8<@3Jf0T9B|-;xF&%mDhz=-oZ5i8@gB85`*01ep(^L?68+Hy7hnA|)G3Z~IQ4Ze z*&4CnRL&-w|CJ4olB=l4 -llvm::DisassembleAll("disassemble-all", - cl::desc("Display assembler mnemonics for the machine instructions")); -static cl::alias -DisassembleAlld("D", cl::desc("Alias for --disassemble-all"), + cl::aliasopt(Disassemble)); + +cl::opt +llvm::DisassembleAll("disassemble-all", + cl::desc("Display assembler mnemonics for the machine instructions")); +static cl::alias +DisassembleAlld("D", cl::desc("Alias for --disassemble-all"), cl::aliasopt(DisassembleAll)); cl::opt @@ -135,6 +135,8 @@ SectionHeadersShort("headers", cl::desc("Alias for --section-headers"), static cl::alias SectionHeadersShorter("h", cl::desc("Alias for --section-headers"), cl::aliasopt(SectionHeaders)); +cl::list +llvm::Sections("j", cl::desc("Operate on the specified sections only")); cl::list llvm::MAttrs("mattr", @@ -172,6 +174,75 @@ cl::opt PrintFaultMaps("fault-map-section", static StringRef ToolName; static int ReturnValue = EXIT_SUCCESS; +namespace { +typedef std::function FilterPredicate; + +class SectionFilterIterator { +public: + SectionFilterIterator(FilterPredicate P, + llvm::object::section_iterator const &I, + llvm::object::section_iterator const &E) + : Predicate(P), Iterator(I), End(E) { + ScanPredicate(); + } + llvm::object::SectionRef operator*() const { return *Iterator; } + SectionFilterIterator &operator++() { + ++Iterator; + ScanPredicate(); + return *this; + } + bool operator!=(SectionFilterIterator const &Other) const { + return Iterator != Other.Iterator; + } + +private: + void ScanPredicate() { + while (Iterator != End && Predicate(*Iterator)) { + ++Iterator; + } + } + FilterPredicate Predicate; + llvm::object::section_iterator Iterator; + llvm::object::section_iterator End; +}; + +class SectionFilter { +public: + SectionFilter(FilterPredicate P, llvm::object::ObjectFile const &O) + : Predicate(P), Object(O) {} + SectionFilterIterator begin() { + return SectionFilterIterator(Predicate, Object.section_begin(), + Object.section_end()); + } + SectionFilterIterator end() { + return SectionFilterIterator(Predicate, Object.section_end(), + Object.section_end()); + } + +private: + FilterPredicate Predicate; + llvm::object::ObjectFile const &Object; +}; +SectionFilter ToolSectionFilter(llvm::object::ObjectFile const &O) { + if (Sections.empty()) { + return SectionFilter([](llvm::object::SectionRef const &) { return 0; }, O); + } + return SectionFilter([](llvm::object::SectionRef const &S) { + llvm::StringRef String; + std::error_code error = S.getName(String); + if (error) { + return error.value(); + } + if (std::find(Sections.begin(), Sections.end(), + String) != Sections.end()) { + return 0; + } + return 1; + }, + O); +} +} + bool llvm::error(std::error_code EC) { if (!EC) return false; @@ -478,7 +549,7 @@ static void printRelocationTargetName(const MachOObjectFile *O, // If we couldn't find a symbol that this relocation refers to, try // to find a section beginning instead. - for (const SectionRef &Section : O->sections()) { + for (const SectionRef &Section : ToolSectionFilter(*O)) { std::error_code ec; StringRef Name; @@ -813,7 +884,7 @@ static void DisassembleObject(const ObjectFile *Obj, bool InlineRelocs) { // in RelocSecs contain the relocations for section S. std::error_code EC; std::map> SectionRelocMap; - for (const SectionRef &Section : Obj->sections()) { + for (const SectionRef &Section : ToolSectionFilter(*Obj)) { section_iterator Sec2 = Section.getRelocatedSection(); if (Sec2 != Obj->section_end()) SectionRelocMap[*Sec2].push_back(Section); @@ -843,7 +914,7 @@ static void DisassembleObject(const ObjectFile *Obj, bool InlineRelocs) { array_pod_sort(AllSymbols.begin(), AllSymbols.end()); } - for (const SectionRef &Section : Obj->sections()) { + for (const SectionRef &Section : ToolSectionFilter(*Obj)) { if (!DisassembleAll && (!Section.isText() || Section.isVirtual())) continue; @@ -1011,7 +1082,7 @@ void llvm::PrintRelocations(const ObjectFile *Obj) { if (!Obj->isRelocatableObject()) return; - for (const SectionRef &Section : Obj->sections()) { + for (const SectionRef &Section : ToolSectionFilter(*Obj)) { if (Section.relocation_begin() == Section.relocation_end()) continue; StringRef secname; @@ -1039,7 +1110,7 @@ void llvm::PrintSectionHeaders(const ObjectFile *Obj) { outs() << "Sections:\n" "Idx Name Size Address Type\n"; unsigned i = 0; - for (const SectionRef &Section : Obj->sections()) { + for (const SectionRef &Section : ToolSectionFilter(*Obj)) { StringRef Name; if (error(Section.getName(Name))) return; @@ -1058,7 +1129,7 @@ void llvm::PrintSectionHeaders(const ObjectFile *Obj) { void llvm::PrintSectionContents(const ObjectFile *Obj) { std::error_code EC; - for (const SectionRef &Section : Obj->sections()) { + for (const SectionRef &Section : ToolSectionFilter(*Obj)) { StringRef Name; StringRef Contents; if (error(Section.getName(Name))) @@ -1336,7 +1407,7 @@ void llvm::printRawClangAST(const ObjectFile *Obj) { } Optional ClangASTSection; - for (auto Sec : Obj->sections()) { + for (auto Sec : ToolSectionFilter(*Obj)) { StringRef Name; Sec.getName(Name); if (Name == ClangASTSectionName) { @@ -1371,7 +1442,7 @@ static void printFaultMaps(const ObjectFile *Obj) { Optional FaultMapSection; - for (auto Sec : Obj->sections()) { + for (auto Sec : ToolSectionFilter(*Obj)) { StringRef Name; Sec.getName(Name); if (Name == FaultMapSectionName) { diff --git a/llvm/tools/llvm-objdump/llvm-objdump.h b/llvm/tools/llvm-objdump/llvm-objdump.h index 0fa2d29..de737f5 100644 --- a/llvm/tools/llvm-objdump/llvm-objdump.h +++ b/llvm/tools/llvm-objdump/llvm-objdump.h @@ -25,8 +25,9 @@ extern cl::opt TripleName; extern cl::opt ArchName; extern cl::opt MCPU; extern cl::list MAttrs; +extern cl::list Sections; extern cl::list DumpSections; -extern cl::opt Disassemble; +extern cl::opt Disassemble; extern cl::opt DisassembleAll; extern cl::opt NoShowRawInsn; extern cl::opt PrivateHeaders; -- 2.7.4