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.
> 
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.