aboutsummaryrefslogtreecommitdiff
path: root/x86_64-gen.c
diff options
context:
space:
mode:
authorMichael Matz <matz@suse.de>2016-10-09 00:44:22 +0200
committerMichael Matz <matz@suse.de>2016-12-15 17:49:55 +0100
commit235711f3d3a5a41a4bb51a22dca6700aa77d34c1 (patch)
tree19a5969c24864534990e90f6f37b58addedb7933 /x86_64-gen.c
parenta2a596e76724a7915361b4d0f1b5553929d26a31 (diff)
downloadtinycc-235711f3d3a5a41a4bb51a22dca6700aa77d34c1.tar.gz
tinycc-235711f3d3a5a41a4bb51a22dca6700aa77d34c1.tar.bz2
64bit: Fix addends > 32 bits
If a symbolic reference is offsetted by a constant > 32bit the backends can't deal with that, so don't construct such values.
Diffstat (limited to 'x86_64-gen.c')
-rw-r--r--x86_64-gen.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/x86_64-gen.c b/x86_64-gen.c
index 408bb91..b765806 100644
--- a/x86_64-gen.c
+++ b/x86_64-gen.c
@@ -349,6 +349,8 @@ void load(int r, SValue *sv)
fr = sv->r;
ft = sv->type.t & ~VT_DEFSIGN;
fc = sv->c.i;
+ if (fc != sv->c.i && (fr & VT_SYM))
+ tcc_error("64 bit addend in load");
ft &= ~(VT_VOLATILE | VT_CONSTANT);
@@ -528,9 +530,11 @@ void store(int r, SValue *v)
v = pe_getimport(v, &v2);
#endif
+ fr = v->r & VT_VALMASK;
ft = v->type.t;
fc = v->c.i;
- fr = v->r & VT_VALMASK;
+ if (fc != v->c.i && (fr & VT_SYM))
+ tcc_error("64 bit addend in store");
ft &= ~(VT_VOLATILE | VT_CONSTANT);
bt = ft & VT_BTYPE;