diff options
author | Rafael Espindola <rafael.espindola@gmail.com> | 2015-08-07 15:25:20 +0000 |
---|---|---|
committer | Rafael Espindola <rafael.espindola@gmail.com> | 2015-08-07 15:25:20 +0000 |
commit | e01f43bcc1d25c29d1b9e0e05930e5c1b27ec6eb (patch) | |
tree | d75f7e94e02483e46641602a54be5dbbfb4273e9 /llvm/tools/llvm-readobj/ELFDumper.cpp | |
parent | a5e1453ac3cd622fe0431d2a1f4477a83843139e (diff) | |
download | bcm5719-llvm-e01f43bcc1d25c29d1b9e0e05930e5c1b27ec6eb.tar.gz bcm5719-llvm-e01f43bcc1d25c29d1b9e0e05930e5c1b27ec6eb.zip |
Add dynamic_table iterators back to ELF.h.
In tree they are only used by llvm-readobj, but it is also used by
https://github.com/mono/CppSharp.
While at it, add some missing error checking.
llvm-svn: 244320
Diffstat (limited to 'llvm/tools/llvm-readobj/ELFDumper.cpp')
-rw-r--r-- | llvm/tools/llvm-readobj/ELFDumper.cpp | 37 |
1 files changed, 15 insertions, 22 deletions
diff --git a/llvm/tools/llvm-readobj/ELFDumper.cpp b/llvm/tools/llvm-readobj/ELFDumper.cpp index 916cb2acfb9..5887d2944d1 100644 --- a/llvm/tools/llvm-readobj/ELFDumper.cpp +++ b/llvm/tools/llvm-readobj/ELFDumper.cpp @@ -104,10 +104,20 @@ private: const Elf_Rela *dyn_rela_end() const; Elf_Rela_Range dyn_relas() const; StringRef getDynamicString(uint64_t Offset) const; - const Elf_Dyn *dynamic_table_begin() const; - const Elf_Dyn *dynamic_table_end() const; + const Elf_Dyn *dynamic_table_begin() const { + ErrorOr<const Elf_Dyn *> Ret = Obj->dynamic_table_begin(DynamicProgHeader); + error(Ret.getError()); + return *Ret; + } + const Elf_Dyn *dynamic_table_end() const { + ErrorOr<const Elf_Dyn *> Ret = Obj->dynamic_table_end(DynamicProgHeader); + error(Ret.getError()); + return *Ret; + } Elf_Dyn_Range dynamic_table() const { - return make_range(dynamic_table_begin(), dynamic_table_end()); + ErrorOr<Elf_Dyn_Range> Ret = Obj->dynamic_table(DynamicProgHeader); + error(Ret.getError()); + return *Ret; } StringRef getSymbolVersion(StringRef StrTab, const Elf_Sym *symb, @@ -118,7 +128,7 @@ private: const ELFO *Obj; DynRegionInfo DynRelaRegion; - DynRegionInfo DynamicRegion; + const Elf_Phdr *DynamicProgHeader = nullptr; StringRef DynamicStringTable; const Elf_Sym *DynSymStart = nullptr; StringRef SOName; @@ -798,11 +808,7 @@ ELFDumper<ELFT>::ELFDumper(const ELFFile<ELFT> *Obj, StreamWriter &Writer) SmallVector<const Elf_Phdr *, 4> LoadSegments; for (const Elf_Phdr &Phdr : Obj->program_headers()) { if (Phdr.p_type == ELF::PT_DYNAMIC) { - DynamicRegion.Addr = Obj->base() + Phdr.p_offset; - uint64_t Size = Phdr.p_filesz; - if (Size % sizeof(Elf_Dyn)) - report_fatal_error("Invalid dynamic table size"); - DynamicRegion.Size = Phdr.p_filesz; + DynamicProgHeader = &Phdr; continue; } if (Phdr.p_type != ELF::PT_LOAD || Phdr.p_filesz == 0) @@ -904,19 +910,6 @@ typename ELFDumper<ELFT>::Elf_Rela_Range ELFDumper<ELFT>::dyn_relas() const { return make_range(dyn_rela_begin(), dyn_rela_end()); } -template <typename ELFT> -const typename ELFDumper<ELFT>::Elf_Dyn * -ELFDumper<ELFT>::dynamic_table_begin() const { - return reinterpret_cast<const Elf_Dyn *>(DynamicRegion.Addr); -} - -template <typename ELFT> -const typename ELFDumper<ELFT>::Elf_Dyn * -ELFDumper<ELFT>::dynamic_table_end() const { - uint64_t Size = DynamicRegion.Size; - return dynamic_table_begin() + Size / sizeof(Elf_Dyn); -} - template<class ELFT> void ELFDumper<ELFT>::printFileHeaders() { const Elf_Ehdr *Header = Obj->getHeader(); |