+
+typedef enum {
+ RegTypeNone,
+ /* Passed/returned in an ireg */
+ RegTypeGeneral,
+ /* Passed/returned in a pair of iregs */
+ RegTypeIRegPair,
+ /* Passed on the stack */
+ RegTypeBase,
+ /* First word in r3, second word on the stack */
+ RegTypeBaseGen,
+ /* FP value passed in either an ireg or a vfp reg */
+ RegTypeFP,
+ /* Struct passed/returned in gregs */
+ RegTypeStructByVal,
+ RegTypeStructByAddr,
+ RegTypeStructByAddrOnStack,
+ /* gsharedvt argument passed by addr in greg */
+ RegTypeGSharedVtInReg,
+ /* gsharedvt argument passed by addr on stack */
+ RegTypeGSharedVtOnStack,
+ RegTypeHFA
+} ArgStorage;
+
+typedef struct {
+ gint32 offset;
+ guint16 vtsize; /* in param area */
+ /* RegTypeHFA */
+ int esize;
+ /* RegTypeHFA/RegTypeStructByVal */
+ int nregs;
+ guint8 reg;
+ ArgStorage storage;
+ /* RegTypeStructByVal */
+ gint32 struct_size;
+ guint8 size : 4; /* 1, 2, 4, 8, or regs used by RegTypeStructByVal */
+} ArgInfo;
+
+typedef struct {
+ int nargs;
+ guint32 stack_usage;
+ /* The index of the vret arg in the argument list for RegTypeStructByAddr */
+ int vret_arg_index;
+ ArgInfo ret;
+ ArgInfo sig_cookie;
+ ArgInfo args [1];
+} CallInfo;
+