HomePhabricator

[llvm-readobj/elf] - Simplify and refine the implementation which dumps .

Authored by grimar on Sat, Sep 5, 9:13 AM.

Description

[llvm-readobj/elf] - Simplify and refine the implementation which dumps .stack_sizes

Our implementation of stack sizes section dumping heavily uses ELFObjectFile<ELFT>,
while the rest of the code uses ELFFile<ELFT>.

That APIs are very different. ELFObjectFile<ELFT> is very generic
and has SectionRef, RelocationRef, SymbolRef and other generic concepts.
The ELFFile<ELFT> class works directly with Elf_Shdr, Elf_Rel[a], Elf_Sym etc,
what is probably much cleaner for ELF dumper.

Also, ELFObjectFile<ELFT> API does not always provide a way to check
for possible errors. E.g. the implementation of symbol_end() does not verify the sh_size:

template <class ELFT>
basic_symbol_iterator ELFObjectFile<ELFT>::symbol_end() const {
  const Elf_Shdr *SymTab = DotSymtabSec;
  if (!SymTab)
    return symbol_begin();
  DataRefImpl Sym = toDRI(SymTab, SymTab->sh_size / sizeof(Elf_Sym));
  return basic_symbol_iterator(SymbolRef(Sym, this));
}

There are many other examples which makes me thing we might win from
switching to ELFFile<ELFT> API, where we heavily validate an input data already.

This patch is the first step in this direction. I've converted the large portion of the code
to use ELFFile<ELFT>.

Differential revision: https://reviews.llvm.org/D87362