diff options
Diffstat (limited to 'tccgen.c')
| -rw-r--r-- | tccgen.c | 16 |
1 files changed, 13 insertions, 3 deletions
@@ -5777,7 +5777,7 @@ static void init_putv(CType *type, Section *sec, unsigned long c, /* XXX: make code faster ? */ if (!(type->t & VT_BITFIELD)) { bit_pos = 0; - bit_size = 32; + bit_size = PTR_SIZE * 8; bit_mask = -1LL; } else { bit_pos = (vtop->type.t >> VT_STRUCT_SHIFT) & 0x3f; @@ -5789,8 +5789,14 @@ static void init_putv(CType *type, Section *sec, unsigned long c, bt == VT_SHORT || bt == VT_DOUBLE || bt == VT_LDOUBLE || - bt == VT_LLONG || - (bt == VT_INT && bit_size != 32))) +#if PTR_SIZE == 8 + (bt == VT_LLONG && bit_size != 64) || + bt == VT_INT +#else + bt == VT_LLONG || + (bt == VT_INT && bit_size != 32) +#endif + )) tcc_error("initializer element is not computable at load time"); switch(bt) { /* XXX: when cross-compiling we assume that each type has the @@ -5815,9 +5821,13 @@ static void init_putv(CType *type, Section *sec, unsigned long c, else tcc_error("can't cross compile long double constants"); break; +#if PTR_SIZE != 8 case VT_LLONG: *(long long *)ptr |= (vtop->c.i & bit_mask) << bit_pos; break; +#else + case VT_LLONG: +#endif case VT_PTR: { addr_t val = (vtop->c.i & bit_mask) << bit_pos; #if defined(TCC_TARGET_ARM64) || defined(TCC_TARGET_X86_64) |
