diff --git a/tccgen.c b/tccgen.c index 930993a..c7be9f8 100644 --- a/tccgen.c +++ b/tccgen.c @@ -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) diff --git a/tests/tcctest.c b/tests/tcctest.c index 9230020..bb6e741 100644 --- a/tests/tcctest.c +++ b/tests/tcctest.c @@ -2230,10 +2230,17 @@ int reltab[3] = { 1, 2, 3 }; int *rel1 = &reltab[1]; int *rel2 = &reltab[2]; +void getmyaddress(void) +{ + printf("in getmyaddress\n"); +} +unsigned long theaddress = (unsigned long)getmyaddress; void relocation_test(void) { + void (*fptr)(void) = (void (*)(void))theaddress; printf("*rel1=%d\n", *rel1); printf("*rel2=%d\n", *rel2); + fptr(); } void old_style_f(a,b,c)