--- /dev/null
+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"])
+])
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
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 */
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
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 */
* *
*******************************************************************************/
+#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