The Question is:
We are currently migrating from Vax to Alpha. We have a subroutine
(Get_Argcnt) that returns the argument count and also an argument list
indicating whether any arguments were omitted. We have many subroutines that
call Get_Argcnt and rely on the argume
nt list to determine if an agrument should be referenced. It's crutial that we
can continue to use this subroutine. There is an FAQ, Prog9, referring to
this, but I can't believe that the same functionality can't be accomplished on
the Alpha. R25 appare
ntly contains the argument count of the current subroutine. R16-R21 contain
the addresses of the first 6 arguments. I don't understand how to reference
arguments 7 and beyond. What I really need is the argument count and argument
list of the previous ca
ll. I accomplished this on the Vax by getting the previous ap from 8(fp). How
can this be done on the Alpha?
The Answer is :
The implementation of argument passing is quite different between OpenVMS
VAX and OpenVMS Alpha -- applications that are dependant on the contents
of the VAX call stack will require changes when porting to OpenVMS Alpha.
On OpenVMS VAX systems, many programmers used a small routine written in
Macro32 to fetch the argument count via the saved AP register. Though
this technique was unsupported and not guaranteed to work in the VAX
architecture, it worked well enough that various applications have
come to depend upon it.
This AP-based technique does not work on OpenVMS Alpha systems, even if
the Macro32 routine is compiled using the OpenVMS Alpha Macro32 compiler,
due to the different way arguments are passed on OpenVMS Alpha.
Compaq Fortran offers an IARGCOUNT intrinsic function -- which takes no
arguments and which returns the actual argument count. Compaq C has full
stdargs.h support for processing variable argument lists, and C provides
an extension (va_count) which retrieves the argument count. These
compiler-provided mechanisms all have the side-effect of causing the
compiler to copy and transfer the argument list via memory -- this
memory-based argument list is called "homed" -- which then allows the
Fortran programs to test %LOC(arg) .EQ. 0 or the C programs to check
va_count to see if any argument(s) were omitted.
IARGCOUNT and va_count are available in Compaq Fortran OpenVMS VAX and
in Compaq C for OpenVMS VAX, and are recommended as a replacement for
the Macro32 stack-cogniscent routines on both VAX and Alpha platforms.