aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tccgen.c16
-rw-r--r--tests/tcctest.c7
2 files changed, 20 insertions, 3 deletions
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)