[comp.lang.c] <stdarg.h>, variable argument lists

lebrun@LL.MIT.EDU (Steven F. LeBrun) (02/11/91)

I am working on a SUN 4/370 Sparc computer running SunOS 4.0 and using the
GNU GCC Compiler version 1.39.  I am developing code that uses the ANSI
method for passing variable length argument lists to functions.  Since neither
the SUN CC compiler or the GCC compiler supplies the <stdarg.h> header file,
I wrote my own.  My version of <stdarg.h> works well in most cases but there
is one function where I cannot get it to work.  It appears that the arguments
are not being passed on the stack as expected.  All evidence indicates
that the stdarg.h macros are accessing the section of the stack that should
contain the arguments only there are no arguments there.  

The GCC documentation states that `GNU CC is normally configured to use the
same function calling convention normally in use on the target system.'   
I am looking for information on the SUN's or GNU GCC's function calling 
convention for C functions, especially any case that would cause the arguments 
not to passed on the stack.  I am also looking for information on whether 
there is any GNU GCC option that will force the arguments to be passed on 
the stack.

Please send any responses directly to me using my Internet Address since I
do not have access to the comp.lang.c newsgroup.  I have enclosed sections of 
the afflicted code including my version of <stdarg.h>.  I thank you in advance 
for any help that you may give.
-------------------------------------------------------------------------------
The code from my version of <stdarg.h>:

#if !defined(STDARG_H)
#define      STDARG_H    included

typedef  char*    va_list;

#define  va_start(ap,alast) ap = (va_list) (((int) &alast) + sizeof(alast))

#define  va_arg(ap, atype)  *( (atype *)                                    \
			     ((ap = (va_list)                               \
			     ((((int) ap) + sizeof(atype) + 0x03) & ~0x03)) \
			     - sizeof(atype)))

#define  va_end(ap)          

#endif  /* If !defined(STDARG_H) */

NOTE: The `+ 0x03) & ~0x03' in va_arg() performs 4-byte boundry alignment.  
      This is different from the way it is done in the SUN's version of 
      <varargs.h> and it takes care of any argument that is smaller than 
      four bytes that is placed on the stack as an int.
-------------------------------------------------------------------------------
The following is the prototype of the misbehaving function:

int   Get_OBJECT          (LORDS_RETURN *, OBJECT_TABLE *, int, ...  );

where LORDS_RETURN and OBJECT_TABLE are user defined types.


+--------------------------------------------------------------------------+
| Steven F. LeBrun                    MIT Lincoln Laboratory, Group 91     |
|                                         Millstone Hill Radar             |
| lebrun@ll.mit.edu (Internet)            Westford, MA 01886               |
| lebruns@betel     (internal)    Phone:(617)-981-5742, FAX:(617)-981-5636 |
+--------------------------------------------------------------------------+