Re: Create binary from GCJ generated assembly
isuru herath <[email protected]>
| Newsgroups | gmane.comp.gcc.java.devel |
|---|---|
| Message-ID | <[email protected]> |
Hi Andrew, Thanks a lot for the quick reply. I did accordingly. But results were not the same. My program is a multi threaded shared counter. so in my Java code I have counter++ I need to surround this with two xchg instructions. like xchg counter++ xchg so that I can count number of read and write operations between two xchg instructions. with gcc I got both as 1 which is correct. with gcj and JNI I got 47 read operations and 29 write operations with gcj and CNI I got 6 read operations and 6 write operations the way I am doing with CNI is follows. 1. a java class with native method.(custom.java) 2. c++ implementation of it to insert assembly.(custom.cc) 3. compile custom.java (gcj -C custom.java) 4. create the header file (gcjh custom -o custom.h) 5. write multi threaded shared counter program. it has calls to native method to insert assembly(shared_counter.java) 6. compile all java classes (gcj -C *.java) 7. compile the custom.cc (g++ -c custom.cc -o custom.o) 8. create the executable. (gcj do_options.class custom.class shared_counter.class custom.o -lstdc++ --main=shared_counter -o shared_conter) do_options is an interface with final variables. is there something that is wrong. or should I need do some additional thing. any help/ advice is greatly appreciated. regards, Isuru --- On Tue, 10/27/09, Andrew Haley <[email protected]> wrote: > From: Andrew Haley <[email protected]> > Subject: Re: Create binary from GCJ generated assembly > To: "isuru herath" <[email protected]> > Cc: [email protected] > Date: Tuesday, October 27, 2009, 2:42 AM > isuru herath wrote: > > > I want to add two assembly instructions to my Java > program. Earlier > > I was doing it in C with "asm volatile". To get the > same behavior in > > Java I used JNI. I used GCJ with -fjni flat to crate > the binary. It > > executed and gave the correct output. But when I > checked the memory > > references between two assembly instructions it is > very high > > compared to the C program. Thereafter I got the > assembly version of > > both C and Java codes with -S option. In C version, > assembly > > instructions are directly inserted in the proper > places. But in Java > > version library calls are placed in the places where > assembly should > > be inserted. I doubt this may be the case for larger > memory > > references. So my question is is there a way to edit > the gcj > > generated assembly and insert assembly instructions > and compile it > > to a binary. I tried two different ways(trial and > error). Nothing > > worked. > > > > [1] > > gcj --main=new_shared_counter -o new_shared_counter > new_shared_counter.s > > > > [2] > > gcc shared_counter.s > > > > gcj can't handle inline asm. > > There are a few ways to do this: > > * Write the code with the asm in C++ using CNI. This > is the easiest > way, and gives you results identical to using asm > volatile in C. > > * Add a compiler intrinsic. This requires specialist > knowledge. > > * Post-process the assembler output from gcj to replace a > call with > some assembly instructions. Nasty, but it'd > work. Again, this > requires specialist knowledge. > > > Any help on how to compile a gcj generated assembly to > binary would > > be greatly appreciated. > > Use the assembler, "as". > > Andrew. > >