BELBACHIR Selim writes:
 > Hi,
 > 
 > I'm working on a gcc/gnat port  for a private target (gcc 4.5.2, gnat 6.4.2).
 > On this target, scalar values shall be stored in $R registers whereas 
 > pointer values shall be stored in $C registers. My current ABI for 
 > procedure/function calls uses $R and $C registers depending on arguments and 
 > return values type (scalar or pointer). I need an ABI of this kind for 
 > performance reasons (the instruction set does not allow $R and $C everywhere 
 > and copying $R in $C for each procedure calls is too expensive).
 > 
 > I tested this ABI through GCC C and C++ torture suite and everything is ok 
 > (after solving special cases for implicit calls)
 > 
 > During my tests I tried to mix ADA and C sources code using the 'pragma 
 > import/export'. For example I tried to implement the "__gnat_malloc" 
 > expected by the ZFP runtime by an ADA function and 'pragma export' :
 > 
 >      function Gnat_Malloc (Size : in Integer) return System.Address is
 >      begin
 >              -- implementation
 >      end Gnat_Malloc;
 >      pragma Export (C, Gnat_Malloc, "__gnat_malloc");
 > 
 > Here is my problem :
 > * the caller of __gnat_malloc expects that return value of type pointer to 
 > be in a $C register (as defined in the ABI)
 > * the called function Gnat_Malloc return a value of type system.address in 
 > $R register because system.address is considered as a scalar value 
 > (system.ads:   type Address is mod Memory_Size;) 
 >     ==> caller and callee return values doesn't match, the ABI is broken
 > 
 > I tried to modified system.ads so that system.address arguments become 
 > pointers (using access keyword) but I can't figure out how to do this 
 > because the System package is 'pragma Pure' ...
 > 
 > Is there a way to modify something somewhere (runtime, backend, frontend 
 > ...) so that arguments of type system.address are seen as pointers and not 
 > scalar values ?

This is a known issue, m68k-linux has the exact same problem with its A(ddress) 
and D(ata) registers.
See PR48835 for discussion and patches.  With those patches people are 
successfully building and using
GCC's Ada on m68k-linux.

Reply via email to