aboutsummaryrefslogtreecommitdiff
path: root/gdb/config/mips/tm-mips.h
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@airs.com>1994-10-06 16:43:40 +0000
committerIan Lance Taylor <ian@airs.com>1994-10-06 16:43:40 +0000
commit97d3151a59022d8d76fd29100052645bd8d99c6b (patch)
tree727b73d5b197ddec90dd9fc2666b78813f4e2a3a /gdb/config/mips/tm-mips.h
parent1a406ce8c419273e124e5ab1c580a03c24ce056b (diff)
downloadgdb-97d3151a59022d8d76fd29100052645bd8d99c6b.zip
gdb-97d3151a59022d8d76fd29100052645bd8d99c6b.tar.gz
gdb-97d3151a59022d8d76fd29100052645bd8d99c6b.tar.bz2
* config/mips/tm-mips.h (GDB_TARGET_IS_MIPS64): If not already
defined, define as 0. (FIX_CALL_DUMMY): Rewrite to remove presumption that host and target are similar. * config/mips/tm-idt.h (TARGET_BYTE_ORDER_SELECTABLE): Define. * config/mips/tm-idtl.h (TARGET_BYTE_ORDER_SELECTABLE): Define. * config/mips/tm-idt64.h (TARGET_BYTE_ORDER_SELECTABLE): Define. (BREAKPOINT): Remove definition. * config/mips/tm-idtl64.h (TARGET_BYTE_ORDER_SELECTABLE): Define. (BREAKPOINT): Remove definition. * config/mips/tm-mips64.h (GDB_TARGET_IS_MIPS64): Define with a value of 1, rather than without a value. * config/mips/tm-bigmips64.h (GDB_TARGET_IS_MIPS64): Likewise.
Diffstat (limited to 'gdb/config/mips/tm-mips.h')
-rw-r--r--gdb/config/mips/tm-mips.h87
1 files changed, 49 insertions, 38 deletions
diff --git a/gdb/config/mips/tm-mips.h b/gdb/config/mips/tm-mips.h
index 3deb7b6..87fbfe6 100644
--- a/gdb/config/mips/tm-mips.h
+++ b/gdb/config/mips/tm-mips.h
@@ -27,6 +27,10 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#define TARGET_BYTE_ORDER LITTLE_ENDIAN
#endif
+#if !defined (GDB_TARGET_IS_MIPS64)
+#define GDB_TARGET_IS_MIPS64 0
+#endif
+
/* Floating point is IEEE compliant */
#define IEEE_FLOAT
@@ -344,50 +348,57 @@ extern int in_sigtramp PARAMS ((CORE_ADDR, char *));
/* Insert the specified number of args and function address
into a call sequence of the above form stored at DUMMYNAME. */
-#if TARGET_BYTE_ORDER == BIG_ENDIAN && ! defined (GDB_TARGET_IS_MIPS64)
/* For big endian mips machines we need to switch the order of the
words with a floating-point value (it was already coerced to a double
by mips_push_arguments). */
#define FIX_CALL_DUMMY(dummyname, start_sp, fun, nargs, args, rettype, gcc_p) \
- do { \
- ((int*)(dummyname))[11] |= ((unsigned long)(fun)) >> 16; \
- ((int*)(dummyname))[12] |= (unsigned short)(fun); \
- if (! mips_fpu) { \
- ((int *) (dummyname))[3] = 0; ((int *) (dummyname))[4] = 0; \
- ((int *) (dummyname))[5] = 0; ((int *) (dummyname))[6] = 0; \
- } else { \
- if (nargs > 0 && \
- TYPE_CODE(VALUE_TYPE(args[0])) == TYPE_CODE_FLT) { \
- if (TYPE_LENGTH(VALUE_TYPE(args[0])) > 8) \
- error ("Can't pass floating point value of more than 8 bytes to a function"); \
- ((int *) (dummyname))[3] = MK_OP(OP_LDFPR,SP_REGNUM,12,4); \
- ((int *) (dummyname))[4] = MK_OP(OP_LDFPR,SP_REGNUM,13,0); \
- } \
- if (nargs > 1 && \
- TYPE_CODE(VALUE_TYPE(args[1])) == TYPE_CODE_FLT) { \
- if (TYPE_LENGTH(VALUE_TYPE(args[1])) > 8) \
- error ("Can't pass floating point value of more than 8 bytes to a function"); \
- ((int *) (dummyname))[5] = MK_OP(OP_LDFPR,SP_REGNUM,14,12); \
- ((int *) (dummyname))[6] = MK_OP(OP_LDFPR,SP_REGNUM,15,8); \
- } \
+ do \
+ { \
+ store_unsigned_integer \
+ (dummyname + 11 * 4, 4, \
+ (extract_unsigned_integer (dummyname + 11 * 4, 4) \
+ | (((fun) >> 16) & 0xffff))); \
+ store_unsigned_integer \
+ (dummyname + 12 * 4, 4, \
+ (extract_unsigned_integer (dummyname + 12 * 4, 4) \
+ | ((fun) & 0xffff))); \
+ if (! mips_fpu) \
+ { \
+ store_unsigned_integer (dummyname + 3 * 4, 4, \
+ (unsigned LONGEST) 0); \
+ store_unsigned_integer (dummyname + 4 * 4, 4, \
+ (unsigned LONGEST) 0); \
+ store_unsigned_integer (dummyname + 5 * 4, 4, \
+ (unsigned LONGEST) 0); \
+ store_unsigned_integer (dummyname + 6 * 4, 4, \
+ (unsigned LONGEST) 0); \
+ } \
+ else if (TARGET_BYTE_ORDER == BIG_ENDIAN \
+ && ! GDB_TARGET_IS_MIPS64) \
+ { \
+ if (nargs > 0 \
+ && TYPE_CODE (VALUE_TYPE (args[0])) == TYPE_CODE_FLT) \
+ { \
+ if (TYPE_LENGTH (VALUE_TYPE (args[0])) > 8) \
+ error ("floating point value too large to pass to function");\
+ store_unsigned_integer \
+ (dummyname + 3 * 4, 4, MK_OP (OP_LDFPR, SP_REGNUM, 12, 4));\
+ store_unsigned_integer \
+ (dummyname + 4 * 4, 4, MK_OP (OP_LDFPR, SP_REGNUM, 13, 0));\
+ } \
+ if (nargs > 1 \
+ && TYPE_CODE (VALUE_TYPE (args[1])) == TYPE_CODE_FLT) \
+ { \
+ if (TYPE_LENGTH (VALUE_TYPE (args[1])) > 8) \
+ error ("floating point value too large to pass to function");\
+ store_unsigned_integer \
+ (dummyname + 5 * 4, 4, MK_OP (OP_LDFPR, SP_REGNUM, 14, 12));\
+ store_unsigned_integer \
+ (dummyname + 6 * 4, 4, MK_OP (OP_LDFPR, SP_REGNUM, 15, 8));\
+ } \
+ } \
} \
- } while (0)
-#else
-#define FIX_CALL_DUMMY(dummyname, start_sp, fun, nargs, args, rettype, gcc_p)\
- do \
- { \
- ((int*)(dummyname))[11] |= ((unsigned long)(fun)) >> 16; \
- ((int*)(dummyname))[12] |= (unsigned short)(fun); \
- if (! mips_fpu) \
- { \
- ((int *) (dummyname))[3] = 0; \
- ((int *) (dummyname))[4] = 0; \
- ((int *) (dummyname))[5] = 0; \
- ((int *) (dummyname))[6] = 0; \
- } \
- } \
while (0)
-#endif
/* There's a mess in stack frame creation. See comments in blockframe.c
near reference to INIT_FRAME_PC_FIRST. */