diff options
author | Jim Kingdon <jkingdon@engr.sgi.com> | 1993-07-14 22:44:03 +0000 |
---|---|---|
committer | Jim Kingdon <jkingdon@engr.sgi.com> | 1993-07-14 22:44:03 +0000 |
commit | 1ab786f460f3b377d20fd0b82575bcf5e2e03b8c (patch) | |
tree | 62ae4ee70e93bd04713c71eb320a948ca2870502 /gdb/config/pa | |
parent | 6dc31f06c3c637058aee938b46dfb62758ba7711 (diff) | |
download | gdb-1ab786f460f3b377d20fd0b82575bcf5e2e03b8c.zip gdb-1ab786f460f3b377d20fd0b82575bcf5e2e03b8c.tar.gz gdb-1ab786f460f3b377d20fd0b82575bcf5e2e03b8c.tar.bz2 |
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.
Diffstat (limited to 'gdb/config/pa')
-rw-r--r-- | gdb/config/pa/xm-pa.h | 39 |
1 files changed, 26 insertions, 13 deletions
diff --git a/gdb/config/pa/xm-pa.h b/gdb/config/pa/xm-pa.h index 523baf1..831be59 100644 --- a/gdb/config/pa/xm-pa.h +++ b/gdb/config/pa/xm-pa.h @@ -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; |