23 #ifndef ELFIO_UTILS_HPP
24 #define ELFIO_UTILS_HPP
26 #define ELFIO_GET_ACCESS(TYPE, NAME, FIELD) \
27 TYPE get_##NAME() const { return (*convertor)(FIELD); }
28 #define ELFIO_SET_ACCESS(TYPE, NAME, FIELD) \
29 void set_##NAME(TYPE value) { \
31 FIELD = (*convertor)(FIELD); \
33 #define ELFIO_GET_SET_ACCESS(TYPE, NAME, FIELD) \
34 TYPE get_##NAME() const { return (*convertor)(FIELD); } \
35 void set_##NAME(TYPE value) { \
37 FIELD = (*convertor)(FIELD); \
40 #define ELFIO_GET_ACCESS_DECL(TYPE, NAME) virtual TYPE get_##NAME() const = 0
42 #define ELFIO_SET_ACCESS_DECL(TYPE, NAME) virtual void set_##NAME(TYPE value) = 0
44 #define ELFIO_GET_SET_ACCESS_DECL(TYPE, NAME) \
45 virtual TYPE get_##NAME() const = 0; \
46 virtual void set_##NAME(TYPE value) = 0
57 void setup(
unsigned char elf_file_encoding) {
58 need_conversion = (elf_file_encoding != get_host_encoding());
62 uint64_t operator()(uint64_t value)
const {
63 if (!need_conversion) {
66 value = ((value & 0x00000000000000FFull) << 56) | ((value & 0x000000000000FF00ull) << 40) |
67 ((value & 0x0000000000FF0000ull) << 24) | ((value & 0x00000000FF000000ull) << 8) |
68 ((value & 0x000000FF00000000ull) >> 8) | ((value & 0x0000FF0000000000ull) >> 24) |
69 ((value & 0x00FF000000000000ull) >> 40) | ((value & 0xFF00000000000000ull) >> 56);
75 int64_t operator()(int64_t value)
const {
76 if (!need_conversion) {
79 return (int64_t)(*this)((uint64_t)value);
83 uint32_t operator()(uint32_t value)
const {
84 if (!need_conversion) {
87 value = ((value & 0x000000FF) << 24) | ((value & 0x0000FF00) << 8) |
88 ((value & 0x00FF0000) >> 8) | ((value & 0xFF000000) >> 24);
94 int32_t operator()(int32_t value)
const {
95 if (!need_conversion) {
98 return (int32_t)(*this)((uint32_t)value);
102 uint16_t operator()(uint16_t value)
const {
103 if (!need_conversion) {
106 value = ((value & 0x00FF) << 8) | ((value & 0xFF00) >> 8);
112 int16_t operator()(int16_t value)
const {
113 if (!need_conversion) {
116 return (int16_t)(*this)((uint16_t)value);
120 int8_t operator()(int8_t value)
const {
return value; }
123 uint8_t operator()(uint8_t value)
const {
return value; }
128 unsigned char get_host_encoding()
const {
129 static const int tmp = 1;
130 if (1 == *(
char*)&tmp) {
139 bool need_conversion;
144 inline uint32_t elf_hash(
const unsigned char* name) {
147 h = (h << 4) + *name++;
149 if (g != 0) h ^= g >> 24;
157 #endif // ELFIO_UTILS_HPP