[K42-discussion] c++ -> c calling conventions and assembly

Livio Soares livio at eecg.toronto.edu
Thu Oct 5 03:14:53 EST 2006


  Hi all,

Bryan S Rosenburg writes:
> 
> Patrick Bridges wrote on 10/03/2006 08:57:31 PM:
> > > As far as I can tell, this makes it impossible to call the function  
> > > from
> > > assembly. The only solution I see is to create a c wrapper for each of
> > > these functions -- a real c wrapper -- but that seems like it would  
> > > add
> > > an undesirable amount of complexity. Ideas?
> >
> > Could we just change the call from assembly to load an address from  
> > the associated data section and do an indirect jump to it, if that's  
> > the linkage that's required?
> 
> We  certainly  could  change  the  assembly  code  to  call  through  function
> descriptors, but what a waste of cycles  and cache lines!  I sure hope you can
> find a way to make the text address available to the assembly code. 

  I completely agree with you. If  we have the symbol locations at compile time,
I don't see a benefit for the extra indirection overhead (it would cost at least
one cache-line due to a load, and  a branch whose target which looks pretty hard
to predict).  And it doesn't  look like K42  will need the flexibility  of being
able to overwrite/relocate code that is declared as 'extern "C"'. 

> 
> This discussion is starting to intersect my "day" job (implementing a "library
> OS" to  support a JVM  running on a  bare hypervisor partition).   We recently
> discovered an  outright compilation  bug when using  gcc 4.0.1 to  compile C++
> code.  I learned  that g++4.0.1 generates assembler that  "calls" the function
> descriptor  for a  function rather  than the  text address  for  the function.
> Somehow the  assembler and  linker do the  right thing  for what looks  like a
> branch into  the data  segment, but  in one particular  case a  bad relocation
> entry is generated for a call to a static function, and the final code ends up
> branching to the wrong place.  I bring this up, because the change to call the
> function descriptor rather than the  text address may explain why the compiler
> is no longer exporting  a symbol for the text address.  But  this seems like a
> serious and unnecessary omission.  Is there  a compiler option of some sort to
> get back the old behavior?

  I    browsed    through    GCC-4.1     code    for    a    bit,    and    from
gcc/config/rs6000/ppc-asm.h, I see:

/*
 * Macros to begin and end a function written in assembler.  If -mcall-aixdesc
 * or -mcall-nt, create a function descriptor with the given name, and create
 * the real function with one or two leading periods respectively. 
 */

  So, trying it out with Donour's test program, I get:

$ g++-4.1 -mcall-aixdesc -c test.C
$ nm test.o
0000000000000000 T .foobar
                 U .printf
0000000000000000 V DW.ref.__gxx_personality_v0
                 U __gxx_personality_v0
0000000000000000 D foobar

  Interestingly, there is  still a 'foobar' symbol in the  data segment. I don't
know  what is  it's purpose.  Calling "foobar()"  from a  C++ function  seems to
directly use the .foobar symbol addres. 

  Anyways,  I  have  no idea  if  there  are  further ramifications  when  using
-mcall-aixdesc.  I  have not tried compiling K42  with it. As far  as my "rgrep"
went into the GCC-4.1 source  code, gcc/config/rs6000/ppc-asm.h is the only file
modified by -mcall-aixdesc. 

  In the  end, if -mcall-aixdesc breaks  K42 (or doesn't solve  the problem), it
doesn't seem that it would be extremely hard to change the ppc-asm.h to spit out
function descriptors in the TOC so that they are directly accessible as a symbol
in the text segment.

  Hope this helps,

				Livio



More information about the K42-discussion mailing list