From 1d0a5c251553d8d9199ad18d4780bf356f456298 Mon Sep 17 00:00:00 2001 From: Michael Matz Date: Sun, 15 Apr 2012 19:29:45 +0200 Subject: x86_64: Fix segfault for global data When offsetted addresses of global non-static data are computed multiple times in the same statement the x86_64 backend uses gen_gotpcrel with offset, which implements an add insn on the register given. load() uses the R member of the to-be-loaded value, which doesn't yet have a reg assigned in all cases. So use the register we're supposed to load the value into as that register. --- x86_64-gen.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'x86_64-gen.c') diff --git a/x86_64-gen.c b/x86_64-gen.c index 49cfdd1..0f86b3a 100644 --- a/x86_64-gen.c +++ b/x86_64-gen.c @@ -414,7 +414,7 @@ void load(int r, SValue *sv) } else { orex(1,0,r,0x8b); o(0x05 + REG_VALUE(r) * 8); /* mov xx(%rip), r */ - gen_gotpcrel(fr, sv->sym, fc); + gen_gotpcrel(r, sv->sym, fc); } #endif } else if (is64_type(ft)) { -- cgit v1.3.1