Skip to content

Commit

Permalink
Object: Add ELF types to ELFType.
Browse files Browse the repository at this point in the history
These types are defined in ELFFile, so in order to use them, you have
to write ELFFile<ELFT>::SomeType. But there seems to be no reason to have
ELFFile have these types. This patch allows you to write ELFT::SomeType
instead.

This simplifies libObject users.
This is an example: http://reviews.llvm.org/D18129

http://reviews.llvm.org/D18130

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@263504 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
rui314 committed Mar 14, 2016
1 parent b489144 commit 926f5fc
Showing 1 changed file with 49 additions and 6 deletions.
55 changes: 49 additions & 6 deletions include/llvm/Object/ELFTypes.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,55 @@ namespace object {

using support::endianness;

template <endianness target_endianness, bool is64Bits> struct ELFType {
static const endianness TargetEndianness = target_endianness;
static const bool Is64Bits = is64Bits;
template <class ELFT> struct Elf_Ehdr_Impl;
template <class ELFT> struct Elf_Shdr_Impl;
template <class ELFT> struct Elf_Sym_Impl;
template <class ELFT> struct Elf_Dyn_Impl;
template <class ELFT> struct Elf_Phdr_Impl;
template <class ELFT, bool isRela> struct Elf_Rel_Impl;
template <class ELFT> struct Elf_Verdef_Impl;
template <class ELFT> struct Elf_Verdaux_Impl;
template <class ELFT> struct Elf_Verneed_Impl;
template <class ELFT> struct Elf_Vernaux_Impl;
template <class ELFT> struct Elf_Versym_Impl;
template <class ELFT> struct Elf_Hash_Impl;
template <class ELFT> struct Elf_GnuHash_Impl;

template <endianness E, bool Is64> struct ELFType {
private:
template <typename Ty>
using packed = support::detail::packed_endian_specific_integral<Ty, E, 2>;

public:
static const endianness TargetEndianness = E;
static const bool Is64Bits = Is64;

typedef typename std::conditional<Is64, uint64_t, uint32_t>::type uint;
typedef Elf_Ehdr_Impl<ELFType<E, Is64>> Ehdr;
typedef Elf_Shdr_Impl<ELFType<E, Is64>> Shdr;
typedef Elf_Sym_Impl<ELFType<E, Is64>> Sym;
typedef Elf_Dyn_Impl<ELFType<E, Is64>> Dyn;
typedef Elf_Phdr_Impl<ELFType<E, Is64>> Phdr;
typedef Elf_Rel_Impl<ELFType<E, Is64>, false> Rel;
typedef Elf_Rel_Impl<ELFType<E, Is64>, true> Rela;
typedef Elf_Verdef_Impl<ELFType<E, Is64>> Verdef;
typedef Elf_Verdaux_Impl<ELFType<E, Is64>> Verdaux;
typedef Elf_Verneed_Impl<ELFType<E, Is64>> Verneed;
typedef Elf_Vernaux_Impl<ELFType<E, Is64>> Vernaux;
typedef Elf_Versym_Impl<ELFType<E, Is64>> Versym;
typedef Elf_Hash_Impl<ELFType<E, Is64>> Hash;
typedef Elf_GnuHash_Impl<ELFType<E, Is64>> GnuHash;
typedef iterator_range<const Dyn *> DynRange;
typedef iterator_range<const Shdr *> ShdrRange;
typedef iterator_range<const Sym *> SymRange;

typedef packed<uint16_t> Half;
typedef packed<uint32_t> Word;
typedef packed<int32_t> Sword;
typedef packed<uint64_t> Xword;
typedef packed<int64_t> Sxword;
typedef packed<uint> Addr;
typedef packed<uint> Off;
};

typedef ELFType<support::little, false> ELF32LE;
Expand Down Expand Up @@ -320,9 +366,6 @@ struct Elf_Dyn_Impl : Elf_Dyn_Base<ELFT> {
uintX_t getPtr() const { return d_un.d_ptr; }
};

// Elf_Rel: Elf Relocation
template <class ELFT, bool isRela> struct Elf_Rel_Impl;

template <endianness TargetEndianness>
struct Elf_Rel_Impl<ELFType<TargetEndianness, false>, false> {
LLVM_ELF_IMPORT_TYPES(TargetEndianness, false)
Expand Down

0 comments on commit 926f5fc

Please sign in to comment.