Create binary from GCJ generated assembly

isuru herath isuru81@yahoo.com
Wed Oct 28 15:05:00 GMT 2009


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 <aph@redhat.com> wrote:

> From: Andrew Haley <aph@redhat.com>
> Subject: Re: Create binary from GCJ generated assembly
> To: "isuru herath" <isuru81@yahoo.com>
> Cc: java@gcc.gnu.org
> 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.
> 
> 


      



More information about the Java mailing list