From 7a2da95e44b5f537323d4fedcacf6378a8682b7d Mon Sep 17 00:00:00 2001 From: Alexey Samsonov Date: Thu, 13 Mar 2014 14:37:36 +0000 Subject: [PATCH] [C++11] Use ObjectFile::sections() in commandline llvm tools git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@203802 91177308-0d34-0410-b5e6-96231b3b80d8 --- tools/llvm-objdump/MachODump.cpp | 11 ++-- tools/llvm-objdump/llvm-objdump.cpp | 85 +++++++++++++------------ tools/llvm-readobj/MachODumper.cpp | 75 ++++++++++------------ tools/llvm-size/llvm-size.cpp | 47 +++++++------- tools/llvm-symbolizer/LLVMSymbolize.cpp | 7 +- 5 files changed, 111 insertions(+), 114 deletions(-) diff --git a/tools/llvm-objdump/MachODump.cpp b/tools/llvm-objdump/MachODump.cpp index df96f00bd7b..087fb40628a 100644 --- a/tools/llvm-objdump/MachODump.cpp +++ b/tools/llvm-objdump/MachODump.cpp @@ -158,17 +158,14 @@ getSectionsAndSymbols(const MachO::mach_header Header, SI != SE; ++SI) Symbols.push_back(*SI); - for (section_iterator SI = MachOObj->section_begin(), - SE = MachOObj->section_end(); - SI != SE; ++SI) { - SectionRef SR = *SI; + for (const SectionRef &Section : MachOObj->sections()) { StringRef SectName; - SR.getName(SectName); - Sections.push_back(*SI); + Section.getName(SectName); + Sections.push_back(Section); } MachOObjectFile::LoadCommandInfo Command = - MachOObj->getFirstLoadCommandInfo(); + MachOObj->getFirstLoadCommandInfo(); bool BaseSegmentAddressSet = false; for (unsigned i = 0; ; ++i) { if (Command.C.cmd == MachO::LC_FUNCTION_STARTS) { diff --git a/tools/llvm-objdump/llvm-objdump.cpp b/tools/llvm-objdump/llvm-objdump.cpp index 3e16ca0b327..7fa01f7633e 100644 --- a/tools/llvm-objdump/llvm-objdump.cpp +++ b/tools/llvm-objdump/llvm-objdump.cpp @@ -385,28 +385,26 @@ static void DisassembleObject(const ObjectFile *Obj, bool InlineRelocs) { // Create a mapping, RelocSecs = SectionRelocMap[S], where sections // in RelocSecs contain the relocations for section S. error_code EC; - std::map > SectionRelocMap; - for (section_iterator I = Obj->section_begin(), E = Obj->section_end(); - I != E; ++I) { - section_iterator Sec2 = I->getRelocatedSection(); + std::map> SectionRelocMap; + for (const SectionRef &Section : Obj->sections()) { + section_iterator Sec2 = Section.getRelocatedSection(); if (Sec2 != Obj->section_end()) - SectionRelocMap[*Sec2].push_back(*I); + SectionRelocMap[*Sec2].push_back(Section); } - for (section_iterator I = Obj->section_begin(), E = Obj->section_end(); - I != E; ++I) { + for (const SectionRef &Section : Obj->sections()) { bool Text; - if (error(I->isText(Text))) + if (error(Section.isText(Text))) break; if (!Text) continue; uint64_t SectionAddr; - if (error(I->getAddress(SectionAddr))) + if (error(Section.getAddress(SectionAddr))) break; uint64_t SectSize; - if (error(I->getSize(SectSize))) + if (error(Section.getSize(SectSize))) break; // Make a list of all the symbols in this section. @@ -414,7 +412,7 @@ static void DisassembleObject(const ObjectFile *Obj, bool InlineRelocs) { for (symbol_iterator SI = Obj->symbol_begin(), SE = Obj->symbol_end(); SI != SE; ++SI) { bool contains; - if (!error(I->containsSymbol(*SI, contains)) && contains) { + if (!error(Section.containsSymbol(*SI, contains)) && contains) { uint64_t Address; if (error(SI->getAddress(Address))) break; @@ -437,7 +435,7 @@ static void DisassembleObject(const ObjectFile *Obj, bool InlineRelocs) { // Make a list of all the relocations for this section. std::vector Rels; if (InlineRelocs) { - SmallVectorImpl *RelocSecs = &SectionRelocMap[*I]; + SmallVectorImpl *RelocSecs = &SectionRelocMap[Section]; for (SmallVectorImpl::iterator RelocSec = RelocSecs->begin(), E = RelocSecs->end(); RelocSec != E; ++RelocSec) { @@ -453,11 +451,11 @@ static void DisassembleObject(const ObjectFile *Obj, bool InlineRelocs) { StringRef SegmentName = ""; if (const MachOObjectFile *MachO = dyn_cast(Obj)) { - DataRefImpl DR = I->getRawDataRefImpl(); + DataRefImpl DR = Section.getRawDataRefImpl(); SegmentName = MachO->getSectionFinalSegmentName(DR); } StringRef name; - if (error(I->getName(name))) + if (error(Section.getName(name))) break; outs() << "Disassembly of section "; if (!SegmentName.empty()) @@ -474,7 +472,7 @@ static void DisassembleObject(const ObjectFile *Obj, bool InlineRelocs) { raw_svector_ostream CommentStream(Comments); StringRef Bytes; - if (error(I->getContents(Bytes))) + if (error(Section.getContents(Bytes))) break; StringRefMemoryObject memoryObject(Bytes, SectionAddr); uint64_t Size; @@ -554,16 +552,16 @@ static void DisassembleObject(const ObjectFile *Obj, bool InlineRelocs) { } } -static void PrintRelocations(const ObjectFile *o) { - for (section_iterator si = o->section_begin(), se = o->section_end(); - si != se; ++si) { - if (si->relocation_begin() == si->relocation_end()) +static void PrintRelocations(const ObjectFile *Obj) { + for (const SectionRef &Section : Obj->sections()) { + if (Section.relocation_begin() == Section.relocation_end()) continue; StringRef secname; - if (error(si->getName(secname))) continue; + if (error(Section.getName(secname))) + continue; outs() << "RELOCATION RECORDS FOR [" << secname << "]:\n"; - for (relocation_iterator ri = si->relocation_begin(), - re = si->relocation_end(); + for (relocation_iterator ri = Section.relocation_begin(), + re = Section.relocation_end(); ri != re; ++ri) { bool hidden; uint64_t address; @@ -580,43 +578,50 @@ static void PrintRelocations(const ObjectFile *o) { } } -static void PrintSectionHeaders(const ObjectFile *o) { +static void PrintSectionHeaders(const ObjectFile *Obj) { outs() << "Sections:\n" "Idx Name Size Address Type\n"; unsigned i = 0; - for (section_iterator si = o->section_begin(), se = o->section_end(); - si != se; ++si) { + for (const SectionRef &Section : Obj->sections()) { StringRef Name; - if (error(si->getName(Name))) + if (error(Section.getName(Name))) return; uint64_t Address; - if (error(si->getAddress(Address))) return; + if (error(Section.getAddress(Address))) + return; uint64_t Size; - if (error(si->getSize(Size))) return; + if (error(Section.getSize(Size))) + return; bool Text, Data, BSS; - if (error(si->isText(Text))) return; - if (error(si->isData(Data))) return; - if (error(si->isBSS(BSS))) return; + if (error(Section.isText(Text))) + return; + if (error(Section.isData(Data))) + return; + if (error(Section.isBSS(BSS))) + return; std::string Type = (std::string(Text ? "TEXT " : "") + (Data ? "DATA " : "") + (BSS ? "BSS" : "")); - outs() << format("%3d %-13s %08" PRIx64 " %016" PRIx64 " %s\n", - i, Name.str().c_str(), Size, Address, Type.c_str()); + outs() << format("%3d %-13s %08" PRIx64 " %016" PRIx64 " %s\n", i, + Name.str().c_str(), Size, Address, Type.c_str()); ++i; } } -static void PrintSectionContents(const ObjectFile *o) { +static void PrintSectionContents(const ObjectFile *Obj) { error_code EC; - for (section_iterator si = o->section_begin(), se = o->section_end(); - si != se; ++si) { + for (const SectionRef &Section : Obj->sections()) { StringRef Name; StringRef Contents; uint64_t BaseAddr; bool BSS; - if (error(si->getName(Name))) continue; - if (error(si->getContents(Contents))) continue; - if (error(si->getAddress(BaseAddr))) continue; - if (error(si->isBSS(BSS))) continue; + if (error(Section.getName(Name))) + continue; + if (error(Section.getContents(Contents))) + continue; + if (error(Section.getAddress(BaseAddr))) + continue; + if (error(Section.isBSS(BSS))) + continue; outs() << "Contents of section " << Name << ":\n"; if (BSS) { diff --git a/tools/llvm-readobj/MachODumper.cpp b/tools/llvm-readobj/MachODumper.cpp index 0d6bba64215..79a04c81a6f 100644 --- a/tools/llvm-readobj/MachODumper.cpp +++ b/tools/llvm-readobj/MachODumper.cpp @@ -40,10 +40,9 @@ public: private: void printSymbol(symbol_iterator SymI); - void printRelocation(section_iterator SecI, relocation_iterator RelI); + void printRelocation(relocation_iterator RelI); - void printRelocation(const MachOObjectFile *Obj, - section_iterator SecI, relocation_iterator RelI); + void printRelocation(const MachOObjectFile *Obj, relocation_iterator RelI); void printSections(const MachOObjectFile *Obj); @@ -216,18 +215,16 @@ void MachODumper::printSections(const MachOObjectFile *Obj) { ListScope Group(W, "Sections"); int SectionIndex = -1; - for (section_iterator SecI = Obj->section_begin(), - SecE = Obj->section_end(); - SecI != SecE; ++SecI) { + for (const SectionRef &Section : Obj->sections()) { ++SectionIndex; - MachOSection Section; - getSection(Obj, SecI->getRawDataRefImpl(), Section); - DataRefImpl DR = SecI->getRawDataRefImpl(); + MachOSection MOSection; + getSection(Obj, Section.getRawDataRefImpl(), MOSection); + DataRefImpl DR = Section.getRawDataRefImpl(); StringRef Name; - if (error(SecI->getName(Name))) - Name = ""; + if (error(Section.getName(Name))) + Name = ""; ArrayRef RawName = Obj->getSectionRawName(DR); StringRef SegmentName = Obj->getSectionFinalSegmentName(DR); @@ -237,34 +234,33 @@ void MachODumper::printSections(const MachOObjectFile *Obj) { W.printNumber("Index", SectionIndex); W.printBinary("Name", Name, RawName); W.printBinary("Segment", SegmentName, RawSegmentName); - W.printHex ("Address", Section.Address); - W.printHex ("Size", Section.Size); - W.printNumber("Offset", Section.Offset); - W.printNumber("Alignment", Section.Alignment); - W.printHex ("RelocationOffset", Section.RelocationTableOffset); - W.printNumber("RelocationCount", Section.NumRelocationTableEntries); - W.printEnum ("Type", Section.Flags & 0xFF, - makeArrayRef(MachOSectionAttributes)); - W.printFlags ("Attributes", Section.Flags >> 8, - makeArrayRef(MachOSectionAttributes)); - W.printHex ("Reserved1", Section.Reserved1); - W.printHex ("Reserved2", Section.Reserved2); + W.printHex("Address", MOSection.Address); + W.printHex("Size", MOSection.Size); + W.printNumber("Offset", MOSection.Offset); + W.printNumber("Alignment", MOSection.Alignment); + W.printHex("RelocationOffset", MOSection.RelocationTableOffset); + W.printNumber("RelocationCount", MOSection.NumRelocationTableEntries); + W.printEnum("Type", MOSection.Flags & 0xFF, + makeArrayRef(MachOSectionAttributes)); + W.printFlags("Attributes", MOSection.Flags >> 8, + makeArrayRef(MachOSectionAttributes)); + W.printHex("Reserved1", MOSection.Reserved1); + W.printHex("Reserved2", MOSection.Reserved2); if (opts::SectionRelocations) { ListScope D(W, "Relocations"); - for (relocation_iterator RelI = SecI->relocation_begin(), - RelE = SecI->relocation_end(); + for (relocation_iterator RelI = Section.relocation_begin(), + RelE = Section.relocation_end(); RelI != RelE; ++RelI) - printRelocation(SecI, RelI); + printRelocation(RelI); } if (opts::SectionSymbols) { ListScope D(W, "Symbols"); - for (symbol_iterator SymI = Obj->symbol_begin(), - SymE = Obj->symbol_end(); + for (symbol_iterator SymI = Obj->symbol_begin(), SymE = Obj->symbol_end(); SymI != SymE; ++SymI) { bool Contained = false; - if (SecI->containsSymbol(*SymI, Contained) || !Contained) + if (Section.containsSymbol(*SymI, Contained) || !Contained) continue; printSymbol(SymI); @@ -273,7 +269,8 @@ void MachODumper::printSections(const MachOObjectFile *Obj) { if (opts::SectionData) { StringRef Data; - if (error(SecI->getContents(Data))) break; + if (error(Section.getContents(Data))) + break; W.printBinaryBlock("SectionData", Data); } @@ -284,16 +281,14 @@ void MachODumper::printRelocations() { ListScope D(W, "Relocations"); error_code EC; - for (section_iterator SecI = Obj->section_begin(), - SecE = Obj->section_end(); - SecI != SecE; ++SecI) { + for (const SectionRef &Section : Obj->sections()) { StringRef Name; - if (error(SecI->getName(Name))) + if (error(Section.getName(Name))) continue; bool PrintedGroup = false; - for (relocation_iterator RelI = SecI->relocation_begin(), - RelE = SecI->relocation_end(); + for (relocation_iterator RelI = Section.relocation_begin(), + RelE = Section.relocation_end(); RelI != RelE; ++RelI) { if (!PrintedGroup) { W.startLine() << "Section " << Name << " {\n"; @@ -301,7 +296,7 @@ void MachODumper::printRelocations() { PrintedGroup = true; } - printRelocation(SecI, RelI); + printRelocation(RelI); } if (PrintedGroup) { @@ -311,13 +306,11 @@ void MachODumper::printRelocations() { } } -void MachODumper::printRelocation(section_iterator SecI, - relocation_iterator RelI) { - return printRelocation(Obj, SecI, RelI); +void MachODumper::printRelocation(relocation_iterator RelI) { + return printRelocation(Obj, RelI); } void MachODumper::printRelocation(const MachOObjectFile *Obj, - section_iterator SecI, relocation_iterator RelI) { uint64_t Offset; SmallString<32> RelocName; diff --git a/tools/llvm-size/llvm-size.cpp b/tools/llvm-size/llvm-size.cpp index 89528dc8b4e..d1bd45a36b8 100644 --- a/tools/llvm-size/llvm-size.cpp +++ b/tools/llvm-size/llvm-size.cpp @@ -85,10 +85,10 @@ static size_t getNumLengthAsString(uint64_t num) { return result.size(); } -/// @brief Print the size of each section in @p o. +/// @brief Print the size of each section in @p Obj. /// /// The format used is determined by @c OutputFormat and @c Radix. -static void PrintObjectSectionSizes(ObjectFile *o) { +static void PrintObjectSectionSizes(ObjectFile *Obj) { uint64_t total = 0; std::string fmtbuf; raw_string_ostream fmt(fmtbuf); @@ -111,17 +111,18 @@ static void PrintObjectSectionSizes(ObjectFile *o) { std::size_t max_name_len = strlen("section"); std::size_t max_size_len = strlen("size"); std::size_t max_addr_len = strlen("addr"); - for (section_iterator i = o->section_begin(), e = o->section_end(); - i != e; ++i) { + for (const SectionRef &Section : Obj->sections()) { uint64_t size = 0; - if (error(i->getSize(size))) + if (error(Section.getSize(size))) return; total += size; StringRef name; uint64_t addr = 0; - if (error(i->getName(name))) return; - if (error(i->getAddress(addr))) return; + if (error(Section.getName(name))) + return; + if (error(Section.getAddress(addr))) + return; max_name_len = std::max(max_name_len, name.size()); max_size_len = std::max(max_size_len, getNumLengthAsString(size)); max_addr_len = std::max(max_addr_len, getNumLengthAsString(addr)); @@ -150,20 +151,19 @@ static void PrintObjectSectionSizes(ObjectFile *o) { << "%#" << max_addr_len << radix_fmt << "\n"; // Print each section. - for (section_iterator i = o->section_begin(), e = o->section_end(); - i != e; ++i) { + for (const SectionRef &Section : Obj->sections()) { StringRef name; uint64_t size = 0; uint64_t addr = 0; - if (error(i->getName(name))) return; - if (error(i->getSize(size))) return; - if (error(i->getAddress(addr))) return; + if (error(Section.getName(name))) + return; + if (error(Section.getSize(size))) + return; + if (error(Section.getAddress(addr))) + return; std::string namestr = name; - outs() << format(fmt.str().c_str(), - namestr.c_str(), - size, - addr); + outs() << format(fmt.str().c_str(), namestr.c_str(), size, addr); } // Print total. @@ -181,16 +181,19 @@ static void PrintObjectSectionSizes(ObjectFile *o) { uint64_t total_bss = 0; // Make one pass over the section table to calculate sizes. - for (section_iterator i = o->section_begin(), e = o->section_end(); - i != e; ++i) { + for (const SectionRef &Section : Obj->sections()) { uint64_t size = 0; bool isText = false; bool isData = false; bool isBSS = false; - if (error(i->getSize(size))) return; - if (error(i->isText(isText))) return; - if (error(i->isData(isData))) return; - if (error(i->isBSS(isBSS))) return; + if (error(Section.getSize(size))) + return; + if (error(Section.isText(isText))) + return; + if (error(Section.isData(isData))) + return; + if (error(Section.isBSS(isBSS))) + return; if (isText) total_text += size; else if (isData) diff --git a/tools/llvm-symbolizer/LLVMSymbolize.cpp b/tools/llvm-symbolizer/LLVMSymbolize.cpp index 31b6c68c8ae..c1a0654e87f 100644 --- a/tools/llvm-symbolizer/LLVMSymbolize.cpp +++ b/tools/llvm-symbolizer/LLVMSymbolize.cpp @@ -279,14 +279,13 @@ static bool getGNUDebuglinkContents(const Binary *Bin, std::string &DebugName, const ObjectFile *Obj = dyn_cast(Bin); if (!Obj) return false; - for (section_iterator I = Obj->section_begin(), E = Obj->section_end(); - I != E; ++I) { + for (const SectionRef &Section : Obj->sections()) { StringRef Name; - I->getName(Name); + Section.getName(Name); Name = Name.substr(Name.find_first_not_of("._")); if (Name == "gnu_debuglink") { StringRef Data; - I->getContents(Data); + Section.getContents(Data); DataExtractor DE(Data, Obj->isLittleEndian(), 0); uint32_t Offset = 0; if (const char *DebugNameStr = DE.getCStr(&Offset)) {