10 #ifndef LLVM_OBJECT_ELF_TYPES_H
11 #define LLVM_OBJECT_ELF_TYPES_H
14 #include "llvm/Support/DataTypes.h"
23 template <
endianness target_endianness, std::size_t max_alignment,
38 template <endianness target_endianness, std::
size_t max_alignment>
41 uint16_t, target_endianness,
44 uint32_t, target_endianness,
47 int32_t, target_endianness,
50 uint64_t, target_endianness,
53 int64_t, target_endianness,
60 template <endianness TargetEndianness, std::
size_t MaxAlign>
73 template <endianness TargetEndianness, std::
size_t MaxAlign>
86 #define LLVM_ELF_IMPORT_TYPES(E, M, W) \
87 typedef typename ELFDataTypeTypedefHelper<ELFType<E, M, W> >::Elf_Addr \
89 typedef typename ELFDataTypeTypedefHelper<ELFType<E, M, W> >::Elf_Off \
91 typedef typename ELFDataTypeTypedefHelper<ELFType<E, M, W> >::Elf_Half \
93 typedef typename ELFDataTypeTypedefHelper<ELFType<E, M, W> >::Elf_Word \
95 typedef typename ELFDataTypeTypedefHelper<ELFType<E, M, W> >::Elf_Sword \
97 typedef typename ELFDataTypeTypedefHelper<ELFType<E, M, W> >::Elf_Xword \
99 typedef typename ELFDataTypeTypedefHelper<ELFType<E, M, W> >::Elf_Sxword \
102 #define LLVM_ELF_IMPORT_TYPES_ELFT(ELFT) \
103 LLVM_ELF_IMPORT_TYPES(ELFT::TargetEndianness, ELFT::MaxAlignment, \
109 template <endianness TargetEndianness, std::
size_t MaxAlign>
120 Elf_Word sh_addralign;
124 template <
endianness TargetEndianness, std::
size_t MaxAlign>
135 Elf_Xword sh_addralign;
136 Elf_Xword sh_entsize;
139 template <class ELFT>
148 return sh_size / sh_entsize;
154 template <endianness TargetEndianness, std::
size_t MaxAlign>
160 unsigned char st_info;
161 unsigned char st_other;
165 template <
endianness TargetEndianness, std::
size_t MaxAlign>
169 unsigned char st_info;
170 unsigned char st_other;
176 template <class ELFT>
183 unsigned char getType()
const {
return st_info & 0x0f; }
185 void setType(
unsigned char t) { setBindingAndType(getBinding(), t); }
187 st_info = (b << 4) + (t & 0x0f);
193 template <
class ELFT>
203 template <class ELFT>
216 const Elf_Verdaux *getAux()
const {
217 return reinterpret_cast<const Elf_Verdaux *
>((
const char *)
this + vd_aux);
223 template <
class ELFT>
232 template <class ELFT>
244 template <class ELFT>
258 template <
endianness TargetEndianness, std::
size_t MaxAlign>
268 template <endianness TargetEndianness, std::
size_t MaxAlign>
279 template <
class ELFT>
284 uint64_t
getVal()
const {
return d_un.d_val; }
285 uint64_t
getPtr()
const {
return d_un.ptr; }
291 template <endianness TargetEndianness, std::
size_t MaxAlign>
297 uint32_t getRInfo(
bool isMips64EL)
const {
304 template <endianness TargetEndianness, std::
size_t MaxAlign>
310 uint64_t getRInfo(
bool isMips64EL)
const {
317 return (t << 32) | ((t >> 8) & 0xff000000) | ((t >> 24) & 0x00ff0000) |
318 ((t >> 40) & 0x0000ff00) | ((t >> 56) & 0x000000ff);
326 template <endianness TargetEndianness, std::
size_t MaxAlign>
333 uint32_t getRInfo(
bool isMips64EL)
const {
340 template <endianness TargetEndianness, std::
size_t MaxAlign>
347 uint64_t getRInfo(
bool isMips64EL)
const {
354 return (t << 32) | ((t >> 8) & 0xff000000) | ((t >> 24) & 0x00ff0000) |
355 ((t >> 40) & 0x0000ff00) | ((t >> 56) & 0x000000ff);
365 template <endianness TargetEndianness, std::
size_t MaxAlign,
bool isRela>
368 ELFType<TargetEndianness, MaxAlign, true>, isRela> {
373 uint32_t getSymbol(
bool isMips64EL)
const {
374 return (uint32_t)(this->getRInfo(isMips64EL) >> 32);
377 return (uint32_t)(this->getRInfo(isMips64EL) & 0xffffffffL);
380 void setType(uint32_t t) { setSymbolAndType(getSymbol(), t); }
382 this->setRInfo(((uint64_t)s << 32) + (t & 0xffffffffL));
386 template <endianness TargetEndianness, std::
size_t MaxAlign,
bool isRela>
389 ELFType<TargetEndianness, MaxAlign, false>, isRela> {
394 uint32_t getSymbol(
bool isMips64EL)
const {
395 return this->getRInfo(isMips64EL) >> 8;
397 unsigned char getType(
bool isMips64EL)
const {
398 return (
unsigned char)(this->getRInfo(isMips64EL) & 0x0ff);
401 void setType(
unsigned char t) { setSymbolAndType(getSymbol(), t); }
403 this->setRInfo((s << 8) + t);
407 template <
class ELFT>
419 Elf_Half e_phentsize;
421 Elf_Half e_shentsize;
425 bool checkMagic()
const {
434 template <endianness TargetEndianness, std::
size_t MaxAlign>
447 template <
endianness TargetEndianness, std::
size_t MaxAlign>
unsigned char getType() const
static const endianness TargetEndianness
unsigned char getDataEncoding() const
void setSymbolAndType(uint32_t s, unsigned char t)
void setBinding(unsigned char b)
support::detail::packed_endian_specific_integral< value_type, TargetEndianness, MaximumAlignment< value_type, MaxAlign >::value > Elf_Addr
unsigned char getType(bool isMips64EL) const
FunctionType * getType(LLVMContext &Context, ID id, ArrayRef< Type * > Tys=None)
uint32_t getType(bool isMips64EL) const
Elf_Dyn_Impl: This inherits from Elf_Dyn_Base, adding getters and setters.
unsigned char getFileClass() const
void setSymbol(uint32_t s)
support::detail::packed_endian_specific_integral< int64_t, target_endianness, MaximumAlignment< int64_t, max_alignment >::value > Elf_Sxword
void setRInfo(uint64_t R)
void setRInfo(uint64_t R)
support::detail::packed_endian_specific_integral< uint64_t, target_endianness, MaximumAlignment< uint64_t, max_alignment >::value > Elf_Xword
static const std::size_t MaxAlignment
int memcmp(const void *s1, const void *s2, size_t n);
void setType(unsigned char t)
support::detail::packed_endian_specific_integral< uint32_t, target_endianness, MaximumAlignment< uint32_t, max_alignment >::value > Elf_Word
support::detail::packed_endian_specific_integral< value_type, TargetEndianness, MaximumAlignment< value_type, MaxAlign >::value > Elf_Addr
void setType(unsigned char t)
static const bool Is64Bits
support::detail::packed_endian_specific_integral< int32_t, target_endianness, MaximumAlignment< int32_t, max_alignment >::value > Elf_Sword
void setRInfo(uint32_t R)
#define LLVM_ELF_IMPORT_TYPES(E, M, W)
static const char ElfMagic[]
support::detail::packed_endian_specific_integral< value_type, TargetEndianness, MaximumAlignment< value_type, MaxAlign >::value > Elf_Off
size_t strlen(const char *s);
void setSymbol(uint32_t s)
void setBindingAndType(unsigned char b, unsigned char t)
void setRInfo(uint32_t R)
support::detail::packed_endian_specific_integral< value_type, TargetEndianness, MaximumAlignment< value_type, MaxAlign >::value > Elf_Off
unsigned getEntityCount() const
Get the number of entities this section contains if it has any.
support::detail::packed_endian_specific_integral< uint16_t, target_endianness, MaximumAlignment< uint16_t, max_alignment >::value > Elf_Half
#define LLVM_ELF_IMPORT_TYPES_ELFT(ELFT)
void setSymbolAndType(uint32_t s, uint32_t t)
unsigned char getBinding() const