Thanks.
Index: src/vm/jit/i386/darwin/md-os.c
===================================================================
--- src/vm/jit/i386/darwin/md-os.c (revision 0)
+++ src/vm/jit/i386/darwin/md-os.c (revision 0)
@@ -0,0 +1,140 @@
+/* src/vm/jit/i386/darwin/md-os.c - machine dependent i386 Darwin functions
+
+ Copyright (C) 1996-2005, 2006 R. Grafl, A. Krall, C. Kruegel,
+ C. Oates, R. Obermaisser, M. Platter, M. Probst, S. Ring,
+ E. Steiner, C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich,
+ J. Wenninger, Institut f. Computersprachen - TU Wien, C. Marshall
+
+ This file is part of CACAO.
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2, or (at
+ your option) any later version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ 02110-1301, USA.
+
+ Contact: [EMAIL PROTECTED]
+
+ Authors: Christian Thalinger
+
+ Changes:
+
+ $Id$
+
+ Based on ../freebsd/md-os.c and ../../powerpc/darwin/md-os.c;
+ modified for Darwin/x86 by Casey Marshall.
+*/
+
+
+#include "config.h"
+
+#include <ucontext.h>
+
+#include "vm/jit/i386/md-abi.h"
+
+#include "vm/exceptions.h"
+#include "vm/signallocal.h"
+#include "vm/jit/asmpart.h"
+#include "vm/jit/stacktrace.h"
+
+
+/* md_signal_handler_sigsegv
***************************************************
+
+ NullPointerException signal handler for hardware null pointer
+ check.
+
+*******************************************************************************/
+
+void md_signal_handler_sigsegv(int sig, siginfo_t *siginfo, void *_p)
+{
+ ucontext_t *_uc;
+ mcontext_t _mc;
+ i386_thread_state_t *_ss;
+ u1 *sp;
+ u1 *ra;
+ u1 *xpc;
+
+ _uc = (ucontext_t *) _p;
+ _mc = _uc->uc_mcontext;
+ _ss = &_mc->ss;
+
+ sp = (u1 *) _ss->esp;
+ xpc = (u1 *) _ss->eip;
+ ra = xpc; /* return address is equal to xpc
*/
+
+ _ss->eax =
+ (ptrint) stacktrace_hardware_nullpointerexception(NULL, sp, ra,
xpc);
+
+ _ss->ecx = (ptrint) xpc; /* REG_ITMP2_XPC
*/
+ _ss->eip = (ptrint) asm_handle_exception;
+}
+
+
+/* md_signal_handler_sigfpe
****************************************************
+
+ ArithmeticException signal handler for hardware divide by zero
+ check.
+
+*******************************************************************************/
+
+void md_signal_handler_sigfpe(int sig, siginfo_t *siginfo, void *_p)
+{
+ ucontext_t *_uc;
+ mcontext_t _mc;
+ i386_thread_state_t *_ss;
+ u1 *sp;
+ u1 *ra;
+ u1 *xpc;
+
+ _uc = (ucontext_t *) _p;
+ _mc = _uc->uc_mcontext;
+ _ss = &_mc->ss;
+
+ sp = (u1 *) _ss->esp;
+ xpc = (u1 *) _ss->eip;
+ ra = xpc; /* return address is equal to xpc
*/
+
+ _ss->eax =
+ (ptrint) stacktrace_hardware_arithmeticexception(NULL, sp, ra,
xpc);
+
+ _ss->ecx = (ptrint) xpc; /* REG_ITMP2_XPC
*/
+ _ss->eip = (ptrint) asm_handle_exception;
+}
+
+
+#if defined(ENABLE_THREADS)
+void thread_restartcriticalsection(ucontext_t *uc)
+{
+ void *critical;
+ mcontext_t _mc = uc->uc_mcontext;
+ i386_thread_state_t *_ss = &_mc->ss;
+
+ critical = critical_find_restart_point((void *) _ss->eip);
+
+ if (critical)
+ _ss->eip = (ptrint) critical;
+}
+#endif
+
+
+/*
+ * These are local overrides for various environment variables in Emacs.
+ * Please do not remove this and leave it at the end of the file, where
+ * Emacs will automagically detect them.
+ * ---------------------------------------------------------------------
+ * Local variables:
+ * mode: c
+ * indent-tabs-mode: t
+ * c-basic-offset: 4
+ * tab-width: 4
+ * End:
+ */
Index: src/vm/jit/i386/darwin/Makefile.am
===================================================================
--- src/vm/jit/i386/darwin/Makefile.am (revision 0)
+++ src/vm/jit/i386/darwin/Makefile.am (revision 0)
@@ -0,0 +1,53 @@
+## src/vm/jit/i386/darwin/Makefile.am
+##
+## Copyright (C) 1996-2005, 2006 R. Grafl, A. Krall, C. Kruegel,
+## C. Oates, R. Obermaisser, M. Platter, M. Probst, S. Ring,
+## E. Steiner, C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich,
+## J. Wenninger, Institut f. Computersprachen - TU Wien, C. Marshall
+##
+## This file is part of CACAO.
+##
+## This program is free software; you can redistribute it and/or
+## modify it under the terms of the GNU General Public License as
+## published by the Free Software Foundation; either version 2, or (at
+## your option) any later version.
+##
+## This program is distributed in the hope that it will be useful, but
+## WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+## General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, write to the Free Software
+## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+## 02110-1301, USA.
+##
+## Contact: [EMAIL PROTECTED]
+##
+## Authors: Christian Thalinger
+##
+## Changes:
+##
+## $Id$
+
+## Process this file with automake to produce Makefile.in
+
+AM_CPPFLAGS = -I$(top_srcdir)/src -I$(top_srcdir)/src/vm/jit/$(ARCH_DIR)
+
+LIBS =
+
+noinst_HEADERS =
+
+noinst_LTLIBRARIES = libmd.la
+
+libmd_la_SOURCES = \
+ md-os.c
+
+
+## Local variables:
+## mode: Makefile
+## indent-tabs-mode: t
+## c-basic-offset: 4
+## tab-width: 8
+## compile-command: "automake --add-missing"
+## End:
Index: src/vm/jit/i386/codegen.c
===================================================================
--- src/vm/jit/i386/codegen.c (revision 5126)
+++ src/vm/jit/i386/codegen.c (working copy)
@@ -4422,6 +4422,10 @@
1 + /* function pointer
*/
4 * 4 + /* 4 arguments
(start_native_call) */
nmd->memuse;
+ stackframesize |= 0x3; /* Keep aligned to 16-bytes. We
can't
+
tell if the function we are calling
+
is a leaf function or not, so just
+
align all of them. */
/* create method header */
Index: src/vm/jit/i386/asmpart.S
===================================================================
--- src/vm/jit/i386/asmpart.S (revision 5126)
+++ src/vm/jit/i386/asmpart.S (working copy)
@@ -52,6 +52,7 @@
/* export functions
***********************************************************/
+#if !defined(__DARWIN__)
.globl asm_md_init
.globl asm_vm_call_method
@@ -81,8 +82,48 @@
.globl asm_getclassvalues_atomic
.globl asm_get_cycle_count
+#else
+ .globl _asm_md_init
+ .globl _asm_vm_call_method
+ .globl _asm_vm_call_method_int
+ .globl _asm_vm_call_method_long
+ .globl _asm_vm_call_method_float
+ .globl _asm_vm_call_method_double
+ .globl _asm_vm_call_method_exception_handler
+ .globl _asm_call_jit_compiler
+ .globl _asm_handle_nat_exception
+ .globl _asm_handle_exception
+
+ .globl _asm_abstractmethoderror
+
+ .globl _asm_wrapper_patcher
+
+ .globl _asm_replacement_out
+ .globl _asm_replacement_in
+
+ .globl _asm_builtin_f2i
+ .globl _asm_builtin_f2l
+ .globl _asm_builtin_d2i
+ .globl _asm_builtin_d2l
+
+ .globl _asm_criticalsections
+ .globl _asm_getclassvalues_atomic
+
+ .globl _asm_get_cycle_count
+#endif
+
+/*
+ * On Darwin, exported symbols need to have _ prepended to them.
+ */
+#if !defined(__DARWIN__)
+#define EXTERNAL_SYMBOL(s) s
+#else
+#define EXTERNAL_SYMBOL(s) _##s
+#endif
+
+
/* asm_md_init
*****************************************************************
Initialize machine dependent stuff.
@@ -98,7 +139,7 @@
*******************************************************************************/
-asm_md_init:
+EXTERNAL_SYMBOL(asm_md_init):
sub $4,sp /* allocate space for the FPU state
*/
fnstcw (sp) /* get the FPU state
*/
mov (sp),%eax
@@ -140,11 +181,11 @@
.long 0 /* frame size
*/
.long 0 /* codeinfo pointer
*/
-asm_vm_call_method:
-asm_vm_call_method_int:
-asm_vm_call_method_long:
-asm_vm_call_method_float:
-asm_vm_call_method_double:
+EXTERNAL_SYMBOL(asm_vm_call_method):
+EXTERNAL_SYMBOL(asm_vm_call_method_int):
+EXTERNAL_SYMBOL(asm_vm_call_method_long):
+EXTERNAL_SYMBOL(asm_vm_call_method_float):
+EXTERNAL_SYMBOL(asm_vm_call_method_double):
push bp
mov sp,bp /* save stackptr
*/
sub $(4*4),sp /* create stackframe
*/
@@ -177,8 +218,11 @@
sub $1,itmp3
test itmp3,itmp3 /* any args left?
*/
jz calljava_setstack
-
+#if !defined(__DARWIN__)
add $sizevmarg,itmp1 /* goto next argument block
*/
+#else
+ add $16,itmp1 /* XXX
hack */
+#endif
jmp calljava_calcstacksize
calljava_setstack:
@@ -204,7 +248,11 @@
test itmp2,itmp2
jle L_asm_vm_call_method_copy_done
+#if !defined(__DARWIN__)
add $sizevmarg,itmp1 /* goto next argument block
*/
+#else
+ add $16,itmp1 /* XXX
hack */
+#endif
jmp calljava_copyloop
L_asm_vm_call_method_copy_done:
@@ -229,7 +277,7 @@
leave
ret
-asm_vm_call_method_exception_handler:
+EXTERNAL_SYMBOL(asm_vm_call_method_exception_handler):
push xptr /* pass exception pointer
*/
call builtin_throw_exception
add $4,sp
@@ -263,7 +311,7 @@
*******************************************************************************/
-asm_call_jit_compiler:
+EXTERNAL_SYMBOL(asm_call_jit_compiler):
L_asm_call_jit_compiler: /* required for PIC code
*/
sub $(4*4),sp /* create stack frame
*/
@@ -301,10 +349,10 @@
*
*
*******************************************************************************/
-asm_handle_nat_exception:
+EXTERNAL_SYMBOL(asm_handle_nat_exception):
add $4,sp /* clear return address of native
stub*/
-asm_handle_exception:
+EXTERNAL_SYMBOL(asm_handle_exception):
L_asm_handle_exception: /* required for PIC code
*/
sub $((ARG_CNT+TMP_CNT)*4),sp /* create maybe-leaf stackframe
*/
@@ -436,7 +484,7 @@
*******************************************************************************/
-asm_abstractmethoderror:
+EXTERNAL_SYMBOL(asm_abstractmethoderror):
sub $(2*4),sp /* create stack frame
*/
mov sp,itmp1 /* pass java sp
*/
add $((1+2)*4),itmp1
@@ -468,7 +516,7 @@
*******************************************************************************/
-asm_wrapper_patcher:
+EXTERNAL_SYMBOL(asm_wrapper_patcher):
sub $((2+4)*4),sp /* create stack frame
*/
mov itmp1,(0+4)*4(sp) /* save itmp1 and itmp2
*/
@@ -518,7 +566,7 @@
/* XXX we should find a cleaner solution here */
#define REPLACEMENT_ROOM 512
-asm_replacement_out:
+EXTERNAL_SYMBOL(asm_replacement_out):
/* create stack frame */
sub $(sizeexecutionstate + REPLACEMENT_ROOM),sp
@@ -571,7 +619,7 @@
*******************************************************************************/
-asm_replacement_in:
+EXTERNAL_SYMBOL(asm_replacement_in):
mov 4(sp),%ebp /* executionstate *es
*/
/* set new sp */
@@ -599,28 +647,28 @@
*
*
*******************************************************************************/
-asm_builtin_f2i:
+EXTERNAL_SYMBOL(asm_builtin_f2i):
sub $4,%esp
fsts (%esp)
call builtin_f2i
add $4,%esp
ret
-asm_builtin_d2i:
+EXTERNAL_SYMBOL(asm_builtin_d2i):
sub $8,%esp
fstl (%esp)
call builtin_d2i
add $8,%esp
ret
-asm_builtin_f2l:
+EXTERNAL_SYMBOL(asm_builtin_f2l):
sub $4,%esp
fsts (%esp)
call builtin_f2l
add $4,%esp
ret
-asm_builtin_d2l:
+EXTERNAL_SYMBOL(asm_builtin_d2l):
sub $8,%esp
fstl (%esp)
call builtin_d2l
@@ -628,7 +676,7 @@
ret
-asm_getclassvalues_atomic:
+EXTERNAL_SYMBOL(asm_getclassvalues_atomic):
_crit_restart2:
mov 4(%esp),%ecx /* super */
mov 8(%esp),%edx /* sub */
@@ -647,7 +695,7 @@
.data
-asm_criticalsections:
+EXTERNAL_SYMBOL(asm_criticalsections):
#if defined(ENABLE_THREADS)
#if 0
.long _crit_begin1
@@ -674,11 +722,71 @@
*******************************************************************************/
-asm_get_cycle_count:
+EXTERNAL_SYMBOL(asm_get_cycle_count):
rdtsc
ret
+/* Symbol stubs for darwin. */
+#if defined(__DARWIN__)
+ .section
__IMPORT,__jump_table,symbol_stubs,self_modifying_code+pure_instructions,5
+builtin_d2l:
+ .indirect_symbol _builtin_d2l
+ hlt ; hlt ; hlt ; hlt ; hlt
+
+builtin_f2l:
+ .indirect_symbol _builtin_f2l
+ hlt ; hlt ; hlt ; hlt ; hlt
+
+builtin_d2i:
+ .indirect_symbol _builtin_d2i
+ hlt ; hlt ; hlt ; hlt ; hlt
+
+builtin_f2i:
+ .indirect_symbol _builtin_f2i
+ hlt ; hlt ; hlt ; hlt ; hlt
+
+abort:
+ .indirect_symbol _abort
+ hlt ; hlt ; hlt ; hlt ; hlt
+
+replace_me:
+ .indirect_symbol _replace_me
+ hlt ; hlt ; hlt ; hlt ; hlt
+
+exceptions_handle_exception:
+ .indirect_symbol _exceptions_handle_exception
+ hlt ; hlt ; hlt ; hlt ; hlt
+
+codegen_findmethod:
+ .indirect_symbol _codegen_findmethod
+ hlt ; hlt ; hlt ; hlt ; hlt
+
+builtin_throw_exception:
+ .indirect_symbol _builtin_throw_exception
+ hlt ; hlt ; hlt ; hlt ; hlt
+
+
+patcher_wrapper:
+ .indirect_symbol _patcher_wrapper
+ hlt ; hlt ; hlt ; hlt ; hlt
+
+exceptions_asm_new_abstractmethoderror:
+ .indirect_symbol _exceptions_asm_new_abstractmethoderror
+ hlt ; hlt ; hlt ; hlt ; hlt
+
+exceptions_get_and_clear_exception:
+ .indirect_symbol _exceptions_get_and_clear_exception
+ hlt ; hlt ; hlt ; hlt ; hlt
+
+jit_asm_compile:
+ .indirect_symbol _jit_asm_compile
+ hlt ; hlt ; hlt ; hlt ; hlt
+
+ .subsections_via_symbols
+
+#endif
+
/*
* These are local overrides for various environment variables in Emacs.
* Please do not remove this and leave it at the end of the file, where
Index: src/vm/jit/i386/Makefile.am
===================================================================
--- src/vm/jit/i386/Makefile.am (revision 5126)
+++ src/vm/jit/i386/Makefile.am (working copy)
@@ -33,6 +33,7 @@
## Process this file with automake to produce Makefile.in
DIST_SUBDIRS = \
+ darwin \
freebsd \
linux
Index: src/threads/native/threads.c
===================================================================
--- src/threads/native/threads.c (revision 5126)
+++ src/threads/native/threads.c (working copy)
@@ -494,9 +494,15 @@
do {
if (tobj != self)
{
+#if defined(__i386__)
+ thread_state_flavor_t flavor = i386_THREAD_STATE;
+ mach_msg_type_number_t thread_state_count =
i386_THREAD_STATE_COUNT;
+ i386_thread_state_t thread_state;
+#else
thread_state_flavor_t flavor = PPC_THREAD_STATE;
mach_msg_type_number_t thread_state_count =
PPC_THREAD_STATE_COUNT;
ppc_thread_state_t thread_state;
+#endif
mach_port_t thread = tobj->mach_thread;
kern_return_t r;
Index: ChangeLog
===================================================================
--- ChangeLog (revision 5126)
+++ ChangeLog (working copy)
@@ -1,3 +1,18 @@
+2006-07-20 Casey Marshall <[EMAIL PROTECTED]>
+
+ * configure.ac (AC_CONFIG_FILES): add
+ `vm/jit/i386/darwin/Makefile'.
+ * src/threads/native/threads.c (threads_cast_darwinstop): add i386
+ declarations.
+ * src/vm/jit/i386/codegen.c (createnativestub): align the stack.
+ * src/vm/jit/i386/asmpart.S: export symbols with `_' on Darwin.
+ (EXTERNAL_SYMBOL): new macro; wrap all exported symbols with
+ `EXTERNAL_SYMBOL'.
+ Add indirect symbol stubs for externally-called functions.
+ * src/vm/jit/i386/Makefile.am (SUBDIRS): add `darwin'.
+ * src/vm/jit/i386/darwin/Makefile.am: new file
+ * src/vm/jit/i386/darwin/md-os.c: new file.
+
2006-05-29 18:52 twisti
* configure.ac (AC_INIT): Changed to version 0.96.
Index: configure.ac
===================================================================
--- configure.ac (revision 5126)
+++ configure.ac (working copy)
@@ -822,6 +822,7 @@
[src/vm/jit/alpha/freebsd/Makefile]
[src/vm/jit/alpha/linux/Makefile]
[src/vm/jit/i386/Makefile]
+ [src/vm/jit/i386/darwin/Makefile]
[src/vm/jit/i386/freebsd/Makefile]
[src/vm/jit/i386/linux/Makefile]
[src/vm/jit/ifconv/Makefile]
PGP.sig
Description: This is a digitally signed message part

