[kaffe] RE: kaffe digest, Vol 1 #440 - 8 msgs

Claudio De Luca cdeluca@zeni.com.ar
Thu May 15 09:30:02 2003


-----Mensaje original-----
De: kaffe-request@kaffe.org [mailto:kaffe-request@kaffe.org]
Enviado el: Jueves 15 de Mayo de 2003 13:24
Para: kaffe@kaffe.org
Asunto: kaffe digest, Vol 1 #440 - 8 msgs


Send kaffe mailing list submissions to
	kaffe@kaffe.org

To subscribe or unsubscribe via the World Wide Web, visit
	http://kaffe.org/cgi-bin/mailman/listinfo/kaffe
or, via email, send a message with subject or body 'help' to
	kaffe-request@kaffe.org

You can reach the person managing the list at
	kaffe-admin@kaffe.org

When replying, please edit your Subject line so it is more specific
than "Re: Contents of kaffe digest..."


Today's Topics:

   1. Kaffe CVS: kaffe stack (Kaffe CVS)
   2. Re: Re: Decoding compiled class files (Mark Wielaard)
   3. Kaffe CVS: kaffe stack (Kaffe CVS)
   4. Re: Bug [CVS version]: class not found (Timothy Stack)
   5. Kaffe CVS: kaffe stack (Kaffe CVS)
   6. Re: java.lang.UnsatisfiedLinkError: not enough memory (Ito Kazumitsu)
   7. Re: (no subject) (Gerlando Falauto)
   8. [PATCH] IA-64 fixes (Gwenole Beauchesne)

--__--__--

Message: 1
From: Kaffe CVS <cvs-commits@kaffe.org>
To:  kaffe@kaffe.org
Reply-To: kaffe@kaffe.org
Date: Thu, 15 May 2003 08:03:25 -0700
Subject: [kaffe] Kaffe CVS: kaffe stack


CVSROOT:	/cvs/kaffe
Module name:	kaffe
Changes by:	stack	03/05/15 08:03:25

Modified files:
	.              : Makefile.am Makefile.in configure configure.in 
	config         : Makefile.in config.h.in 
	include        : Arrays.h Makefile.am Makefile.in errors.h 
	kaffe          : Makefile.in 
	kaffe/kaffe    : Makefile.in 
	kaffe/kaffevm/gcj: Makefile.in 
	kaffe/kaffevm/intrp: Makefile.in 
	kaffe/kaffevm/jit: Makefile.in 
	kaffe/kaffevm/jit3: Makefile.in 
	kaffe/kaffevm/systems: Makefile.in 
	kaffe/kaffevm/systems/beos-native: Makefile.in 
	kaffe/kaffevm/systems/oskit-pthreads: Makefile.in 
	kaffe/kaffevm/systems/unix-jthreads: Makefile.in 
	kaffe/kaffevm/systems/unix-pthreads: Makefile.in 
	kaffe/man      : Makefile.in 
	kaffe/scripts  : Makefile.in 
	kaffe/scripts/bat: Makefile.in 
	kaffe/scripts/compat: Makefile.in 
	kaffe/xprof    : Makefile.in 
	libraries      : Makefile.in 
	libraries/clib : Makefile.in 
	libraries/clib/awt: Makefile.in 
	libraries/clib/awt/X: Makefile.in 
	libraries/clib/awt/qt: Makefile.in 
	libraries/clib/io: Makefile.in 
	libraries/clib/management: Makefile.in 
	libraries/clib/math: Makefile.in 
	libraries/clib/native: Makefile.in 
	libraries/clib/net: InetAddressImpl.c Makefile.am Makefile.in 
	libraries/clib/security: Makefile.in 
	libraries/clib/zip: Makefile.in 
	libraries/extensions: Makefile.in 
	libraries/extensions/comm: Makefile.in 
	libraries/extensions/comm/javalib: Makefile.in 
	libraries/extensions/microsoft: Makefile.in 
	libraries/extensions/microsoft/clib: Makefile.in 
	libraries/extensions/microsoft/javalib: Makefile.in 
	libraries/extensions/pjava: Makefile.in 
	libraries/extensions/pjava/javalib: Makefile.in 
	libraries/extensions/servlet: Makefile.in 
	libraries/extensions/servlet/javalib: Makefile.in 
	libraries/extensions/sound: Makefile.in 
	libraries/extensions/sound/alsa: Makefile.in 
	libraries/extensions/sound/common: Makefile.in 
	libraries/extensions/sound/esd: Makefile.in 
	libraries/javalib: Klasses.jar.bootstrap Makefile.am Makefile.in 
	                   bootstrap.classlist essential.files 
	                   rebuildLib.in 
	libraries/javalib/java/lang: IllegalArgumentException.java 
	libraries/javalib/java/net: InetAddress.java 
	                            InetAddressImpl.java 
	                            NetworkInterface.java 
	                            UnknownHostException.java 
	libraries/javalib/profiles/allatonce: all.files 
	libraries/javalib/profiles/default: core.files 
	replace        : Makefile.in 
	test           : Makefile.in 
	test/internal  : Makefile.in 
	test/regression: Makefile.am Makefile.in 
Added files:
	FAQ            : FAQ.dns 
	libraries/clib/net: NetworkInterfaceImpl.c 
	libraries/javalib/java/net: DNSJavaInetAddressImpl.java 
	                            Inet4Address.java Inet6Address.java 
	                            NativeInetAddressImpl.java 
	                            NetworkInterfaceImpl.java 
	test/regression: InetAddressTest.java 

Log message:
2003-05-15 Tim Stack <stack@cs.utah.edu>

* Makefile.am:
Add DNSJAVA_JAR to the BUILD_ENVIRONMENT.

* configure.in:
Add --with-dnsjava option that lets the user specify a dnsjava Jar
file from www.xbill.org/dnsjava.

* FAQ/FAQ.dns:
Explanation of DNS stuff in kaffe.

* include/Arrays.h:
Add more unhand_*_array() macros.

* include/Makefile.am:
Add java_net_NativeInetAddressImpl.h and
java_net_NetworkInterfaceImpl.h.

* include/errors.h:
Add JAVA_NET() macro.

* libraries/clib/net/InetAddressImpl.c:
Rewrite to use getaddrinfo()/getnameinfo() and support the new
InetAddressImpl API.

* libraries/clib/net/Makefile.am:
Change NetworkInterface.c to NetworkInterfaceImpl.c.

* libraries/clib/net/NetworkInterface.c:
Renamed to NetworkInterfaceImpl.c.

* libraries/clib/net/NetworkInterfaceImpl.c:
Name change and add support for IPv6 addresses.

* libraries/javalib/Makefile.am:
Add support for pure java DNS.  Add Inet4Address/Inet6Address from
classpath.  Add NetworkInterfaceImpl.java.

* libraries/javalib/bootstrap.classlist:
Add java/net/NativeInetAddressImpl.class and
java/net/NetworkInterfaceImpl.class.

* libraries/javalib/essential.files,
libraries/javalib/profiles/alltatonce/all.files,
libraries/javalib/profiles/default/core.files:
Add java/net/NativeInetAddressImpl.java.

* libraries/javalib/rebuildLib.in:
Test for zero arguments and exit with zero.  Use the
BUILD_ENVIRONMENT for jikes too.

* libraries/javalib/java/lang/IllegalArgumentException.java:
Add exception chaining.

* libraries/javalib/java/net/DNSJavaInetAddressImpl.java:
InetAddressImpl that uses dnsjava from xbill.org.

* libraries/javalib/java/net/Inet4Address.java,
libraries/javalib/java/net/Inet6Address.java:
Merged from GNU classpath and fixed.

* libraries/javalib/java/net/InetAddress.java:
Add support for IPv6 addresses and multiple implementations.

* libraries/javalib/java/net/InetAddressImpl.java:
Changes to support IPv6 and multiple implementations.

* libraries/javalib/java/net/NativeInetAddressImpl.java:
Default native InetAddressImpl.

* libraries/javalib/java/net/NetworkInterface.java:
Move implementation details to NetworkInterfaceImpl.java and
detection is now done on every call instead of once at startup.

* libraries/javalib/java/net/NetworkInterfaceImpl.java:
Implementation details for NetworkInterface.java.

* libraries/javalib/java/net/UnknownHostException.java:
Add exception chaining.

* test/regression/InetAddressTest.java:
Simple test for InetAddresses.

* test/regression/Makefile.am:
Add InetAddressTest.java.



--__--__--

Message: 2
Subject: Re: [kaffe] Re: Decoding compiled class files
From: Mark Wielaard <mark@klomp.org>
To: wyattaw@optushome.com.au
Cc: kaffe@kaffe.org
Organization: 
Date: 15 May 2003 17:15:27 +0200


--=-sYOCLcdmFK5trYhrUV06
Content-Type: text/plain
Content-Transfer-Encoding: 7bit

Hi,

On Tue, 2003-05-13 at 16:24, Tony Wyatt wrote:
>
> I want something that decodes and prints out the entire contents of the
> .class file structure, so that I can see the variables, constants pool, 
> initialisation, operations performed by bytecode, etc, etc. 
> I'm trying to identify and then fix the difference of a single byte 
> between two very simple files.

gcj comes with jcf-dump. I believe jcf-dump -c does precisely what you
want. For example for your eexample (put into a main() method in a class
Test it gives the attached output.

Cheers,

Mark

--=-sYOCLcdmFK5trYhrUV06
Content-Disposition: inline; filename=jcf-dump-c.out
Content-Type: text/plain; name=jcf-dump-c.out; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit

Reading .class from ./Test.class.
Magic number: 0xcafebabe, minor_version: 0, major_version: 47.

Constant pool (count: 57):
#1: Class name: 2="Test"
#2: Utf8: "Test"
#3: Class name: 4="java/lang/Object"
#4: Utf8: "java/lang/Object"
#5: Utf8: "main"
#6: Utf8: "([Ljava/lang/String;)V"
#7: Utf8: "Code"
#8: Utf8: "LineNumberTable"
#9: Double QNaN(0), bits = 0x7ff8000000000000
#11: Long 9218869174563700736=0x7ff000abacab0000
#13: NameAndType name: 14=longBitsToDouble, signature: 15=(long)double
#14: Utf8: "longBitsToDouble"
#15: Utf8: "(J)D"
#16: Methodref class: 17=java.lang.Double name_and_type:
13=<longBitsToDouble (long)double>
#17: Class name: 18="java/lang/Double"
#18: Utf8: "java/lang/Double"
#19: Long -9223372036854775808=0x8000000000000000
#21: NameAndType name: 22=out, signature: 23=java.io.PrintStream
#22: Utf8: "out"
#23: Utf8: "Ljava/io/PrintStream;"
#24: Fieldref class: 25=java.lang.System name_and_type: 21=<out
java.io.PrintStream>
#25: Class name: 26="java/lang/System"
#26: Utf8: "java/lang/System"
#27: Class name: 28="java/lang/StringBuffer"
#28: Utf8: "java/lang/StringBuffer"
#29: String 30="x ="
#30: Utf8: "x ="
#31: NameAndType name: 32=<init>, signature: 33=(java.lang.String)void
#32: Utf8: "<init>"
#33: Utf8: "(Ljava/lang/String;)V"
#34: Methodref class: 27=java.lang.StringBuffer name_and_type: 31=<<init>
(java.lang.String)void>
#35: NameAndType name: 36=append, signature:
37=(double)java.lang.StringBuffer
#36: Utf8: "append"
#37: Utf8: "(D)Ljava/lang/StringBuffer;"
#38: Methodref class: 27=java.lang.StringBuffer name_and_type: 35=<append
(double)java.lang.StringBuffer>
#39: NameAndType name: 40=toString, signature: 41=()java.lang.String
#40: Utf8: "toString"
#41: Utf8: "()Ljava/lang/String;"
#42: Methodref class: 27=java.lang.StringBuffer name_and_type: 39=<toString
()java.lang.String>
#43: NameAndType name: 44=println, signature: 33=(java.lang.String)void
#44: Utf8: "println"
#45: Methodref class: 46=java.io.PrintStream name_and_type: 43=<println
(java.lang.String)void>
#46: Class name: 47="java/io/PrintStream"
#47: Utf8: "java/io/PrintStream"
#48: String 49="y ="
#49: Utf8: "y ="
#50: String 51="z ="
#51: Utf8: "z ="
#52: Utf8: "()V"
#53: NameAndType name: 32=<init>, signature: 52=()void
#54: Methodref class: 3=java.lang.Object name_and_type: 53=<<init> ()void>
#55: Utf8: "SourceFile"
#56: Utf8: "Test.java"

Access flags: 0x21 public super
This class: 1=Test, super: 3=java.lang.Object
Interfaces (count: 0):

Fields (count: 0):

Methods (count: 2):

Method name:"main" public static Signature: 6=(java.lang.String[])void
Attribute "Code", length:135, max_stack:4, max_locals:7, code_length:87
Attribute "LineNumberTable", length:30, count: 7

Method name:"<init>" public Signature: 52=()void
Attribute "Code", length:33, max_stack:1, max_locals:1, code_length:5
Attribute "LineNumberTable", length:10, count: 2

Attributes (count: 1):
Attribute "SourceFile", length:2, #56="Test.java"

--=-sYOCLcdmFK5trYhrUV06--



--__--__--

Message: 3
From: Kaffe CVS <cvs-commits@kaffe.org>
To:  kaffe@kaffe.org
Reply-To: kaffe@kaffe.org
Date: Thu, 15 May 2003 08:17:52 -0700
Subject: [kaffe] Kaffe CVS: kaffe stack


CVSROOT:	/cvs/kaffe
Module name:	kaffe
Changes by:	stack	03/05/15 08:17:52

Modified files:
	libraries/javalib: essential.files 

Log message:
add java/util/RandomAccess.java



--__--__--

Message: 4
Subject: Re: [kaffe] Bug [CVS version]: class not found
To: Herve.Roussain@univ-ubs.fr (=?ISO-8859-1?Q?Herv=E9_Roussain?=)
Date: Thu, 15 May 2003 09:25:58 -0600 (MDT)
Cc: kaffe@kaffe.org
From: Timothy Stack <stack@cs.utah.edu>

>=20
> Hi,

hi,

> I've just tried to compile the last CVS version, and I get this error=20
> message:
>
> (...)
> [ parsed kaffe/util/UTF8.java in 8 ms ]
> java/util/AbstractList.java:920: error:Cannot find class "RandomAccess"=
=20
> [JLS 8]

> This is because java/util/RandomAccess.java is not in essential.files,=20
> and the recently modified AbstractList.java use it.
>=20
> Solution: move the line "java/util/RandomAccess.java" from=20
> .../javalib/profiles/{default/core.files,allatonce/all.files) to=20
> .../javalib/essential.files
>=20
> I've tried, but it should work since RandomAccess have no other=20
> dependencies.

Done, thanks

> Cheers,
> Herv=E9

tim


--__--__--

Message: 5
From: Kaffe CVS <cvs-commits@kaffe.org>
To:  kaffe@kaffe.org
Reply-To: kaffe@kaffe.org
Date: Thu, 15 May 2003 08:22:46 -0700
Subject: [kaffe] Kaffe CVS: kaffe stack


CVSROOT:	/cvs/kaffe
Module name:	kaffe
Changes by:	stack	03/05/15 08:22:45

Modified files:
	libraries/javalib/profiles/allatonce: all.files 
	libraries/javalib/profiles/default: core.files 

Log message:
moved to essential.files



--__--__--

Message: 6
From: Ito Kazumitsu <kaz@maczuka.gcd.org>
To: kaffe@kaffe.org
Subject: Re: [kaffe] java.lang.UnsatisfiedLinkError: not enough memory
Date: Fri, 16 May 2003 01:23:07 +0900

>>>>> ":" == Ito Kazumitsu <kaz@maczuka.gcd.org> writes:

:> The "java.lang.UnsatisfiedLinkError: not enough memory" error
:> occurs on my machene:
:> 
:> bash-2.05b$ uname -a
:> FreeBSD ph.maczuka.gcd.org 4.7-RELEASE FreeBSD 4.7-RELEASE #0: Wed Oct  9
15:08:34 GMT 2002
root@builder.freebsdmall.com:/usr/obj/usr/src/sys/GENERIC  i386

This time I used Doug Lea's malloc-2.6.5 instead of FreeBSD's malloc.

The AWT program did not run, either.  But the error message changed:

bash-2.05b$ LD_LIBRARY_PATH=/usr/local/kaffe/jre/lib/i386 java
org.hsqldb.util.DatabaseManager
accessing free page 0x854bffc (above 0x804c000)
Abort trap (core dumped)



--__--__--

Message: 7
Date: Thu, 15 May 2003 18:24:35 +0200 (CEST)
From: Gerlando Falauto <iurly@writeme.com>
To: Timothy Stack <stack@cs.utah.edu>
Cc: <kaffe@kaffe.org>
Subject: Re: [kaffe] (no subject)

Hi Tim,

thanks a lot for your impressively quick response!
I checked out the test/internal directory and it seems pretty much what I 
need. 

I got a minor problem though, I have been working on version 1.0.7 (the
head version seemed far too big and complicated to try working on that), 
so I kinda don't know how to merge it in my sandbox... I tried simply 
adding test/internal/Makefile to configure, but on make I get some weird:

Makefile:364: *** missing separator.  Stop.

where Makefile:364 says

@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jitBasic.Po@am__quote@

Any ideas how to fix that? I know this has nothing to do with kaffe,
but a little help could save me at least a whole day otherwise spent 
trying to figure out all the Automake/Autoconf/Configure/whatever magic
stuff.

Thanks again!
Gerlando



--__--__--

Message: 8
Date: Thu, 15 May 2003 18:26:30 +0200 (CEST)
From: Gwenole Beauchesne <gbeauchesne@mandrakesoft.com>
To: kaffe@kaffe.org
Subject: [kaffe] [PATCH] IA-64 fixes

Hi,

The sysdepCallMethod() tester I posted earlier triggered a few bugs in the 
IA-64 version. Fixed hereunder among other fixlets. Patch against 1.1 CVS 
(2003/05/14). No regressions, no improvement either. :-(

BTW, we probably need proper NEED_JTHREAD_ALIGN, JTHREAD macros to align a 
new thread context, in case the enclosed jmp_buf needs special treatments.

2003-05-15  Gwenole Beauchesne  <gbeauchesne@mandrakesoft.com>

	* config/config-setjmp.h (JTHREAD_DECLARE_JMPBUF,
	JTHREAD_ACCESS_JMPBUF): Kill.
	* kaffe/kaffevm/exception.c (dispatchException): Likewise.
	* kaffe/kaffevm/exception.h (vmExcept_jumpToHandler): Likewise.
	* kaffe/kaffevm/jni.c (BEGIN_EXCEPTION_HANDLING*): Likewise.
	
	Instead, the jthread struct containing a jmp_buf must be aligned
	once it is allocated. Other occurrences were already aligned per
	natural alignment requirements in stack.

	* config/ia64/linux/md.c (IA64_context_*): Update to match current
	state-threads v1.4 code from SGI.

	* config/ia64/sysdepCallMethod.h (sysdepCallMethod): Really match
	calling conventions. We now can deal with a mix of ints, longs,
	floats and doubles correctly. Reindent.

	* kaffe/kaffevm/systems/unix-jthreads/jthread.c
	(JTHREAD_CONTEXT_SAVE, JTHREAD_CONTEXT_RESTORE): New macros
	specific to context switches.
	(newThreadCtx): Align jthread struct on 16-byte boundaries for
	jmp_buf. Move down stack adjusting.

--- kaffe-1.1.orig/config/config-setjmp.h	2002-05-29
21:46:23.000000000 +0200
+++ kaffe-1.1/config/config-setjmp.h	2003-05-14 21:39:29.000000000 +0200
@@ -90,12 +90,4 @@ typedef void* kaffe_jmp_buf[JTHREAD_JBLE
 
 #endif
 
-#if defined(__ia64__)
-#define JTHREAD_DECLARE_JMPBUF(x)	JTHREAD_JMPBUF x; void * x##_pad
-#define JTHREAD_ACCESS_JMPBUF(x, y)	(__typeof__((x)->y[0]) *)
((((unsigned long)&(x)->y) + 15) & -16)
-#else
-#define JTHREAD_DECLARE_JMPBUF(x)	JTHREAD_JMPBUF x
-#define JTHREAD_ACCESS_JMPBUF(x, y)	(x)->y
-#endif
-
 #endif
--- kaffe-1.1.orig/config/ia64/linux/md.c	2002-05-29
21:49:58.000000000 +0200
+++ kaffe-1.1/config/ia64/linux/md.c	2003-05-15 21:43:25.000000000 +0200
@@ -29,7 +29,8 @@ init_md(void)
 }
 
 /*
- * Copyright (C) 2000 Silicon Graphics, Inc.  All Rights Reserved.
+ * Portions created by SGI are Copyright (C) 2000 Silicon Graphics, Inc.
+ * All Rights Reserved.
  *
  * The internal __jmp_buf layout is different from one used
  * by setjmp()/longjmp().
@@ -92,8 +93,8 @@ init_md(void)
         asm("
         .text
         .align 32
-        .global IA64_context_save#
-        .proc IA64_context_save#
+        .global IA64_context_save
+        .proc IA64_context_save
 IA64_context_save:
         alloc r14 = ar.pfs,1,0,0,0
         mov r16 = ar.unat
@@ -103,6 +104,7 @@ IA64_context_save:
         add r3 = 8,in0
         ;;
         st8.spill.nta [r2] = sp,16    // r12 (sp)
+        ;;
         st8.spill.nta [r3] = gp,16    // r1  (gp)
         ;;
         st8.nta [r2] = r16,16         // save caller's unat
@@ -110,6 +112,7 @@ IA64_context_save:
         add r8 = 0xb0,in0
         ;;   
         st8.spill.nta [r2] = r4,16    // r4
+        ;;
         st8.spill.nta [r3] = r5,16    // r5
         add r9 = 0xc0,in0
         ;;
@@ -150,11 +153,14 @@ IA64_context_save:
         ;;
         stf.spill.nta [r8] = f30
         stf.spill.nta [r9] = f31
+
         st8.spill.nta [r2] = r6,16    // r6
+        ;;
         st8.spill.nta [r3] = r7,16    // r7
         ;;
         mov r23 = ar.bsp
         mov r25 = ar.unat
+
         st8.nta [r2] = r15,16         // b0
         st8.nta [r3] = r17,16         // b1
         ;;
@@ -189,15 +195,17 @@ IA64_context_save:
         ;;
         mov r8 = 0
         br.ret.sptk.few b0
-        .endp IA64_context_save#
+        .endp IA64_context_save
         ");
 
+
+/****************************************************************/
+
         /* IA64_context_restore(__jmp_buf env, int val) */
         asm("
         .text
-        .align 32
-        .global IA64_context_restore#
-        .proc IA64_context_restore#
+        .global IA64_context_restore
+        .proc IA64_context_restore
 IA64_context_restore:
         alloc r8 = ar.pfs,2,0,0,0
         add r2 = 0x88,in0             // r2 <- &jmpbuf.ar_bsp
@@ -296,7 +304,10 @@ IA64_context_restore:
         ldf.fill.nta f31 = [r3]
 (p6)    mov r8 = 1
 (p7)    mov r8 = in1
+
         mov pr = r24,-1
         br.ret.sptk.few b0
-        .endp IA64_context_restore#
+        .endp IA64_context_restore
         ");
+
+/****************************************************************/
--- kaffe-1.1.orig/config/ia64/linux/md.h	2002-05-29
21:49:58.000000000 +0200
+++ kaffe-1.1/config/ia64/linux/md.h	2003-05-15 21:51:34.000000000 +0200
@@ -27,10 +27,10 @@ extern int IA64_context_save(jmp_buf env
 extern void IA64_context_restore(jmp_buf env, int val);
 
 #if 0
-#undef JTHREAD_SETJMP
-#define JTHREAD_SETJMP(env)			IA64_context_save((env))
-#undef JTHREAD_LONGJMP
-#define JTHREAD_LONGJMP(env, val)		IA64_context_restore((env),
(val))
+#undef  JTHREAD_CONTEXT_SAVE
+#define JTHREAD_CONTEXT_SAVE(env)		IA64_context_save((env))
+#undef  JTHREAD_CONTEXT_RESTORE
+#define JTHREAD_CONTEXT_RESTORE(env, val)	IA64_context_restore((env),
(val))
 #endif
 
 #define SIGNAL_ARGS(sig, scp)			int sig, siginfo_t *sip,
struct sigcontext *scp
--- kaffe-1.1.orig/config/ia64/sysdepCallMethod.h	2002-05-29
21:49:58.000000000 +0200
+++ kaffe-1.1/config/ia64/sysdepCallMethod.h	2003-05-15
21:24:55.000000000 +0200
@@ -2,7 +2,7 @@
  * ia64/sysdepCallMethod.h
  * Dynamically build function calls using IA-64 SVR4 ABI.
  *
- * Copyright (c) 2001
+ * Copyright (c) 2001-2003
  *	MandrakeSoft.  All rights reserved.
  *
  * See the file "license.terms" for information on usage and redistribution
@@ -37,6 +37,10 @@
 /* ARG_LIST is the argument list for such a function.  */
 #define ARG_LIST	a0, a1, a2, a3, a4, a5, a6, a7
 
+/* REG_ARGS is the total number of arguments passed in registers,
+   including both GPR and FPR.  */
+#define REG_ARGS	8
+
 /* GPR_ARGS is the number of GPR (integer) registers for passing
    arguments.  */
 #define GPR_ARGS	8
@@ -45,11 +49,6 @@
    arguments.  */
 #define FPR_ARGS	8
 
-/* ARG_DISPLACEMENT is the offset between the beginning of a
-   variable-sized array, allocated in the stack, and the position of
-   the first argument that can't be passed in a register.  */
-#define ARG_DISPLACEMENT	0
-
 /* ARG_GPR a case label and a statement that arranges for one integer
    argument to be passed. */
 #define ARG_GPR(N) \
@@ -67,176 +66,173 @@
    for both JIT and Interpreter (since stubs have now been deprecated).  */
 static inline void sysdepCallMethod(callMethodInfo* call)
 {
-    void *func = call->function;
-    jvalue *callargs = call->args;
-    char *calltype = call->calltype;
-    jvalue *args = callargs;
-    jvalue *last = &callargs[call->nrargs];
-    int nr_gpr = 0;
-    int nr_fpr = 0;
-    int nr_stack = 0;
-
-    unsigned long *stack;
-    unsigned long *gpr;
-    double *fpr;
-
-    /* Compute gpr[], fpr[] and stack[] arrays' size */
-    while (args != last) {
-	  switch (calltype[(args++) - callargs]) {
-	  case 'F':
-	  case 'D':
-		if (nr_fpr < FPR_ARGS) {
-		  nr_fpr++;
-		  nr_gpr++;
-		}
-		else
-		  nr_stack++;
-		break;
-		
-	  default:
-		if (nr_gpr < GPR_ARGS)
-		  nr_gpr++;
-		else
-		  nr_stack++;
-		break;
-	  }
-	}
-
-    /* Allocate all arrays with one big alloca() */
-    {
-	  int nr = nr_gpr + nr_fpr + nr_stack;
-	  
-	  /* stack, if used, must be 16 bytes aligned */
-	  if (nr_stack)
-		nr = (nr + 1) & ~1;
-
-	  /* stack[] is in called parameters area.  */
-	  stack = __builtin_alloca (8 * nr);
-
-	  /* gpr[] and fpr[] are in callee local variable area.  */
-	  gpr = stack + nr_stack;
-	  fpr = (double *)(gpr + nr_gpr);
-	  
-	  /* if __buildin_alloc() does not handle link-area, skip it.  */
-	  stack += ARG_DISPLACEMENT;
-    }
-
-    /* build gpr[], fpr[] and stack[] arrays */
-    nr_gpr = 0;
-	nr_fpr = 0;
-	nr_stack = 0;
-	
-    args = callargs;
-    while (args != last) {
-	  switch (calltype[args - callargs]) {
-	  case 'F': {
-		jvalue value = { .d = (double)args->f };
-		if (nr_fpr < FPR_ARGS) {
-		  fpr[nr_fpr++] = value.d;
-		  gpr[nr_gpr++] = value.j;
-		}
-		else {
-		  *(float *)stack = value.d;
-		  stack++;
-		}
-		break;
-	  }
-	  
-	  case 'D': {
-		jvalue value = { .d = args->d };
-	    if (nr_fpr < FPR_ARGS) {
-		  fpr[nr_fpr++] = value.d;
-		  gpr[nr_gpr++] = value.j;
-	    }
-		else {
-		  *(double *)stack = value.d;
-		  stack++;
-		}
-		break;
-	  }
-	  
-	  default:
-		if (nr_gpr < GPR_ARGS)
-		  gpr[nr_gpr++] = args->j;
-		else
-		  *stack++ = args->j;
-	  }
-	  args++;
-    }
-
-    {
-	  register ARG_TYPE a0 asm("out0");
-	  register ARG_TYPE a1 asm("out1");
-	  register ARG_TYPE a2 asm("out2");
-	  register ARG_TYPE a3 asm("out3");
-	  register ARG_TYPE a4 asm("out4");
-	  register ARG_TYPE a5 asm("out5");
-	  register ARG_TYPE a6 asm("out6");
-	  register ARG_TYPE a7 asm("out7");
-	  
-	  register double d0 asm("f8");
-	  register double d1 asm("f9");
-	  register double d2 asm("f10");
-	  register double d3 asm("f11");
-	  register double d4 asm("f12");
-	  register double d5 asm("f13");
-	  register double d6 asm("f14");
-	  register double d7 asm("f15");
-	  
-	  /* load FPR registers from fpr[] */
-	  switch (nr_fpr) {
-		ARG_FPR(7);
-		ARG_FPR(6);
-		ARG_FPR(5);
-		ARG_FPR(4);
-		ARG_FPR(3);
-		ARG_FPR(2);
-		ARG_FPR(1);
-		ARG_FPR(0);
-	  case 0:;
-	  }
-
-	  /* load GPR registers from gpr[] */
-	  switch (nr_gpr) {
-		ARG_GPR(7);
-		ARG_GPR(6);
-		ARG_GPR(5);
-		ARG_GPR(4);
-		ARG_GPR(3);
-		ARG_GPR(2);
-		ARG_GPR(1);
-		ARG_GPR(0);
-	  case 0:;
-	  }
-	  
-	  /* Ensure that the assignments to f* registers won't be optimized
away. */
-	  asm ("" ::
-		   "f" (d0), "f" (d1), "f" (d2), "f" (d3),
-		   "f" (d4), "f" (d5), "f" (d6), "f" (d7));
-
-	  switch(call->retsize) {
-	  case 0:
-	    /* Must be void.  */
-	    ((void (*)(ARG_TYPES))(func))(ARG_LIST);
-	    break;
-		
-	  case 1:
-	    if (call->rettype == 'F')
-		  call->ret->f = ((jfloat (*)(ARG_TYPES))(func))(ARG_LIST);
-	    else /* Must be 32-bit or smaller int.  */
-		  call->ret->i = ((jint (*)(ARG_TYPES))(func))(ARG_LIST);
-	    break;
-
-	  default:
-	    /* It could've been `case 2;', but then we'd get an additional
cmp
-	     * that we don't really need.  */
-	    if (call->rettype == 'D')
-		  call->ret->d = ((jdouble (*)(ARG_TYPES))(func))(ARG_LIST);
-	    else /* Must be jlong.  */
-		  call->ret->j = ((jlong (*)(ARG_TYPES))(func))(ARG_LIST);
-	    break;
-	  }
+  void *func = call->function;
+  jvalue *callargs = call->args;
+  char *calltype = call->calltype;
+  jvalue *args = callargs;
+  jvalue *last = &callargs[call->nrargs];
+  int nr_gpr = 0;
+  int nr_fpr = 0;
+  int nr_stack = 0;
+
+  unsigned long *stack;
+  unsigned long gpr[GPR_ARGS];
+  double fpr[FPR_ARGS];
+
+  /* Compute gpr[], fpr[] and stack[] arrays' size */
+  while (args != last) {
+    switch (calltype[(args++) - callargs]) {
+    case 'F':
+    case 'D':
+      if (nr_gpr + nr_fpr < REG_ARGS) {
+	nr_fpr++;
+	nr_gpr++;
+      }
+      else
+	nr_stack++;
+      break;
+
+    default:
+      if (nr_gpr + nr_fpr < REG_ARGS)
+	nr_gpr++;
+      else
+	nr_stack++;
+      break;
+    }
+  }
+
+  /* Allocate all arrays with one big alloca() */
+  {
+    int nr = nr_stack;
+
+    /* stack, if used, must be 16 bytes aligned */
+    if (nr_stack)
+      nr = (nr + 1) & ~1;
+
+    /* stack[] is in called parameters area.  */
+    stack = __builtin_alloca (8 * nr);
+  }
+
+  /* build gpr[], fpr[] and stack[] arrays */
+  nr_gpr = 0;
+  nr_fpr = 0;
+  nr_stack = 0;
+
+  args = callargs;
+  while (args != last) {
+    switch (calltype[args - callargs]) {
+    case 'F': {
+      jvalue value = { .d = (double)args->f };
+      if (nr_gpr + nr_fpr < REG_ARGS) {
+	fpr[nr_fpr++] = value.d;
+	/* Also pass the FP slot in GPR so that callee knows
+	   about it in case it was not prototyped beforehand. */
+	gpr[nr_gpr++] = value.j;
+      }
+      else {
+	*(float *)stack = value.d;
+	stack++;
+      }
+      break;
+    }
+
+    case 'D': {
+      jvalue value = { .d = args->d };
+      if (nr_gpr + nr_fpr < REG_ARGS) {
+	fpr[nr_fpr++] = value.d;
+	/* Also pass the FP slot in GPR so that callee knows
+	   about it in case it was not prototyped beforehand. */
+	gpr[nr_gpr++] = value.j;
+      }
+      else {
+	*(double *)stack = value.d;
+	stack++;
+      }
+      break;
+    }
+
+    default:
+      if (nr_gpr + nr_fpr < REG_ARGS)
+	gpr[nr_gpr++] = args->j;
+      else
+	*stack++ = args->j;
+    }
+    args++;
+  }
+
+  {
+    register ARG_TYPE a0 asm("out0");
+    register ARG_TYPE a1 asm("out1");
+    register ARG_TYPE a2 asm("out2");
+    register ARG_TYPE a3 asm("out3");
+    register ARG_TYPE a4 asm("out4");
+    register ARG_TYPE a5 asm("out5");
+    register ARG_TYPE a6 asm("out6");
+    register ARG_TYPE a7 asm("out7");
+
+    register double d0 asm("f8");
+    register double d1 asm("f9");
+    register double d2 asm("f10");
+    register double d3 asm("f11");
+    register double d4 asm("f12");
+    register double d5 asm("f13");
+    register double d6 asm("f14");
+    register double d7 asm("f15");
+
+    /* load FPR registers from fpr[] */
+    switch (nr_fpr) {
+      ARG_FPR(7);
+      ARG_FPR(6);
+      ARG_FPR(5);
+      ARG_FPR(4);
+      ARG_FPR(3);
+      ARG_FPR(2);
+      ARG_FPR(1);
+      ARG_FPR(0);
+    case 0:;
+    }
+
+    /* load GPR registers from gpr[] */
+    switch (nr_gpr) {
+      ARG_GPR(7);
+      ARG_GPR(6);
+      ARG_GPR(5);
+      ARG_GPR(4);
+      ARG_GPR(3);
+      ARG_GPR(2);
+      ARG_GPR(1);
+      ARG_GPR(0);
+    case 0:;
+    }
+
+    /* Ensure that the assignments to f* registers won't be optimized away.
*/
+    asm ("" ::
+	 "f" (d0), "f" (d1), "f" (d2), "f" (d3),
+	 "f" (d4), "f" (d5), "f" (d6), "f" (d7));
+
+    switch(call->retsize) {
+    case 0:
+      /* Must be void.  */
+      ((void (*)(ARG_TYPES))(func))(ARG_LIST);
+      break;
+
+    case 1:
+      if (call->rettype == 'F')
+	call->ret->f = ((jfloat (*)(ARG_TYPES))(func))(ARG_LIST);
+      else /* Must be 32-bit or smaller int.  */
+	call->ret->i = ((jint (*)(ARG_TYPES))(func))(ARG_LIST);
+      break;
+
+    default:
+      /* It could've been `case 2;', but then we'd get an additional cmp
+       * that we don't really need.  */
+      if (call->rettype == 'D')
+	call->ret->d = ((jdouble (*)(ARG_TYPES))(func))(ARG_LIST);
+      else /* Must be jlong.  */
+	call->ret->j = ((jlong (*)(ARG_TYPES))(func))(ARG_LIST);
+      break;
     }
+  }
 }
 
 #undef ARG_TYPE
--- kaffe-1.1.orig/kaffe/kaffevm/exception.c	2002-10-18
15:54:14.000000000 +0200
+++ kaffe-1.1/kaffe/kaffevm/exception.c	2003-05-14 20:54:41.000000000 +0200
@@ -452,7 +452,7 @@ DBG(ELOOKUP,
 
 			/* If not here, exit monitor if synchronised. */
 			if (obj != 0 && (einfo.method->accflags &
ACC_SYNCHRONISED) != 0) {
-				_slowUnlockMutexIfHeld(&obj->lock,
JTHREAD_ACCESS_JMPBUF(frame, jbuf));
+				_slowUnlockMutexIfHeld(&obj->lock,
frame->jbuf);
 			}
 		}
 	}
--- kaffe-1.1.orig/kaffe/kaffevm/exception.h	2003-01-06
18:14:19.000000000 +0100
+++ kaffe-1.1/kaffe/kaffevm/exception.h	2003-05-14 20:55:29.000000000 +0200
@@ -92,7 +92,7 @@ typedef struct VmExceptHandler {
 	u4				pc;
 		} intrp;
 	} frame;
-	JTHREAD_DECLARE_JMPBUF		(jbuf);
+	JTHREAD_JMPBUF		jbuf;
 } VmExceptHandler;
 
 #define VMEXCEPTHANDLER_KAFFEJNI_HANDLER ((struct _methods*)1)
@@ -156,7 +156,7 @@ vmExcept_setJNIFrame(VmExceptHandler* eh
 static inline void
 vmExcept_jumpToHandler(VmExceptHandler* frame)
 {
-	JTHREAD_LONGJMP(JTHREAD_ACCESS_JMPBUF(frame, jbuf), 1);
+	JTHREAD_LONGJMP(frame->jbuf, 1);
 }
 
 #if defined(INTERPRETER)
--- kaffe-1.1.orig/kaffe/kaffevm/jni.c	2003-01-06 18:14:20.000000000 +0100
+++ kaffe-1.1/kaffe/kaffevm/jni.c	2003-05-14 20:54:17.000000000 +0200
@@ -131,7 +131,7 @@ getMethodFunc (Method* meth, Hjava_lang_
 	VmExceptHandler ebuf;				\
 	KAFFE_JNI_SETEXCEPTFP(&ebuf); 			\
 	ebuf.prev =
(VmExceptHandler*)(unhand(getCurrentThread())->exceptPtr);\
-	if (JTHREAD_SETJMP(JTHREAD_ACCESS_JMPBUF(&ebuf, jbuf)) != 0) {
\
+	if (JTHREAD_SETJMP(ebuf.jbuf) != 0) {		\
 		unhand(getCurrentThread())->exceptPtr = \
 		  (struct Hkaffe_util_Ptr*)ebuf.prev;	\
 		return X;				\
@@ -142,7 +142,7 @@ getMethodFunc (Method* meth, Hjava_lang_
 	VmExceptHandler ebuf; 				\
 	KAFFE_JNI_SETEXCEPTFP(&ebuf); 			\
 	ebuf.prev =
(VmExceptHandler*)(unhand(getCurrentThread())->exceptPtr);\
-	if (JTHREAD_SETJMP(JTHREAD_ACCESS_JMPBUF(&ebuf, jbuf)) != 0) {
\
+	if (JTHREAD_SETJMP(ebuf.jbuf) != 0) {		\
 		unhand(getCurrentThread())->exceptPtr = \
 		  (struct Hkaffe_util_Ptr*)ebuf.prev;	\
 		return;					\
--- kaffe-1.1.orig/kaffe/kaffevm/systems/unix-jthreads/jthread.c
2003-03-11 09:00:19.000000000 +0100
+++ kaffe-1.1/kaffe/kaffevm/systems/unix-jthreads/jthread.c	2003-05-15
21:49:36.000000000 +0200
@@ -123,6 +123,14 @@ static int  min_priority;		/* minimum su
 
 jthread* currentJThread;
 
+/* Context switch related functions */
+#ifndef JTHREAD_CONTEXT_SAVE
+#define JTHREAD_CONTEXT_SAVE(buf)		JTHREAD_SETJMP((buf))
+#endif
+#ifndef JTHREAD_CONTEXT_RESTORE
+#define JTHREAD_CONTEXT_RESTORE(buf, val)	JTHREAD_LONGJMP((buf),
(val))
+#endif
+
 /* The arguments to a signal handler */
 #ifndef SIGNAL_ARGS
 #define SIGNAL_ARGS(sig, sc) int sig
@@ -898,10 +906,14 @@ newThreadCtx(int stackSize)
 {
 	jthread *ct;
 
-	ct = allocator(sizeof(jthread) + stackSize);
+	ct = allocator(sizeof(jthread) + 16 + stackSize);
 	if (ct == 0) {
 		return 0;
 	}
+#if defined(__ia64__)
+	/* (gb) Align jmp_buf on 16-byte boundaries */
+	ct = (jthread *)((((unsigned long)(ct)) & 15) ^ (unsigned
long)(ct));
+#endif
 	ct->stackBase = (ct + 1);
 	ct->stackEnd = (char *) ct->stackBase + stackSize;
 	ct->restorePoint = ct->stackEnd;
@@ -1269,12 +1281,6 @@ jthread_create(unsigned char pri, void (
 	void	*oldbsp, *newbsp;
 #endif
 	size_t   page_size;
-	
-	/* Adjust stack size */
-	page_size = getpagesize();
-	if (threadStackSize == 0)
-		threadStackSize = THREADSTACKSIZE;
-	threadStackSize = (threadStackSize + page_size - 1) & -page_size;
 
 	/*
 	 * Disable stop to protect the threadLock lock, and prevent
@@ -1283,6 +1289,12 @@ jthread_create(unsigned char pri, void (
 	 */
 	jthread_disable_stop();
 
+	/* Adjust stack size */
+	page_size = getpagesize();
+	if (threadStackSize == 0)
+		threadStackSize = THREADSTACKSIZE;
+	threadStackSize = (threadStackSize + page_size - 1) & -page_size;
+
 	jmutex_lock(&threadLock);
 	jtid = newThreadCtx(threadStackSize);
 	if (!jtid) {
@@ -1319,7 +1331,7 @@ DBG(JTHREAD,
 	 *
 	 * To be safe, we immediately call a new function.
 	 */
-        if (JTHREAD_SETJMP(JTHREAD_ACCESS_JMPBUF(jtid, env))) {
+        if (JTHREAD_CONTEXT_SAVE(jtid->env)) {
 		/* new thread */
 		start_this_sucker_on_a_new_frame();
 		assert(!"Never!");
@@ -1330,9 +1342,9 @@ DBG(JTHREAD,
 	SAVE_FP(jtid->fpstate);
 #endif
 	/* set up context for new thread */
-	oldstack = GET_SP(JTHREAD_ACCESS_JMPBUF(jtid, env));
+	oldstack = GET_SP(jtid->env);
 #if defined(__ia64__)
-	oldbsp = GET_BSP(JTHREAD_ACCESS_JMPBUF(jtid, env));
+	oldbsp = GET_BSP(jtid->env);
 #endif
 
 #if defined(STACK_GROWS_UP)
@@ -1348,7 +1360,7 @@ DBG(JTHREAD,
 	 * grows downward. Both stacks start in the middle and grow outward
 	 * from each other.
 	 */
-	newstack -= (threadStackSize >> 1);
+	(char *) newstack -= (threadStackSize >> 1);
 	newbsp = newstack;
 	/* Make register stack 64-byte aligned */
 	if ((unsigned long)newbsp & 0x3f)
@@ -1364,9 +1376,9 @@ DBG(JTHREAD,
 	newstack = (void *) STACK_ALIGN(newstack);
 #endif
 
-	SET_SP(JTHREAD_ACCESS_JMPBUF(jtid, env), newstack);
+	SET_SP(jtid->env, newstack);
 #if defined(__ia64__)
-	SET_BSP(JTHREAD_ACCESS_JMPBUF(jtid, env), newbsp);
+	SET_BSP(jtid->env, newbsp);
 #endif
 
 #if defined(SET_BP)
@@ -1374,13 +1386,13 @@ DBG(JTHREAD,
 	 * Clear the base pointer in the new thread's stack.
 	 * Nice for debugging, but not strictly necessary.
 	 */
-	SET_BP(JTHREAD_ACCESS_JMPBUF(jtid, env), 0);
+	SET_BP(jtid->env, 0);
 #endif
 
 
 #if defined(FP_OFFSET)
 	/* needed for: IRIX */
-	SET_FP(JTHREAD_ACCESS_JMPBUF(jtid, env), newstack + ((void
*)GET_FP(JTHREAD_ACCESS_JMPBUF(jtid, env)) - oldstack));
+	SET_FP(jtid->env, newstack + ((void *)GET_FP(jtid->env) -
oldstack));
 #endif
 
         resumeThread(jtid);
@@ -1627,9 +1639,10 @@ dprintf("switch from %p to %p\n", lastTh
 #if defined(CONTEXT_SWITCH)
 				CONTEXT_SWITCH(lastThread, currentJThread);
 #else
-				if
(JTHREAD_SETJMP(JTHREAD_ACCESS_JMPBUF(lastThread, env)) == 0) {
-				    lastThread->restorePoint =
GET_SP(JTHREAD_ACCESS_JMPBUF(lastThread, env));
-
JTHREAD_LONGJMP(JTHREAD_ACCESS_JMPBUF(currentJThread, env), 1);
+				if (JTHREAD_CONTEXT_SAVE(lastThread->env) ==
0) {
+				    lastThread->restorePoint = 
+					GET_SP(lastThread->env);
+
JTHREAD_CONTEXT_RESTORE(currentJThread->env, 1);
 				}
 #endif
 #if defined(LOAD_FP)
--- kaffe-1.1.orig/kaffe/kaffevm/systems/unix-jthreads/jthread.h
2002-11-27 19:32:55.000000000 +0100
+++ kaffe-1.1/kaffe/kaffevm/systems/unix-jthreads/jthread.h	2003-05-14
20:48:41.000000000 +0200
@@ -90,7 +90,7 @@ typedef struct _jthread {
 	 * used to hold the current Java thread
 	 */
 	void*				jlThread;
-	JTHREAD_DECLARE_JMPBUF		(env);
+	JTHREAD_JMPBUF			env;
 #if defined(SAVED_FP_SIZE)
 	char				fpstate[SAVED_FP_SIZE];
 #endif




--__--__--

_______________________________________________
kaffe mailing list
kaffe@kaffe.org
http://kaffe.org/cgi-bin/mailman/listinfo/kaffe


End of kaffe Digest