(j3.2006) Interesting F2003-ism
Andy Vaught
andyv
Thu Feb 22 15:08:32 EST 2007
On Thu, 22 Feb 2007, Michael I. wrote:
> Just for the sake of argument, here's an implementation
> that will choke on your interface:
>
> Separate integer and floating point registers.
> Pointers and integers passed in integer registers (only) when no ellipsis.
> Reals passed in floating point registers (only) when no ellipsis.
> Elided arguments always passed on the stack whether real or integer or
> pointer.
>
>The interface then entails the self-contradictory assertion
> the 2nd argument of the routine with binding label 'printf' is
> passed only in integer registers and
> is passed only in floating point registers
But you can't implement a C ABI that way. Variable argument lists have
to be passed in the same manner as fixed argument lists. Otherwise, a
variable argument list function won't work when invoked through a function
pointer that has been cast around a bit.
I agree that it is common practice to pass parameters in registers, but
the va_arg() macros sort things out. I tried the following on a processor
that does this, the sparc:
-----------------------------------------------
andy at sparc % cat tst.f90
program main
use iso_c_binding
interface
subroutine p1(f, a1, a2, a3, a4) bind(c, name='printf')
import :: c_ptr
type(c_ptr), value :: f
integer, value :: a1, a3
double precision, value :: a2, a4
end subroutine p1
subroutine p2(f, a1, a2, a3, a4) bind(c, name='printf')
import :: c_ptr
type(c_ptr), value :: f
double precision, value :: a1, a3
integer, value :: a2, a4
end subroutine p2
end interface
type(c_ptr) :: f_ptr
character(len=20), target :: format
f_ptr = c_loc(format(1:1))
format = 'Hello %d %f %d %f\n' // char(0)
call p1(f_ptr, 10, 1.23d0, 20, 2.46d0)
format = 'World %f %d %f %d\n' // char(0)
call p2(f_ptr, 1.23d0, 10, 2.46d0, 20)
end program main
andy at sparc % g95 tst.f90
andy at sparc % ./a.out
Hello 10 1.230000 20 2.460000
World 1.230000 10 2.460000 20
andy at sparc %
-----------------------------------------------
Works as expected.
Andy
More information about the J3
mailing list