From 2352c1884e434cb636d672d63b640b1dd4bdc50c Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Tue, 16 Feb 2016 14:50:39 +0000 Subject: [PATCH] Introduce a getAsRange helper. This requires making an error message a bit more generic, but that seems a reasonable tradeoff. Extracted from r260488 but simplified a bit. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@260967 91177308-0d34-0410-b5e6-96231b3b80d8 --- test/Object/corrupt.test | 2 +- tools/llvm-readobj/ELFDumper.cpp | 34 +++++++++----------------------- 2 files changed, 10 insertions(+), 26 deletions(-) diff --git a/test/Object/corrupt.test b/test/Object/corrupt.test index 0d9aad378f8..7208566c25b 100644 --- a/test/Object/corrupt.test +++ b/test/Object/corrupt.test @@ -49,7 +49,7 @@ RUN: not llvm-readobj -dyn-relocations \ RUN: %p/Inputs/corrupt-invalid-relocation-size.elf.x86-64 2>&1 | \ RUN: FileCheck --check-prefix=RELOC %s -RELOC: Invalid relocation entry size +RELOC: Invalid entity size RUN: not llvm-readobj -dyn-relocations \ RUN: %p/Inputs/corrupt-invalid-dynamic-table-size.elf.x86-64 2>&1 | \ diff --git a/tools/llvm-readobj/ELFDumper.cpp b/tools/llvm-readobj/ELFDumper.cpp index cd221e39747..b8c815e4b35 100644 --- a/tools/llvm-readobj/ELFDumper.cpp +++ b/tools/llvm-readobj/ELFDumper.cpp @@ -57,6 +57,13 @@ struct DynRegionInfo { uint64_t Size; /// \brief Size of each entity in the region. uint64_t EntSize; + + template iterator_range getAsRange() const { + const Type *Start = reinterpret_cast(Addr); + if (EntSize != sizeof(Type) || Size % EntSize) + reportError("Invalid entity size"); + return {Start, Start + (Size / EntSize)}; + } }; template @@ -123,10 +130,6 @@ private: void printRelocation(Elf_Rela Rel, const Elf_Shdr *SymTab); void printValue(uint64_t Type, uint64_t Value); - template - static const REL *dyn_rel_begin(const DynRegionInfo ®ion); - template - static const REL *dyn_rel_end(const DynRegionInfo ®ion); Elf_Rel_Range dyn_rels() const; Elf_Rela_Range dyn_relas() const; StringRef getDynamicString(uint64_t Offset) const; @@ -1110,33 +1113,14 @@ void ELFDumper::parseDynamicTable( SOName = getDynamicString(SONameOffset); } -template -template -const REL *ELFDumper::dyn_rel_begin(const DynRegionInfo &Region) { - if (Region.Size && Region.EntSize != sizeof(REL)) - report_fatal_error("Invalid relocation entry size"); - return reinterpret_cast(Region.Addr); -} - -template -template -const REL *ELFDumper::dyn_rel_end(const DynRegionInfo &Region) { - uint64_t Size = Region.Size; - if (Size % sizeof(REL)) - report_fatal_error("Invalid relocation table size"); - return dyn_rel_begin(Region) + Size / sizeof(REL); -} - template typename ELFDumper::Elf_Rel_Range ELFDumper::dyn_rels() const { - return make_range(dyn_rel_begin(DynRelRegion), - dyn_rel_end(DynRelRegion)); + return DynRelRegion.getAsRange(); } template typename ELFDumper::Elf_Rela_Range ELFDumper::dyn_relas() const { - return make_range(dyn_rel_begin(DynRelaRegion), - dyn_rel_end(DynRelaRegion)); + return DynRelaRegion.getAsRange(); } template