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 ? Regards, Selim Belbachir