summaryrefslogtreecommitdiff
path: root/cgaas.c
diff options
context:
space:
mode:
authorJohn van Groningen2013-08-01 12:47:55 +0000
committerJohn van Groningen2013-08-01 12:47:55 +0000
commite6b978ad32d9e536d4feaf3c840d1feae1b7bfbb (patch)
treeeb826d28af99f282cd86151a645f5817cf3a2146 /cgaas.c
parentfix offsets in descriptors, for position independent code on linux (diff)
use 64 instead of 32 bit address in indirect call for position independent code on linux
Diffstat (limited to 'cgaas.c')
-rw-r--r--cgaas.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/cgaas.c b/cgaas.c
index 556f82a..b87e812 100644
--- a/cgaas.c
+++ b/cgaas.c
@@ -2502,12 +2502,18 @@ static void as_jsr_instruction (struct instruction *instruction)
as_branch_label (instruction->instruction_parameters[0].parameter_data.l,CALL_RELOCATION);
break;
case P_INDIRECT:
- if (instruction->instruction_parameters[0].parameter_offset!=0){
+#ifndef MACH_O64
+ if (
+# ifdef LINUX
+ !pic_flag &&
+# endif
+ instruction->instruction_parameters[0].parameter_offset!=0){
as_id_r (0x63,instruction->instruction_parameters[0].parameter_offset,
instruction->instruction_parameters[0].parameter_data.reg.r,REGISTER_O0); /* movsxd */
store_c (0377);
store_c (0320 | reg_num (REGISTER_O0));
} else
+#endif
as_id_rex (0377,020,instruction->instruction_parameters[0].parameter_offset,
instruction->instruction_parameters[0].parameter_data.reg.r);
break;