aboutsummaryrefslogtreecommitdiff
path: root/gdb/config/d10v
diff options
context:
space:
mode:
authorMartin Hunt <hunt@redhat.com>1996-11-01 22:02:37 +0000
committerMartin Hunt <hunt@redhat.com>1996-11-01 22:02:37 +0000
commit61e5b759cda25bec432271b643f32880faa430f4 (patch)
treeac63be05a6b32c9f2acbc6b185e503621d4c6dfe /gdb/config/d10v
parent21260fe16f1a9b6423b5d0970e2bb1a2dd44f7d5 (diff)
downloadgdb-61e5b759cda25bec432271b643f32880faa430f4.zip
gdb-61e5b759cda25bec432271b643f32880faa430f4.tar.gz
gdb-61e5b759cda25bec432271b643f32880faa430f4.tar.bz2
Fri Nov 1 13:59:28 1996 Martin M. Hunt <hunt@pizza.cygnus.com>
* tm-d10v.h: Major fixes to support inferior function calls and proper stack backtracing on D10V-EVA board.
Diffstat (limited to 'gdb/config/d10v')
-rw-r--r--gdb/config/d10v/tm-d10v.h53
1 files changed, 39 insertions, 14 deletions
diff --git a/gdb/config/d10v/tm-d10v.h b/gdb/config/d10v/tm-d10v.h
index 090dbd0..9fe4825 100644
--- a/gdb/config/d10v/tm-d10v.h
+++ b/gdb/config/d10v/tm-d10v.h
@@ -30,6 +30,20 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
#define FUNCTION_START_OFFSET 0
+/* these are the addresses the D10V-EVA board maps data */
+/* and instruction memory to. */
+
+#define DMEM_START 0x2000000
+#define IMEM_START 0x1000000
+#define STACK_START 0x2007ffe
+
+#ifdef __STDC__ /* Forward decls for prototypes */
+struct frame_info;
+struct frame_saved_regs;
+struct type;
+struct value;
+#endif
+
/* Advance PC across any function entry prologue instructions
to reach some "real" code. */
@@ -37,7 +51,6 @@ extern CORE_ADDR d10v_skip_prologue ();
#define SKIP_PROLOGUE(ip) \
{(ip) = d10v_skip_prologue(ip);}
-#define SAVED_PC_AFTER_CALL(frame) (read_register(LR_REGNUM) << 2 )
/* Stack grows downward. */
#define INNER_THAN <
@@ -142,11 +155,14 @@ extern CORE_ADDR d10v_skip_prologue ();
#define EXTRA_FRAME_INFO \
CORE_ADDR return_pc; \
int dummy; \
+ int frameless; \
int size;
#define INIT_EXTRA_FRAME_INFO(fromleaf, fi) \
d10v_init_extra_frame_info(fromleaf, fi)
+extern void d10v_init_extra_frame_info PARAMS (( int fromleaf, struct frame_info *fi ));
+
/* A macro that tells us whether the function invocation represented
by FI does not have a frame on the stack associated with it. If it
does not, FRAMELESS is set to 1, else 0. */
@@ -155,13 +171,20 @@ extern CORE_ADDR d10v_skip_prologue ();
(FRAMELESS) = frameless_look_for_prologue(FI)
#define FRAME_CHAIN(FRAME) d10v_frame_chain(FRAME)
+#define FRAME_CHAIN_VALID(chain,frame) \
+ ((chain) != 0 && (frame) != 0 && (frame)->pc > IMEM_START)
#define FRAME_SAVED_PC(FRAME) ((FRAME)->return_pc)
#define FRAME_ARGS_ADDRESS(fi) (fi)->frame
#define FRAME_LOCALS_ADDRESS(fi) (fi)->frame
+/* Immediately after a function call, return the saved pc. We can't */
+/* use frame->return_pc beause that is determined by reading R13 off the */
+/*stack and that may not be written yet. */
+
+#define SAVED_PC_AFTER_CALL(frame) ((read_register(LR_REGNUM) << 2) | IMEM_START)
+
/* Set VAL to the number of args passed to frame described by FI.
Can set VAL to -1, meaning no way to tell. */
-
/* We can't tell how many args there are */
#define FRAME_NUM_ARGS(val,fi) (val = -1)
@@ -170,6 +193,7 @@ extern CORE_ADDR d10v_skip_prologue ();
#define FRAME_ARGS_SKIP 0
+
/* Put here the code to store, into a struct frame_saved_regs,
the addresses of the saved registers of frame described by FRAME_INFO.
This includes special registers such as pc and fp saved in special
@@ -179,6 +203,8 @@ extern CORE_ADDR d10v_skip_prologue ();
#define FRAME_FIND_SAVED_REGS(frame_info, frame_saved_regs) \
d10v_frame_find_saved_regs(frame_info, &(frame_saved_regs))
+extern void d10v_frame_find_saved_regs PARAMS ((struct frame_info *, struct frame_saved_regs *));
+
#define NAMES_HAVE_UNDERSCORE
/*
@@ -200,17 +226,11 @@ extern CORE_ADDR d10v_call_dummy_address PARAMS ((void));
#define CALL_DUMMY_ADDRESS() d10v_call_dummy_address()
#define FIX_CALL_DUMMY(dummyname, pc, fun, nargs, args, type, gcc_p) \
-d10v_fix_call_dummy (dummyname, pc, fun, nargs, args, type, gcc_p)
+sp = d10v_fix_call_dummy (dummyname, pc, fun, nargs, args, type, gcc_p)
-#define PC_IN_CALL_DUMMY(pc, sp, frame_address) \
- ((pc>>2) >= CALL_DUMMY_ADDRESS () \
- && (pc>>2) <= (CALL_DUMMY_ADDRESS () + DECR_PC_AFTER_BREAK))
+#define PC_IN_CALL_DUMMY(pc, sp, frame_address) ( pc == IMEM_START + 4 )
-#ifdef __STDC__ /* Forward decls for prototypes */
-struct type;
-struct value;
-#endif
-extern void d10v_fix_call_dummy PARAMS ((char *, CORE_ADDR, CORE_ADDR,
+extern CORE_ADDR d10v_fix_call_dummy PARAMS ((char *, CORE_ADDR, CORE_ADDR,
int, struct value **,
struct type *, int));
#define PUSH_ARGUMENTS(nargs, args, sp, struct_return, struct_addr) \
@@ -231,6 +251,7 @@ d10v_extract_return_value PARAMS ((struct type *, char *, char *));
/* Discard from the stack the innermost frame,
restoring all saved registers. */
#define POP_FRAME d10v_pop_frame();
+extern void d10v_pop_frame PARAMS((void));
#define REGISTER_SIZE 2
@@ -240,13 +261,17 @@ d10v_extract_return_value PARAMS ((struct type *, char *, char *));
# define LONGEST long
#endif
-void d10v_write_pc PARAMS ((LONGEST val, int pid));
+void d10v_write_pc PARAMS ((CORE_ADDR val, int pid));
CORE_ADDR d10v_read_pc PARAMS ((int pid));
+void d10v_write_sp PARAMS ((CORE_ADDR val));
+CORE_ADDR d10v_read_sp PARAMS ((void));
#define TARGET_READ_PC(pid) d10v_read_pc (pid)
#define TARGET_WRITE_PC(val,pid) d10v_write_pc (val, pid)
-#define TARGET_READ_FP() d10v_read_fp ()
-#define TARGET_WRITE_FP(val) d10v_write_fp (val)
+#define TARGET_READ_FP() d10v_read_sp ()
+#define TARGET_WRITE_FP(val) d10v_write_sp (val)
+#define TARGET_READ_SP() d10v_read_sp ()
+#define TARGET_WRITE_SP(val) d10v_write_sp (val)
/* Number of bits in the appropriate type */
#define TARGET_INT_BIT (2 * TARGET_CHAR_BIT)