From 31aa73fd8b935293a07d983f92fdeabe67fefc2a Mon Sep 17 00:00:00 2001 From: Stefan Ring Date: Mon, 29 Nov 2010 19:06:08 +0100 Subject: [PATCH] * src/vm/jit/i386/asmpart.S: Made position independent. * 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 | 2 + m4/pic_asm.m4 | 35 ++++++++++++++++ src/vm/jit/i386/Makefile.am | 4 ++ src/vm/jit/i386/asmpart.S | 79 +++++++++++++++++++++++++++++++++++++ 4 files changed, 120 insertions(+) create mode 100644 m4/pic_asm.m4 diff --git a/configure.ac b/configure.ac index d29902fdf..14f2095f2 100644 --- a/configure.ac +++ b/configure.ac @@ -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 index 000000000..72d87f6a2 --- /dev/null +++ b/m4/pic_asm.m4 @@ -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"]) +]) diff --git a/src/vm/jit/i386/Makefile.am b/src/vm/jit/i386/Makefile.am index 044070caf..9a596a47e 100644 --- a/src/vm/jit/i386/Makefile.am +++ b/src/vm/jit/i386/Makefile.am @@ -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 = \ diff --git a/src/vm/jit/i386/asmpart.S b/src/vm/jit/i386/asmpart.S index b9be6e191..e182ddeec 100644 --- a/src/vm/jit/i386/asmpart.S +++ b/src/vm/jit/i386/asmpart.S @@ -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 -- 2.25.1