summaryrefslogtreecommitdiffstats
path: root/llvm/tools/llvm-readobj/ELFDumper.cpp
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2015-08-07 15:25:20 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2015-08-07 15:25:20 +0000
commite01f43bcc1d25c29d1b9e0e05930e5c1b27ec6eb (patch)
treed75f7e94e02483e46641602a54be5dbbfb4273e9 /llvm/tools/llvm-readobj/ELFDumper.cpp
parenta5e1453ac3cd622fe0431d2a1f4477a83843139e (diff)
downloadbcm5719-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.cpp37
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();
OpenPOWER on IntegriCloud