HP tweaks to 0.8.3
Bernie Solomon
bernard at UG.EDS.COM
Tue Apr 8 08:01:45 PDT 1997
I've just caught up with 0.8.3 having been on holiday and discovered a
few problems in the HP changes including a major one to do with garbage
collection. The current code assumed that the stack always grew
downwards in memory which is not true for HP. I have put a tweak in
thread.c to scan the appropriate bit of stack correctly by using a
#define put in the HP md.h (STACK_GROWS_UP). I am not sure but I would
assume one could get configure to sort this out for you but I haven't
bothered to work out how to do that.
I have also made some tweaks so it compiles with the HP ANSI compiler
which does not take the "double align[0];" idiom so I have replaced
stuff with unions except for ctx which I have just stuck a double on the
end (memory for thread contexts didn't seem the most critical problem -
maybe there is a better way of doing this?). I have coded the unions for
HP non-GCC only but I don't see why they couldn't be used everywhere
given their simplicity and the use of macros to hide them already.
I attach all the diffs I have applied (includes some previously posted).
The second attachment is an assembler file which should be placed in
config/parisc/hpux/md.s and is used because the HP compiler won't take
inline assembler (its an alternative to md.c and configure will pick it
depending on the C compiler).
Note I haven't yet retried on the HP GCC because I found a bug in it
(2.7.2.1 that is) so I have been sticking to the HP compiler.
--
Bernie Solomon (bernard at edsug.com or Bernard.Solomon at acm.org)
Unigraphics Architecture, EDS-Unigraphics, Cambridge, UK
-------------- next part --------------
diff -c -r orig-kaffe-0.8.3/configure kaffe-0.8.3/configure
*** orig-kaffe-0.8.3/configure Mon Apr 7 18:05:41 1997
--- kaffe-0.8.3/configure Mon Apr 7 19:11:53 1997
***************
*** 979,994 ****
host_cpu=parisc
host_os=hpux
if test ac_cv_prog_gcc = yes ; then
! PIC=fpic
! #LDFLAGS='-Wl,+b,${libdir}'
! #LDSHARE='-b -E'
! LIBEXT=.sl
! INSTALL_DATA='${INSTALL} -m 555'
else
# for the HP-UX c compiler only
! dynamic_libraries=no
CFLAGS="-g -Aa +e -Dunix -Dhpux -D_HPUX_SOURCE"
fi
;;
--- 979,995 ----
host_cpu=parisc
host_os=hpux
if test ac_cv_prog_gcc = yes ; then
! PIC=-fpic
else
# for the HP-UX c compiler only
! PIC=+z
! LIBEXT=.sl
CFLAGS="-g -Aa +e -Dunix -Dhpux -D_HPUX_SOURCE"
fi
+ KAFFEFLAGS='-Wl,+s'
+ LIBSHARE='-b -E'
+ LIBEXT=.sl
+ INSTALL_DATA='${INSTALL} -m 555'
;;
***************
*** 4364,4372 ****
EOF
cat >> $CONFIG_STATUS <<EOF
! ac_sources="config/$host_cpu/$host_os/md.h config/$host_cpu/$host_os/md.c $jitsrc"
! ac_dests="config/md.h kaffe/kaffevm/md.c $jitdst"
EOF
cat >> $CONFIG_STATUS <<\EOF
--- 4365,4378 ----
EOF
+ md_src=md.c
+ if test "$host_cpu" = "parisc" && test $ac_cv_prog_gcc = no; then
+ md_src=md.s
+ fi
+
cat >> $CONFIG_STATUS <<EOF
! ac_sources="config/$host_cpu/$host_os/md.h config/$host_cpu/$host_os/$md_src $jitsrc"
! ac_dests="config/md.h kaffe/kaffevm/$md_src $jitdst"
EOF
cat >> $CONFIG_STATUS <<\EOF
diff -c -r orig-kaffe-0.8.3/config/alpha/jit.h kaffe-0.8.3/config/alpha/jit.h
*** orig-kaffe-0.8.3/config/alpha/jit.h Mon Apr 7 18:05:59 1997
--- kaffe-0.8.3/config/alpha/jit.h Tue Apr 8 10:48:30 1997
***************
*** 26,33 ****
#define CALL_KAFFE_FUNCTION(meth, obj) \
alpha_call_kaffe_function(meth, obj)
! extern jword alpha_call_kaffe_function_varargs(Method*, Hjava_lang_Object*, va_list);
! extern jword alpha_call_kaffe_function(Method*, Hjava_lang_Object*);
/**/
--- 26,34 ----
#define CALL_KAFFE_FUNCTION(meth, obj) \
alpha_call_kaffe_function(meth, obj)
! struct Hjava_lang_Object;
! extern jword alpha_call_kaffe_function_varargs(Method*, struct Hjava_lang_Object*, va_list);
! extern jword alpha_call_kaffe_function(Method*, struct Hjava_lang_Object*);
/**/
diff -c -r orig-kaffe-0.8.3/config/parisc/threads.h kaffe-0.8.3/config/parisc/threads.h
*** orig-kaffe-0.8.3/config/parisc/threads.h Mon Apr 7 18:06:00 1997
--- kaffe-0.8.3/config/parisc/threads.h Mon Apr 7 19:15:17 1997
***************
*** 19,24 ****
--- 19,29 ----
/* Thread handling */
/**/
#define USE_INTERNAL_THREADS
+
+ extern void parisc_threadswitch(unsigned char **, unsigned char **);
+ #if !defined(__GNUC__)
+ extern void *parisc_get_sp(void);
+ #endif
/* Not sure on this... */
#define THREADSTACKSIZE (32 * 1024)
***************
*** 35,48 ****
(to)->restorePoint = (void *)regstore; \
} while (0)
! #define THREADINFO(ee)
! do { \
! register uint8 *sp __asm__("%r30"); \
! (ee)->restorePoint = NULL; \
! (ee)->stackBase = sp; \
! (ee)->stackEnd = sp + threadStackSize; \
! (ee)->flags = THREAD_FLAGS_NOSTACKALLOC; \
! } while (0)
#define THREADFRAMES(tid, cnt) \
do { \
--- 40,64 ----
(to)->restorePoint = (void *)regstore; \
} while (0)
! #if defined(__GNUC__)
! #define THREADINFO(ee) \
! do { \
! register uint8 *sp __asm__("%r30"); \
! (ee)->restorePoint = NULL; \
! (ee)->stackBase = sp; \
! (ee)->stackEnd = sp + threadStackSize; \
! (ee)->flags = THREAD_FLAGS_NOSTACKALLOC; \
! } while (0)
! #else
! #define THREADINFO(ee) \
! do { \
! register uint8 *sp = parisc_get_sp(); \
! (ee)->restorePoint = NULL; \
! (ee)->stackBase = sp; \
! (ee)->stackEnd = sp + threadStackSize; \
! (ee)->flags = THREAD_FLAGS_NOSTACKALLOC; \
! } while (0)
! #endif
#define THREADFRAMES(tid, cnt) \
do { \
diff -c -r orig-kaffe-0.8.3/config/parisc/hpux/md.h kaffe-0.8.3/config/parisc/hpux/md.h
*** orig-kaffe-0.8.3/config/parisc/hpux/md.h Mon Apr 7 18:06:00 1997
--- kaffe-0.8.3/config/parisc/hpux/md.h Tue Apr 8 15:26:25 1997
***************
*** 16,20 ****
--- 16,21 ----
#include "parisc/threads.h"
#define LIBRARYPATH "SHLIB_PATH"
+ #define STACK_GROWS_UP 1
#endif
diff -c -r orig-kaffe-0.8.3/include/native.h kaffe-0.8.3/include/native.h
*** orig-kaffe-0.8.3/include/native.h Mon Apr 7 18:05:26 1997
--- kaffe-0.8.3/include/native.h Mon Apr 7 18:30:50 1997
***************
*** 56,64 ****
--- 56,70 ----
typedef struct Hjava_lang_Class* HClass;
/* Compare struct Array in object.h */
+ #if defined(__hpux) && !defined(__GNUC__)
#define ARRAY_FIELDS \
+ union { unsigned int length;\
+ double align; } array_fields
+ #else
+ #define ARRAY_FIELDS \
unsigned int length;\
double align[0]
+ #endif
/* Array types */
typedef struct { Hjava_lang_Object base; ARRAY_FIELDS; struct { jbyte body[1]; } data[1]; } HArrayOfByte;
***************
*** 72,78 ****
--- 78,88 ----
typedef struct { Hjava_lang_Object base; ARRAY_FIELDS; struct { Hjava_lang_Object* body[1]; } data[1]; } HArrayOfObject;
/* Get length of arrays */
+ #if defined(__hpux) && !defined(__GNUC__)
+ #define obj_length(_obj) ((_obj)->array_fields.length)
+ #else
#define obj_length(_obj) ((_obj)->length)
+ #endif
/* Get the strings */
#ifndef __baseclasses_h
diff -c -r orig-kaffe-0.8.3/kaffe/kaffevm/Makefile.in kaffe-0.8.3/kaffe/kaffevm/Makefile.in
*** orig-kaffe-0.8.3/kaffe/kaffevm/Makefile.in Mon Apr 7 18:05:30 1997
--- kaffe-0.8.3/kaffe/kaffevm/Makefile.in Tue Apr 8 15:39:09 1997
***************
*** 28,33 ****
--- 28,34 ----
KVER= @KVER@
OBJEXT= @OBJEXT@
LIBEXT= @LIBVMEXT@
+ AS= @CC@ @PIC@ -c
INCLUDES= -I. -I$(srcdir) -I$(srcdir)/../../config -I../../config -I../../include
CFLAGS= @CFLAGS@
***************
*** 74,80 ****
$(LN) $(LIB) $(LLIB)
$(LIB): $(OBJECT) lib.exp
! @LINKVMLIB@
.c$(OBJEXT):
$(CC) $(ALL_CFLAGS) -c $(PIC) $<
--- 75,81 ----
$(LN) $(LIB) $(LLIB)
$(LIB): $(OBJECT) lib.exp
! @LINKVMLIB@ @NET_LIBRARIES@
.c$(OBJEXT):
$(CC) $(ALL_CFLAGS) -c $(PIC) $<
***************
*** 83,89 ****
rm -f $(LIB) $(LLIB) $(OBJECT) lib.exp
distclean: clean
! rm -f md.c jit.def icode.h
rm -f Makefile
install:
--- 84,90 ----
rm -f $(LIB) $(LLIB) $(OBJECT) lib.exp
distclean: clean
! rm -f md.c md.s jit.def icode.h
rm -f Makefile
install:
diff -c -r orig-kaffe-0.8.3/kaffe/kaffevm/baseClasses.c kaffe-0.8.3/kaffe/kaffevm/baseClasses.c
*** orig-kaffe-0.8.3/kaffe/kaffevm/baseClasses.c Mon Apr 7 18:05:34 1997
--- kaffe-0.8.3/kaffe/kaffevm/baseClasses.c Tue Apr 8 14:26:37 1997
***************
*** 22,27 ****
--- 22,28 ----
#include "constants.h"
#include "classMethod.h"
#include "baseClasses.h"
+ #include "thread.h"
#include "lookup.h"
#include "slots.h"
#include "machine.h"
diff -c -r orig-kaffe-0.8.3/kaffe/kaffevm/classMethod.c kaffe-0.8.3/kaffe/kaffevm/classMethod.c
*** orig-kaffe-0.8.3/kaffe/kaffevm/classMethod.c Mon Apr 7 18:05:29 1997
--- kaffe-0.8.3/kaffe/kaffevm/classMethod.c Tue Apr 8 14:27:04 1997
***************
*** 28,33 ****
--- 28,34 ----
#include "file.h"
#include "readClass.h"
#include "baseClasses.h"
+ #include "thread.h"
#include "itypes.h"
#include "errors.h"
#include "exception.h"
diff -c -r orig-kaffe-0.8.3/kaffe/kaffevm/lookup.c kaffe-0.8.3/kaffe/kaffevm/lookup.c
*** orig-kaffe-0.8.3/kaffe/kaffevm/lookup.c Mon Apr 7 18:05:33 1997
--- kaffe-0.8.3/kaffe/kaffevm/lookup.c Tue Apr 8 15:20:12 1997
***************
*** 72,78 ****
class = CLASS_CLASS (ci, pool);
DBG( printf("getMethodSignatureClass(%s,%s,%s)\n",
! class->name, name->data, sig->data); )
/*
* We now have a complete class and method signature. We can
--- 72,78 ----
class = CLASS_CLASS (ci, pool);
DBG( printf("getMethodSignatureClass(%s,%s,%s)\n",
! class->name->data, name->data, sig->data); )
/*
* We now have a complete class and method signature. We can
diff -c -r orig-kaffe-0.8.3/kaffe/kaffevm/object.h kaffe-0.8.3/kaffe/kaffevm/object.h
*** orig-kaffe-0.8.3/kaffe/kaffevm/object.h Mon Apr 7 18:05:33 1997
--- kaffe-0.8.3/kaffe/kaffevm/object.h Mon Apr 7 18:33:03 1997
***************
*** 32,43 ****
--- 32,52 ----
struct Array {
Hjava_lang_Object obj;
/* Must match ARRAY_FIELDS in native.h. FIXME */
+ #if defined(__hpux) && !defined(__GNUC__)
+ union { uint32 length;
+ double align; } array_fields;
+ #else
uint32 length;
double align[0]; /* for alignment (Gcc extension) */
+ #endif
};
/* Number of elements. */
+ #if defined(__hpux) && !defined(__GNUC__)
+ #define ARRAY_SIZE(ARRAY) (((Array*)(ARRAY))->array_fields.length)
+ #else
#define ARRAY_SIZE(ARRAY) (((Array*)(ARRAY))->length)
+ #endif
#define ARRAY_DATA(ARRAY) ((void*)((Array*)(ARRAY)+1))
#define OBJARRAY_DATA(ARRAY) ((Hjava_lang_Object**)((Array*)(ARRAY)+1))
diff -c -r orig-kaffe-0.8.3/kaffe/kaffevm/slib.h kaffe-0.8.3/kaffe/kaffevm/slib.h
*** orig-kaffe-0.8.3/kaffe/kaffevm/slib.h Mon Apr 7 18:05:35 1997
--- kaffe-0.8.3/kaffe/kaffevm/slib.h Mon Apr 7 19:18:02 1997
***************
*** 54,61 ****
#define LIBRARYFUNCTION(FUNC, SYM) \
{ \
shl_t all_libs = 0; \
! if (shl_findsym(&all_libs,SYM,TYPE_PROCEDURE,&FUNC) == 0) { \
! break; \
} \
}
#define LIBRARYHANDLE shl_t
--- 54,61 ----
#define LIBRARYFUNCTION(FUNC, SYM) \
{ \
shl_t all_libs = 0; \
! if (shl_findsym(&all_libs,SYM,TYPE_PROCEDURE,&FUNC) != 0) { \
! FUNC = 0; \
} \
}
#define LIBRARYHANDLE shl_t
diff -c -r orig-kaffe-0.8.3/kaffe/kaffevm/thread.c kaffe-0.8.3/kaffe/kaffevm/thread.c
*** orig-kaffe-0.8.3/kaffe/kaffevm/thread.c Mon Apr 7 18:05:33 1997
--- kaffe-0.8.3/kaffe/kaffevm/thread.c Tue Apr 8 15:29:45 1997
***************
*** 1049,1060 ****
--- 1049,1065 ----
/* Since this thread my be extended by another class, walk any
* remaining data.
*/
+ gcStats.markedmem -= (base->size - sizeof(thread));
scanConservative(tid+1, base->size - sizeof(thread));
if (tid->PrivateInfo != 0) {
ct = TCTX(tid);
/* Nothing in context worth looking at except the stack */
+ #if STACK_GROWS_UP
+ scanConservative(ct->stackBase, ct->restorePoint - ct->stackBase);
+ #else
scanConservative(ct->restorePoint, ct->stackEnd - ct->restorePoint);
+ #endif
}
}
diff -c -r orig-kaffe-0.8.3/kaffe/kaffevm/thread.h kaffe-0.8.3/kaffe/kaffevm/thread.h
*** orig-kaffe-0.8.3/kaffe/kaffevm/thread.h Mon Apr 7 18:05:34 1997
--- kaffe-0.8.3/kaffe/kaffevm/thread.h Mon Apr 7 18:45:04 1997
***************
*** 48,54 ****
--- 48,58 ----
struct _thread** blockqueue;
uint8 flags;
void* exceptPtr;
+ #if defined(__hpux) && !defined(__GNUC__)
+ double align;
+ #else
double align[0]; /* for alignment (Gcc extension) */
+ #endif
} ctx;
extern ctx** threadContext;
-------------- next part --------------
; <bernard at edsug.com> 20-Mar-97
; The native HP compiler doesn't have inline assembler like GCC
; This is basically the same as the GCC version bar the fact we
; need a small routine to get at the stack pointer.
.LEVEL 1.1
.SPACE $TEXT$,SORT=8
.SUBSPA $CODE$,QUAD=0,ALIGN=4,ACCESS=0x2c,CODE_ONLY,SORT=24
.EXPORT parisc_threadswitch,ENTRY,PRIV_LEV=3,RTNVAL=GR
parisc_threadswitch
.PROC
.CALLINFO FRAME=192
.ENTRY
ldo 192(%r30),%r30
stw %r2,-180(0,%r30)
stw %r2,-176(0,%r30)
stw %r3,-172(0,%r30)
stw %r4,-168(0,%r30)
stw %r5,-164(0,%r30)
stw %r6,-160(0,%r30)
stw %r7,-156(0,%r30)
stw %r8,-152(0,%r30)
stw %r9,-148(0,%r30)
stw %r10,-144(0,%r30)
stw %r11,-140(0,%r30)
stw %r12,-136(0,%r30)
stw %r13,-132(0,%r30)
stw %r14,-128(0,%r30)
stw %r15,-124(0,%r30)
stw %r16,-120(0,%r30)
stw %r17,-116(0,%r30)
stw %r18,-112(0,%r30)
ldo -104(%r30),%r1
fstds,ma %fr12,8(0,%r1)
fstds,ma %fr13,8(0,%r1)
fstds,ma %fr14,8(0,%r1)
fstds,ma %fr15,8(0,%r1)
fstds,ma %fr16,8(0,%r1)
fstds,ma %fr17,8(0,%r1)
fstds,ma %fr18,8(0,%r1)
fstds,ma %fr19,8(0,%r1)
fstds,ma %fr20,8(0,%r1)
fstds,ma %fr21,8(0,%r1)
stw %r30,0(0,%r26)
ldw 0(0,%r25),%r30
ldw -172(0,%r30),%r3
ldw -168(0,%r30),%r4
ldw -164(0,%r30),%r5
ldw -160(0,%r30),%r6
ldw -156(0,%r30),%r7
ldw -152(0,%r30),%r8
ldw -148(0,%r30),%r9
ldw -144(0,%r30),%r10
ldw -140(0,%r30),%r11
ldw -136(0,%r30),%r12
ldw -132(0,%r30),%r13
ldw -128(0,%r30),%r14
ldw -124(0,%r30),%r15
ldw -120(0,%r30),%r16
ldw -116(0,%r30),%r17
ldw -112(0,%r30),%r18
ldo -104(%r30),%r1
fldds,ma 8(0,%r1),%fr12
fldds,ma 8(0,%r1),%fr13
fldds,ma 8(0,%r1),%fr14
fldds,ma 8(0,%r1),%fr15
fldds,ma 8(0,%r1),%fr16
fldds,ma 8(0,%r1),%fr17
fldds,ma 8(0,%r1),%fr18
fldds,ma 8(0,%r1),%fr19
fldds,ma 8(0,%r1),%fr20
fldds,ma 8(0,%r1),%fr21
ldw -180(0,%r30),%r2
comib,<> 0,%r2,__nodyncall
nop
ldw -176(0,%r30),%r22
ldo -192(%r30),%r30
b,n $$dyncall
__nodyncall
bv 0(%r2)
ldo -192(%r30),%r30
.EXIT
.PROCEND
.EXPORT parisc_get_sp,ENTRY,PRIV_LEV=3,RTNVAL=GR
parisc_get_sp
.PROC
.CALLINFO FRAME=0
.ENTRY
bv 0(%r2)
copy %r30,%r28
.EXIT
.PROCEND
.IMPORT $$dyncall
.END
More information about the kaffe
mailing list