]> git.unchartedbackwaters.co.uk Git - francis/libjit.git/commitdiff
applied patch #5503 with some modifications
authorAleksey Demakov <ademakov@gmail.com>
Tue, 28 Nov 2006 16:10:07 +0000 (16:10 +0000)
committerAleksey Demakov <ademakov@gmail.com>
Tue, 28 Nov 2006 16:10:07 +0000 (16:10 +0000)
ChangeLog
jit/jit-rules-x86.c
jit/jit-rules-x86.ins

index 33c63f01977be1beed49456795008b32e977d19f..2007c81ce2a065ae8562977b9d3874f67efee3be 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2006-11-27  Kirill Kononenko  <Kirill.Kononenko@gmail.com>
+
+       * jit/jit-rules-x86.c (throw_builtin):
+       * jit/jit-rules-x86.ins (JIT_OP_THROW, JIT_OP_LOAD_PC): directly use
+       the inst variable to get current PC value for the position-dependent
+       code case (patch #5503).
+
 2006-11-27  Aleksey Demakov  <ademakov@gmail.com>
 
        * include/jit/jit-context.h: add JIT_OPTION_POSITION_INDEPENDENT
@@ -7,6 +14,11 @@
        * jit/jit-function.c (_jit_function_ensure_builder): initialize
        position_independent field.
 
+       * jit/jit-rules-x86.c (throw_builtin):
+       * jit/jit-rules-x86.ins (JIT_OP_ADDRESS_OF_LABEL, JIT_OP_JUMP_TABLE)
+       (JIT_OP_THROW, JIT_OP_LOAD_PC): add position_independent check and
+       stub missing cases.
+
 2006-11-26  Kirill Kononenko  <Kirill.Kononenko@gmail.com>
 
        * jit/jit-rules-x86.ins: if JIT_USE_SIGNALS is defined do not emit
index 11107b8d3ad2501df282d8bcd3780c711c81796e..39b669d39b3de2ddad15ae96dba71c1041c1fd65 100644 (file)
@@ -1296,10 +1296,20 @@ static unsigned char *throw_builtin
        if(func->builder->setjmp_value != 0)
        {
                _jit_gen_fix_value(func->builder->setjmp_value);
-               x86_call_imm(inst, 0);
-               x86_pop_membase(inst, X86_EBP,
-                                               func->builder->setjmp_value->frame_offset +
-                                               jit_jmp_catch_pc_offset);
+               if(func->builder->position_independent)
+               {
+                       x86_call_imm(inst, 0);
+                       x86_pop_membase(inst, X86_EBP,
+                                       func->builder->setjmp_value->frame_offset
+                                       + jit_jmp_catch_pc_offset);
+               }
+               else
+               {
+                       int pc = (int) inst;
+                       x86_mov_membase_imm(inst, X86_EBP,
+                                           func->builder->setjmp_value->frame_offset
+                                           + jit_jmp_catch_pc_offset, pc, 4);
+               }
        }
 
        /* Push the exception type onto the stack */
index 54257be8cba70e478b4f5932e386a5a0dbd863ae..e584da769b68a4721ac6f31cc8bc6ad4060eba17 100644 (file)
@@ -1623,10 +1623,20 @@ JIT_OP_THROW: unary_branch
                        /* We have a "setjmp" block in the current function,
                           so we must record the location of the throw first */
                        _jit_gen_fix_value(func->builder->setjmp_value);
-                       x86_call_imm(inst, 0);
-                       x86_pop_membase(inst, X86_EBP,
-                                                       func->builder->setjmp_value->frame_offset +
-                                                       jit_jmp_catch_pc_offset);
+                       if(func->builder->position_independent)
+                       {
+                               x86_call_imm(inst, 0);
+                               x86_pop_membase(inst, X86_EBP,
+                                               func->builder->setjmp_value->frame_offset
+                                               + jit_jmp_catch_pc_offset);
+                       }
+                       else
+                       {
+                               int pc = (int) inst;
+                               x86_mov_membase_imm(inst, X86_EBP,
+                                                   func->builder->setjmp_value->frame_offset
+                                                   + jit_jmp_catch_pc_offset, pc, 4);
+                       }
                }
                x86_call_code(inst, (void *)jit_exception_throw);
        }
@@ -1636,8 +1646,16 @@ JIT_OP_RETHROW: manual
 
 JIT_OP_LOAD_PC:
        [=reg] -> {
-               x86_call_imm(inst, 0);
-               x86_pop_reg(inst, $1);
+               if(func->builder->position_independent)
+               {
+                       x86_call_imm(inst, 0);
+                       x86_pop_reg(inst, $1);
+               }
+               else
+               {
+                       int pc = (int) inst;
+                       x86_mov_reg_imm(inst, $1, pc);
+               }
        }
 
 JIT_OP_LOAD_EXCEPTION_PC: manual