From 0377a22491ed19ba2d9a6fc0ed34c901a3f56faa Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Mon, 20 Jul 2015 21:45:56 +0000 Subject: [PATCH] Simplify now that we can iterate backwards. NFC. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@242715 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Object/ELF.h | 24 +++++------------------- tools/llvm-readobj/ELFDumper.cpp | 19 ++++++++++++++++--- 2 files changed, 21 insertions(+), 22 deletions(-) diff --git a/include/llvm/Object/ELF.h b/include/llvm/Object/ELF.h index 82fc19bc626..eed9bdd69e9 100644 --- a/include/llvm/Object/ELF.h +++ b/include/llvm/Object/ELF.h @@ -282,11 +282,9 @@ public: } const Elf_Dyn *dynamic_table_begin() const; - /// \param NULLEnd use one past the first DT_NULL entry as the end instead of - /// the section size. - const Elf_Dyn *dynamic_table_end(bool NULLEnd = false) const; - Elf_Dyn_Range dynamic_table(bool NULLEnd = false) const { - return make_range(dynamic_table_begin(), dynamic_table_end(NULLEnd)); + const Elf_Dyn *dynamic_table_end() const; + Elf_Dyn_Range dynamic_table() const { + return make_range(dynamic_table_begin(), dynamic_table_end()); } const Elf_Sym *dynamic_symbol_begin() const { @@ -818,24 +816,12 @@ ELFFile::dynamic_table_begin() const { template const typename ELFFile::Elf_Dyn * -ELFFile::dynamic_table_end(bool NULLEnd) const { +ELFFile::dynamic_table_end() const { uint64_t Size = DynamicRegion.Size; if (Size % sizeof(Elf_Dyn)) report_fatal_error("Invalid dynamic table size"); - const Elf_Dyn *Ret = dynamic_table_begin() + Size / sizeof(Elf_Dyn); - - if (NULLEnd) { - const Elf_Dyn *Start = dynamic_table_begin(); - while (Start != Ret && Start->getTag() != ELF::DT_NULL) - ++Start; - - // Include the DT_NULL. - if (Start != Ret) - ++Start; - Ret = Start; - } - return Ret; + return dynamic_table_begin() + Size / sizeof(Elf_Dyn); } template diff --git a/tools/llvm-readobj/ELFDumper.cpp b/tools/llvm-readobj/ELFDumper.cpp index df85e7631f7..a03b6174a14 100644 --- a/tools/llvm-readobj/ELFDumper.cpp +++ b/tools/llvm-readobj/ELFDumper.cpp @@ -1052,9 +1052,20 @@ template <> void ELFDumper>::printUnwindInfo() { template void ELFDumper::printDynamicTable() { - auto DynTable = Obj->dynamic_table(true); + auto I = Obj->dynamic_table_begin(); + auto E = Obj->dynamic_table_end(); - ptrdiff_t Total = std::distance(DynTable.begin(), DynTable.end()); + if (I == E) + return; + + --E; + while (I != E && E->getTag() == ELF::DT_NULL) + --E; + if (E->getTag() != ELF::DT_NULL) + ++E; + ++E; + + ptrdiff_t Total = std::distance(I, E); if (Total == 0) return; @@ -1066,7 +1077,9 @@ void ELFDumper::printDynamicTable() { W.startLine() << " Tag" << (Is64 ? " " : " ") << "Type" << " " << "Name/Value\n"; - for (const auto &Entry : DynTable) { + while (I != E) { + const typename ELFO::Elf_Dyn &Entry = *I; + ++I; W.startLine() << " " << format(Is64 ? "0x%016" PRIX64 : "0x%08" PRIX64, Entry.getTag()) -- 2.34.1