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