diff options
author | Peter Schauer <Peter.Schauer@mytum.de> | 1993-05-22 07:26:25 +0000 |
---|---|---|
committer | Peter Schauer <Peter.Schauer@mytum.de> | 1993-05-22 07:26:25 +0000 |
commit | ac8cf67dcad6b89d3867e8ac45921e94ac84db89 (patch) | |
tree | 46e0b8cf6eeb1115a21cab6283e7a7ca9c2725e6 /gdb/mips-tdep.c | |
parent | 43152fe57b27c7dc96624b43e1a9598bb7eb2f04 (diff) | |
download | gdb-ac8cf67dcad6b89d3867e8ac45921e94ac84db89.zip gdb-ac8cf67dcad6b89d3867e8ac45921e94ac84db89.tar.gz gdb-ac8cf67dcad6b89d3867e8ac45921e94ac84db89.tar.bz2 |
* config/mips/tm-irix3.h: Clean up, use tm-bigmips.h and redefine
the necessary bits.
* findvar.c (value_from_register): Fix uninitialized first_addr
which caused problems with assignment of doubles to register variables
on some targets.
* mipsread.c: Remove TM_FILE_OVERRIDE, include tm.h and provide the
missing mips definitions if necessary.
Fix handling of double register variables for mips targets and big
endian hosts. These patches are from Paul Flinders <ptf@delcam.co.uk>.
* config/mips/tm-mips.h: Increase MAX_REGISTER_{RAW,VIRTUAL}_SIZE to
8 bytes for doubles.
* config/mips/tm-mips.h (REGISTER_CONVERT_TO_TYPE): New macro for
conversion of type held in multiple registers to host format.
* config/mips/tm-mips.h (REGISTER_CONVERT_FROM_TYPE): New macro,
companion to REGISTER_CONVERT_TO_TYPE.
* config/mips/tm-mips.h (EXTRACT_RETURN_VALUE, STORE_RETURN_VALUE):
Convert to function calls.
* config/mips/tm-mips.h (FIX_CALL_DUMMY): New code for big endian
mips targets.
* mips-tdep.c (mips_print_register): Raw buffer now needs just
MAX_REGISTER_RAW_SIZE bytes.
* mips-tdep.c (mips_print_register): Use REGISTER_CONVERT_TO_TYPE
(if defined) for doubles.
* mips-tdep.c: (mips_extract_return_value, mips_store_return_value):
New functions, take care of REGISTER_CONVERT_TO/FROM_TYPE.
* valops.c (value_assign): Use REGISTER_CONVERT_TO_TYPE if
defined.
* findvar.c (value_from_register): Use REGISTER_CONVERT_TO_TYPE if
defined.
Diffstat (limited to 'gdb/mips-tdep.c')
-rw-r--r-- | gdb/mips-tdep.c | 53 |
1 files changed, 48 insertions, 5 deletions
diff --git a/gdb/mips-tdep.c b/gdb/mips-tdep.c index 2e960d3..aa6cd30 100644 --- a/gdb/mips-tdep.c +++ b/gdb/mips-tdep.c @@ -32,7 +32,6 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #endif #include <sys/param.h> -#include <sys/dir.h> #include <signal.h> #include <sys/ioctl.h> @@ -613,7 +612,7 @@ static void mips_print_register (regnum, all) int regnum, all; { - unsigned char raw_buffer[MAX_REGISTER_RAW_SIZE * 2]; /* *2 for doubles */ + unsigned char raw_buffer[MAX_REGISTER_RAW_SIZE]; REGISTER_TYPE val; /* Get the data in raw format. */ @@ -626,9 +625,15 @@ mips_print_register (regnum, all) /* If an even floating pointer register, also print as double. */ if (regnum >= FP0_REGNUM && regnum < FP0_REGNUM+32 && !((regnum-FP0_REGNUM) & 1)) { - read_relative_register_raw_bytes (regnum+1, raw_buffer+4); + char dbuffer[MAX_REGISTER_RAW_SIZE]; + + read_relative_register_raw_bytes (regnum, dbuffer); + read_relative_register_raw_bytes (regnum+1, dbuffer+4); +#ifdef REGISTER_CONVERT_TO_TYPE + REGISTER_CONVERT_TO_TYPE(regnum, builtin_type_double, dbuffer); +#endif printf_filtered ("(d%d: ", regnum-FP0_REGNUM); - val_print (builtin_type_double, raw_buffer, 0, + val_print (builtin_type_double, dbuffer, 0, stdout, 0, 1, 0, Val_pretty_default); printf_filtered ("); "); } @@ -801,6 +806,44 @@ mips_skip_prologue(pc) #endif } +/* Given a return value in `regbuf' with a type `valtype', + extract and copy its value into `valbuf'. */ +void +mips_extract_return_value (valtype, regbuf, valbuf) + struct type *valtype; + char regbuf[REGISTER_BYTES]; + char *valbuf; +{ + int regnum; + + regnum = TYPE_CODE (valtype) == TYPE_CODE_FLT && mips_fpu ? FP0_REGNUM : 2; + + memcpy (valbuf, regbuf + REGISTER_BYTE (regnum), TYPE_LENGTH (valtype)); +#ifdef REGISTER_CONVERT_TO_TYPE + REGISTER_CONVERT_TO_TYPE(regnum, valtype, valbuf); +#endif +} + +/* Given a return value in `regbuf' with a type `valtype', + write it's value into the appropriate register. */ +void +mips_store_return_value (valtype, valbuf) + struct type *valtype; + char *valbuf; +{ + int regnum; + char raw_buffer[MAX_REGISTER_RAW_SIZE]; + + regnum = TYPE_CODE (valtype) == TYPE_CODE_FLT && mips_fpu ? FP0_REGNUM : 2; + memcpy(raw_buffer, valbuf, TYPE_LENGTH (valtype)); + +#ifdef REGISTER_CONVERT_FROM_TYPE + REGISTER_CONVERT_FROM_TYPE(regnum, valtype, raw_buffer); +#endif + + write_register_bytes(REGISTER_BYTE (regnum), raw_buffer, TYPE_LENGTH (valtype)); +} + /* Let the user turn off floating point and set the fence post for heuristic_proc_start. */ @@ -819,7 +862,7 @@ or dealing with return values.", &setlist), (add_set_cmd ("heuristic-fence-post", class_support, var_uinteger, (char *) &heuristic_fence_post, "Set the distance searched for the start of a function.\n\ -Set number of bytes to be searched backward to find the beginning of a +Set number of bytes to be searched backward to find the beginning of a\n\ function without symbols.", &setlist), &showlist); } |