Changes from Jeffrey Law:
* printcmd.c (makeva_list): Use MAKEVA_EXTRA_INFO to define machine dependent fields in the makeva_list structure. (makeva_size): Allocate extra space to handle gaps made by alignment restrictions. * config/pa/xm-pa.h (MAKEVA_EXTRA_INFO): Define. (MAKEVA_START): Initialize arglist_address field. (MAKEVA_ARG): Always store arguments on natural alignment boundaries. Set arglist_address to the address right after the args. (MAKEVA_END): Simply return the value stored in arglist_address.
This commit is contained in:
parent
6dc31f06c3
commit
1ab786f460
@ -1,3 +1,17 @@
|
||||
Wed Jul 14 17:37:03 1993 Jim Kingdon (kingdon@lioth.cygnus.com)
|
||||
|
||||
Changes from Jeffrey Law:
|
||||
* printcmd.c (makeva_list): Use MAKEVA_EXTRA_INFO to define
|
||||
machine dependent fields in the makeva_list structure.
|
||||
(makeva_size): Allocate extra space to handle gaps made by
|
||||
alignment restrictions.
|
||||
* xm-pa.h (MAKEVA_EXTRA_INFO): Define.
|
||||
(MAKEVA_START): Initialize arglist_address field.
|
||||
(MAKEVA_ARG): Always store arguments on natural alignment
|
||||
boundaries. Set arglist_address to the address right after
|
||||
the args.
|
||||
(MAKEVA_END): Simply return the value stored in arglist_address.
|
||||
|
||||
Wed Jul 14 13:51:54 1993 Jim Kingdon (kingdon@lioth.cygnus.com)
|
||||
|
||||
* ch-valprint.c (chill_val_print, case TYPE_CODE_STRING): Print
|
||||
|
@ -1,21 +1,34 @@
|
||||
/* Definitions for all PA machines. */
|
||||
|
||||
#define MAKEVA_EXTRA_INFO int arglist_address;
|
||||
|
||||
#define MAKEVA_START(list) \
|
||||
list->argindex = list->nargs * list->max_arg_size;
|
||||
list->argindex = list->nargs * list->max_arg_size; \
|
||||
list->arglist_address = 0;
|
||||
|
||||
#define MAKEVA_ARG(list, argaddr, argsize) \
|
||||
if (argsize > 8) \
|
||||
/* Currently this never happens; printf_command only uses argsize */ \
|
||||
/* of sizeof (int), sizeof (double), or sizeof (long long). */ \
|
||||
error ("MAKEVA_ARG not fully written for hp-pa"); \
|
||||
memcpy (&list->arg_bytes[list->argindex - argsize], argaddr, argsize); \
|
||||
if (argsize <= 4) \
|
||||
list->argindex -= 4; \
|
||||
else if (argsize <= 8) \
|
||||
list->argindex -= 8; \
|
||||
{ \
|
||||
int rounded_argsize; \
|
||||
if (argsize > 8) \
|
||||
/* Currently this never happens; printf_command only uses argsize */ \
|
||||
/* of sizeof (int), sizeof (double), or sizeof (long long). */ \
|
||||
error ("MAKEVA_ARG not fully written for hp-pa"); \
|
||||
if (argsize <= 4) \
|
||||
rounded_argsize = 4; \
|
||||
else if (argsize <= 8) \
|
||||
rounded_argsize = 8; \
|
||||
list->argindex -= rounded_argsize; \
|
||||
while ((int)(&list->arg_bytes[list->argindex]) % rounded_argsize) \
|
||||
list->argindex--; \
|
||||
/* arglist_address is used to store the address of the first arguent. */ \
|
||||
if (list->arglist_address == 0) \
|
||||
list->arglist_address = &list->arg_bytes[list->argindex] \
|
||||
+ rounded_argsize; \
|
||||
memcpy (&list->arg_bytes[list->argindex], argaddr, argsize); \
|
||||
}
|
||||
|
||||
/* The address of the arglist is the address right after the args
|
||||
(which is what you'd expect). */
|
||||
(which is what you'd expect). This address is stored in the arglist_address
|
||||
field. */
|
||||
#define MAKEVA_END(list) \
|
||||
return (va_list) (list->arg_bytes \
|
||||
+ list->nargs * list->max_arg_size)
|
||||
return (va_list) list->arglist_address;
|
||||
|
@ -1623,6 +1623,11 @@ typedef struct {
|
||||
/* Current position in bytes. */
|
||||
unsigned int argindex;
|
||||
|
||||
#ifdef MAKEVA_EXTRA_INFO
|
||||
/* For host dependent information. */
|
||||
MAKEVA_EXTRA_INFO
|
||||
#endif
|
||||
|
||||
char arg_bytes[1];
|
||||
} makeva_list;
|
||||
|
||||
@ -1634,7 +1639,9 @@ makeva_size (nargs, max_arg_size)
|
||||
unsigned int nargs;
|
||||
unsigned int max_arg_size;
|
||||
{
|
||||
return sizeof (makeva_list) + nargs * max_arg_size;
|
||||
return sizeof (makeva_list) + nargs * max_arg_size
|
||||
/* The PA might need up to this much for alignment. */
|
||||
+ max_arg_size - 1;
|
||||
}
|
||||
|
||||
/* Start working on LIST with NARGS arguments and whose largest
|
||||
|
Loading…
Reference in New Issue
Block a user