* src/vm/jit/i386/asmpart.S: Made position independent.
authorStefan Ring <stefan@complang.tuwien.ac.at>
Mon, 29 Nov 2010 18:06:08 +0000 (19:06 +0100)
committerStefan Ring <stefan@complang.tuwien.ac.at>
Mon, 29 Nov 2010 18:06:08 +0000 (19:06 +0100)
* src/vm/jit/i386/Makefile.am: Forward ENABLE_PIC_ASM to asm preprocessor.
* m4/pic_asm.m4: Check for enable-pic-asm configure switch.
* configure.ac: Invoke AC_CHECK_ENABLE_PIC_ASM.

configure.ac
m4/pic_asm.m4 [new file with mode: 0644]
src/vm/jit/i386/Makefile.am
src/vm/jit/i386/asmpart.S

index d29902fdfedfb1e5f492a524b0d1ca961705d929..14f2095f2e8392038fd5d6adc23f507740db54ea 100644 (file)
@@ -660,6 +660,8 @@ AZ_PYTHON_LSPEC
 
 AC_CHECK_ENABLE_GCC_PR40134
 
+AC_CHECK_ENABLE_PIC_ASM
+
 dnl Define version numbers.
 AC_VERSION_DETAIL
 AC_VERSION_CONFIG
diff --git a/m4/pic_asm.m4 b/m4/pic_asm.m4
new file mode 100644 (file)
index 0000000..72d87f6
--- /dev/null
@@ -0,0 +1,35 @@
+dnl m4/pic_asm.m4
+dnl
+dnl Copyright (C) 2010
+dnl CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
+dnl 
+dnl This file is part of CACAO.
+dnl 
+dnl This program is free software; you can redistribute it and/or
+dnl modify it under the terms of the GNU General Public License as
+dnl published by the Free Software Foundation; either version 2, or (at
+dnl your option) any later version.
+dnl 
+dnl This program is distributed in the hope that it will be useful, but
+dnl WITHOUT ANY WARRANTY; without even the implied warranty of
+dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+dnl General Public License for more details.
+dnl 
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software
+dnl Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+dnl 02110-1301, USA.
+
+
+AC_DEFUN([AC_CHECK_ENABLE_PIC_ASM],[
+AC_MSG_CHECKING([if we should use position independent assembler code])
+AC_ARG_ENABLE([pic-asm],
+              [AS_HELP_STRING(--enable-pic-asm,[use position independent assembler code, needed for Solaris i386] [[default=no]])],
+              [case "${enableval}" in
+                   yes) ENABLE_PIC_ASM=yes;;
+                   *) ENABLE_PIC_ASM=no;;
+               esac],
+              [ENABLE_PIC_ASM=no])
+AC_MSG_RESULT(${ENABLE_PIC_ASM})
+AM_CONDITIONAL([ENABLE_PIC_ASM], [test x"${ENABLE_PIC_ASM}" = "xyes"])
+])
index 044070caf81ba6a780d7ca8040367fb3bf121bb4..9a596a47eda6e3e952241e0a5aacd74a05578c95 100644 (file)
@@ -33,6 +33,10 @@ SUBDIRS = $(OS_DIR)
 AM_CPPFLAGS = -I$(top_srcdir)/src -I$(top_builddir) -I$(top_builddir)/src -I$(top_srcdir)/src/vm/jit/$(ARCH_DIR)/$(OS_DIR)
 AM_CCASFLAGS = $(AM_CPPFLAGS)
 
+if ENABLE_PIC_ASM
+AM_CCASFLAGS += -DENABLE_PIC_ASM
+endif
+
 LIBS =
 
 noinst_HEADERS = \
index b9be6e191288c242139bfc018248b49e875043d0..e182ddeeccf9d2e3490309361508a0e57e534c0b 100644 (file)
@@ -177,8 +177,20 @@ L_asm_vm_call_method_return:
        ret
 
 asm_vm_call_method_exception_handler:
+#if defined(ENABLE_PIC_ASM)
+       sub     $12, %esp
+       push    %ebx
+#endif
        push    xptr                        /* pass exception pointer             */
+#if defined(ENABLE_PIC_ASM)
+       call    .GETPC
+       add     $_GLOBAL_OFFSET_TABLE_, %ebx
+       call    builtin_throw_exception@PLT
+       pop     %ebx
+       add     $12, %esp
+#else
        call    builtin_throw_exception
+#endif
        add     $4,sp
 asm_vm_call_method_end:
        jmp     L_asm_vm_call_method_return
@@ -217,7 +229,13 @@ L_asm_handle_exception_stack_loop:
        mov     t0,8*4(sp)                  /* save maybe-leaf flag               */
 
        mov     xpc,0*4(sp)                 /* pass exception pc                  */
+#if defined(ENABLE_PIC_ASM)
+       call    .GETPC
+       add     $_GLOBAL_OFFSET_TABLE_, %ebx
+       call    methodtree_find@PLT
+#else
        call    methodtree_find
+#endif
        mov     v0,6*4(sp)                  /* save data segment pointer          */
 
        mov     4*4(sp),itmp3               /* pass exception pointer             */
@@ -227,7 +245,12 @@ L_asm_handle_exception_stack_loop:
        mov     v0,2*4(sp)                  /* pass data segment pointer          */
        mov     7*4(sp),itmp3               /* pass Java stack pointer            */
        mov     itmp3,3*4(sp)
+#if defined(ENABLE_PIC_ASM)
+       /* GOT still in %ebx */
+       call    exceptions_handle_exception@PLT
+#else
        call    exceptions_handle_exception
+#endif
 
        test    v0,v0
        jz      L_asm_handle_exception_not_catched
@@ -337,7 +360,13 @@ asm_abstractmethoderror:
        mov     3*4(sp),itmp2               /* pass exception address             */
        sub     $2,itmp2
        mov     itmp2,1*4(sp)
+#if defined(ENABLE_PIC_ASM)
+       call    .GETPC
+       add     $_GLOBAL_OFFSET_TABLE_, %ebx
+       call    exceptions_asm_new_abstractmethoderror@PLT
+#else
        call    exceptions_asm_new_abstractmethoderror
+#endif
                                            /* exception pointer is return value  */
        add     $(3*4),sp                   /* remove stack frame                 */
 
@@ -352,31 +381,81 @@ asm_abstractmethoderror:
 *                                                                              *
 *******************************************************************************/
 
+#if defined(ENABLE_PIC_ASM)
+.GETPC:
+       mov     (%esp), %ebx
+       ret
+#endif
+
 asm_builtin_f2i:
        sub     $(3*4),%esp
+#if defined(ENABLE_PIC_ASM)
+       sub     $12, %esp
+       push    %ebx
+       fsts    (%esp)
+       call    .GETPC
+       add     $_GLOBAL_OFFSET_TABLE_, %ebx
+       call    builtin_f2i@PLT
+       pop     %ebx
+       add     $12, %esp
+#else
        fsts    (%esp)
        call    builtin_f2i
+#endif
        add     $(3*4),%esp
        ret
 
 asm_builtin_d2i:
        sub     $(3*4),%esp
+#if defined(ENABLE_PIC_ASM)
+       sub     $12, %esp
+       push    %ebx
+       fstl    (%esp)
+       call    .GETPC
+       add     $_GLOBAL_OFFSET_TABLE_, %ebx
+       call    builtin_d2i@PLT
+       pop     %ebx
+       add     $12, %esp
+#else
        fstl    (%esp)
        call    builtin_d2i
+#endif
        add     $(3*4),%esp
        ret
 
 asm_builtin_f2l:
        sub     $(3*4),%esp
+#if defined(ENABLE_PIC_ASM)
+       sub     $12, %esp
+       push    %ebx
+       fsts    (%esp)
+       call    .GETPC
+       add     $_GLOBAL_OFFSET_TABLE_, %ebx
+       call    builtin_f2l@PLT
+       pop     %ebx
+       add     $12, %esp
+#else
        fsts    (%esp)
        call    builtin_f2l
+#endif
        add     $(3*4),%esp
        ret
 
 asm_builtin_d2l:
        sub     $(3*4),%esp
+#if defined(ENABLE_PIC_ASM)
+       sub     $12, %esp
+       push    %ebx
+       fstl    (%esp)
+       call    .GETPC
+       add     $_GLOBAL_OFFSET_TABLE_, %ebx
+       call    builtin_d2l@PLT
+       pop     %ebx
+       add     $12, %esp
+#else
        fstl    (%esp)
        call    builtin_d2l
+#endif
        add     $(3*4),%esp
        ret