From: Colin LeMahieu Date: Wed, 29 Jul 2015 15:45:39 +0000 (+0000) Subject: [llvm-objdump] Added -j flag to filter sections that are operated on. X-Git-Tag: studio-1.4~1308 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=77804bed859d4d8c5960e106c2d3aa640af3649c;p=platform%2Fupstream%2Fllvm.git [llvm-objdump] Added -j flag to filter sections that are operated on. llvm-svn: 243526 --- 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 0000000..7dc5dae Binary files /dev/null and b/llvm/test/tools/llvm-objdump/Inputs/section-filter.obj differ diff --git a/llvm/test/tools/llvm-objdump/section-filter.test b/llvm/test/tools/llvm-objdump/section-filter.test new file mode 100644 index 0000000..911ff5b --- /dev/null +++ b/llvm/test/tools/llvm-objdump/section-filter.test @@ -0,0 +1,7 @@ +// This test checks that --section works correctly +// RUN: llvm-objdump -h %p/Inputs/section-filter.obj -j=.text \ +// RUN: -j=.bss | FileCheck %s + +# CHECK: .text +# CHECK-NOT: .data +# CHECK: .bss \ No newline at end of file diff --git a/llvm/tools/llvm-objdump/llvm-objdump.cpp b/llvm/tools/llvm-objdump/llvm-objdump.cpp index 91626c1..af8bc4a 100644 --- a/llvm/tools/llvm-objdump/llvm-objdump.cpp +++ b/llvm/tools/llvm-objdump/llvm-objdump.cpp @@ -70,13 +70,13 @@ llvm::Disassemble("disassemble", cl::desc("Display assembler mnemonics for the machine instructions")); static cl::alias Disassembled("d", cl::desc("Alias for --disassemble"), - 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(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;