Very nice Torok! I applied most of the patch. A few comments: 1) What is your jni.h file? I can't compile the Jni.cpp file with your changes. 2) ISO C++ does not support %jd. x86_64 does not know about %lld? Thanks! Nicolas Török Edwin wrote:> Nicolas Geoffray wrote: > >> Hi everyone, >> >> I've just checked in a JVM and a CLI for LLVM (called JnJVM and N3). >> Both are placed in the vmkit svn directory. >> You can find the source code here: >> >> > > Very nice! > >> svn co http://llvm.org/svn/llvm-project/vmkit/trunk vmkit >> >> Its licensed under the U of I Open Source License, so now that's in svn, >> you can change whatever you want, as long as HelloWorld.java and >> HelloWorld.cs work ;-) >> >> I haven't tested the build process on many machines, mostly on gentoo >> linux/x86 and linux/ppc. There are probably some dev libs that VMKit >> requires and the configure script does not check. A good thing would be >> to make the build process cleaner. >> > > The code is not 64-bit clean, attached is a patch to get it compile on > x86-64 Linux. > I also fixed some g++-4.2 warnings (const issues, symbol visibility). > > The libJnJVM directory builds, but it won't run, I get endless messages > like this: > ; ****************************************************** ; > ; SIGSEGV occured during a collection ; > ; I'm trying to let the allocator in a coherent stat ; > ; but the collector is DEAD and will never collect again ; > ; ****************************************************** ; > > Probably there are more 64-bit issues to solve. Unfortunately I don't > have time to look into this deeper now. > > Best regards, > --Edwin > ------------------------------------------------------------------------ > > This body part will be downloaded on demand.
Nicolas Geoffray wrote:> Very nice Torok! I applied most of the patch. A few comments: >Thanks!> 1) What is your jni.h file? I can't compile the Jni.cpp file with your > changes. >Ouch, did they change 'const'-ness between gcj versions? I was using gcj-4.2.3, and jni.h is from libgcj8-dev.> 2) ISO C++ does not support %jd. x86_64 does not know about %lld? >It does, but gcc gives a warning, if I use %lld I get a warning on x86_64, if I %ld I get a warning on x86-32. int64_t is long int on x86-64. However sizeof(long int) == sizeof(long long int), so I don't know why gcc insists it is wrong. I only found %jd which doesn't give warnings on either: #include <stdio.h> #include <stdint.h> int main() { int64_t x=0; printf("%ld",x); printf("%lld",x); printf("%jd",x); return 0; } $ gcc -Wall -O2 p.c p.c: In function ‘main’: p.c:7: warning: format ‘%lld’ expects type ‘long long int’, but argument 2 has type ‘int64_t’ $ gcc -Wall -O2 p.c -m32 p.c: In function ‘main’: p.c:6: warning: format ‘%ld’ expects type ‘long int’, but argument 2 has type ‘int64_t’ Best regards, --Edwin
>>>>> "Török" == Török Edwin <edwintorok at gmail.com> writes:>> 1) What is your jni.h file? I can't compile the Jni.cpp file with your >> changes.Török> Ouch, did they change 'const'-ness between gcj versions? Török> I was using gcj-4.2.3, and jni.h is from libgcj8-dev. It looks like we did change it, in Classpath, in 2007. I assume it was for compatibility with the JNI spec; JNI is supposed to be both source- and binary-compatible across VMs, and we try very hard to preserve this. Tom
On Mar 26, 2008, at 12:23 PM, Török Edwin wrote: [...]>> 2) ISO C++ does not support %jd. x86_64 does not know about %lld? >> > > It does, but gcc gives a warning, if I use %lld I get a warning on > x86_64, if I %ld I get a warning on x86-32. > int64_t is long int on x86-64. However sizeof(long int) == sizeof(long > long int), so I don't know why gcc insists it is wrong. > I only found %jd which doesn't give warnings on either: > > #include <stdio.h> > #include <stdint.h> > int main() > { > int64_t x=0; > printf("%ld",x); > printf("%lld",x); > printf("%jd",x); > return 0; > } > > $ gcc -Wall -O2 p.c > p.c: In function ‘main’: > p.c:7: warning: format ‘%lld’ expects type ‘long long int’, but > argument > 2 has type ‘int64_t’ > $ gcc -Wall -O2 p.c -m32 > p.c: In function ‘main’: > p.c:6: warning: format ‘%ld’ expects type ‘long int’, but argument 2 > has > type ‘int64_t’To print a int64_t value, use PRId64 from inttypes.h if you can. #include <inttypes.h> int64_t x = ...; printf("x=%"PRId64"\n", x); It's ugly at first, but portable (provided inttypes.h ...). Eric