aboutsummaryrefslogtreecommitdiff
path: root/gdb/config/arc
diff options
context:
space:
mode:
authorDavid Edelsohn <dje.gcc@gmail.com>1995-04-12 15:47:39 +0000
committerDavid Edelsohn <dje.gcc@gmail.com>1995-04-12 15:47:39 +0000
commitf0d795faf6c27dbb20435fdf4d341285431a1c52 (patch)
treecdc7eb1d08210c775683cb72e0b970d7f2f83577 /gdb/config/arc
parent32513ed10d69be713dd2e5efa2508af656ff29f7 (diff)
downloadgdb-f0d795faf6c27dbb20435fdf4d341285431a1c52.zip
gdb-f0d795faf6c27dbb20435fdf4d341285431a1c52.tar.gz
gdb-f0d795faf6c27dbb20435fdf4d341285431a1c52.tar.bz2
* arc-tdep.c: #include "gdbcmd.h".
(codestream_seek): Pass CORE_ADDR. (arc_cpu_type, tmp_arc_cpu_type, arc_cpu_type_table): New globals. (debug_pipeline_p): Likewise. (X_...): Instruction field access macros. (BUILD_INSN): Define. (codestream_tell): Allow for stream elements > 1 byte. (codestream_fill): Likewise. (setup_prologue_scan): New function. (arc_get_frame_setup): Call it. Update to current spec regarding prologues. Use BUILD_INSN. (skip_prologue): New argument `frameless_p'. Use BUILD_INSN. (arc_frame_saved_pc): New function. (frame_find_saved_regs): Use BUILD_INSN. (get_insn_type, single_step): New functions. (one_stepped): New global. (arc_set_cpu_type_command, arc_show_cpu_type_command): New functions. (arc_set_cpu_type): New function. (_initialize_arc_tdep): Define new `set' commands `cpu', `displaypipeline', and `debugpipeline'. * remote-arc.c (break_insn): Add bi-endian support. (arc_insert_breakpoint): Likewise. (arc_remove_breakpoint): Likewise. (switch_command): Delete. * arc/tm-arc.h (TARGET_BYTE_ORDER): Delete. (TARGET_BYTE_ORDER_SELECTABLE): Define. (DEFAULT_ARC_CPU_TYPE): Define. (SKIP_PROLOGUE_FRAMELESS_P): Define. (BREAKPOINT): Delete. (BIG_BREAKPOINT, LITTLE_BREAKPOINT): Define. (DECR_PC_AFTER_BREAK): Change to 8. (NO_SINGLE_STEP): Define. (ARC_PC_TO_REAL_ADDRESS): Define. (SAVED_PC_AFTER_CALL): Use it. (NUM_REGS, REGISTER_BYTES): Fix. (FRAME_SAVED_PC): Call arc_frame_saved_pc. (FRAME_LOCALS_ADDRESS): Fix.
Diffstat (limited to 'gdb/config/arc')
-rw-r--r--gdb/config/arc/tm-arc.h114
1 files changed, 77 insertions, 37 deletions
diff --git a/gdb/config/arc/tm-arc.h b/gdb/config/arc/tm-arc.h
index a0285c5..83a197a 100644
--- a/gdb/config/arc/tm-arc.h
+++ b/gdb/config/arc/tm-arc.h
@@ -1,6 +1,6 @@
/* Parameters for target machine ARC, for GDB, the GNU debugger.
Copyright (C) 1995 Free Software Foundation, Inc.
- Contributed by Cygnus Support Corporation.
+ Contributed by Cygnus Support.
This file is part of GDB.
@@ -18,8 +18,11 @@ You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
-/* Byte order is configurable, but this machine runs little-endian. */
-#define TARGET_BYTE_ORDER LITTLE_ENDIAN
+/* Used by arc-tdep.c to set the default cpu type. */
+#define DEFAULT_ARC_CPU_TYPE "base"
+
+/* Byte order is selectable. */
+#define TARGET_BYTE_ORDER_SELECTABLE
/* We have IEEE floating point, if we have any float at all. */
#define IEEE_FLOAT
@@ -28,31 +31,61 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
Zero on most machines. */
#define FUNCTION_START_OFFSET 0
-/* Advance pc across any function entry prologue instructions
- to reach some "real" code. */
-
-#define SKIP_PROLOGUE(pc) { pc = skip_prologue (pc); }
-extern CORE_ADDR skip_prologue ();
-
-/* Sequence of bytes for breakpoint instruction. */
-#define BREAKPOINT {0x01, 0x80, 0xbe, 0x1f}
-
-#define DECR_PC_AFTER_BREAK 4
+/* Advance PC across any function entry prologue instructions
+ to reach some "real" code. SKIP_PROLOGUE_FRAMELESS_P advances
+ the PC past some of the prologue, but stops as soon as it
+ knows that the function has a frame. Its result is equal
+ to its input PC if the function is frameless, unequal otherwise. */
+
+#define SKIP_PROLOGUE(pc) \
+ { pc = skip_prologue (pc, 0); }
+#define SKIP_PROLOGUE_FRAMELESS_P(pc) \
+ { pc = skip_prologue (pc, 1); }
+extern CORE_ADDR skip_prologue PARAMS ((CORE_ADDR, int));
+
+/* Sequence of bytes for breakpoint instruction.
+ ??? The current value is "sr -1,[-1]" and is for the simulator only.
+ The simulator watches for this and does the right thing.
+ The hardware version will have to associate with each breakpoint
+ the sequence "flag 1; nop; nop; nop". IE: The breakpoint insn will not
+ be a fixed set of bits but instead will be a branch to a semi-random
+ address. Presumably this will be cleaned up for "second silicon". */
+#define BIG_BREAKPOINT { 0x12, 0x1f, 0xff, 0xff }
+#define LITTLE_BREAKPOINT { 0xff, 0xff, 0x1f, 0x12 }
+
+/* ??? This value may eventually be correct (if/when proper breakpoints
+ are added). Until then no value is correct so leave as is and cope. */
+#define DECR_PC_AFTER_BREAK 8
+
+/* We don't have a reliable single step facility.
+ ??? We do have a cycle single step facility, but that won't work. */
+#define NO_SINGLE_STEP
+extern int one_stepped;
+extern void single_step PARAMS ((int));
+
+/* Given a pc value as defined by the hardware, return the real address.
+ Remember that on the ARC blink contains that status register which
+ includes PC + flags (so we have to mask out the flags). */
+#define ARC_PC_TO_REAL_ADDRESS(pc) (((pc) & 0xffffff) << 2)
/* Immediately after a function call, return the saved pc.
Can't always go through the frames for this because on some machines
the new frame is not set up until the new function
executes some instructions. */
-#define SAVED_PC_AFTER_CALL(frame) (read_register (BLINK_REGNUM))
+#define SAVED_PC_AFTER_CALL(frame) \
+ (ARC_PC_TO_REAL_ADDRESS (read_register (BLINK_REGNUM)))
/* Stack grows upward */
#define INNER_THAN <
-/* Nonzero if instruction at pc is a return instruction. */
+/* Nonzero if instruction at pc is a return instruction.
+ This is the "j [blink]" insn (with or without conditionals or delay
+ slots). */
-#define ABOUT_TO_RETURN(pc) (read_memory_integer(pc,4) == 0x380f8000)
+#define ABOUT_TO_RETURN(pc) \
+ ((read_memory_integer(pc, 4) & 0xffffff80) == 0x380f8000)
/* Say how long (ordinary) registers are. This is a piece of bogosity
used in push_word and a few other places; REGISTER_RAW_SIZE is the
@@ -60,7 +93,7 @@ extern CORE_ADDR skip_prologue ();
#define REGISTER_SIZE 4
/* Number of machine registers */
-#define NUM_REGS 91
+#define NUM_REGS 92
/* Initializer for an array of names of registers.
There should be NUM_REGS strings in this initializer. */
@@ -97,6 +130,11 @@ extern CORE_ADDR skip_prologue ();
#define AUX_BEG_REGNUM 61 /* aux reg begins */
#define AUX_END_REGNUM 90 /* aux reg ends, pc not real aux reg */
+/* Fake registers used to mark immediate data. */
+#define SHIMM_FLAG_REGNUM 61
+#define LIMM_REGNUM 62
+#define SHIMM_REGNUM 63
+
#define AUX_REG_MAP \
{ \
{ 0, 1, 2, 3, 4, 5, \
@@ -129,7 +167,7 @@ extern CORE_ADDR skip_prologue ();
/* Total amount of space needed to store our copies of the machine's
register state, the array `registers'. */
-#define REGISTER_BYTES (91*4)
+#define REGISTER_BYTES (NUM_REGS * 4)
/* Index within `registers' of the first byte of the space for register N. */
#define REGISTER_BYTE(N) (4*(N))
@@ -165,7 +203,7 @@ extern CORE_ADDR skip_prologue ();
this is also an argument. This is used in call_function to build a
stack, and in value_being_returned to print return values.
- On arc, a structure is always retunred with pointer in r??. */
+ On arc, a structure is always retunred with pointer in r0. */
#define USE_STRUCT_CONVENTION(gcc_p, type) 1
@@ -199,11 +237,6 @@ extern CORE_ADDR skip_prologue ();
/* Describe the pointer in each stack frame to the previous stack frame
(its caller). */
-/* FRAME_CHAIN takes a frame's nominal address
- and produces the frame's chain-pointer.
- However, if FRAME_CHAIN_VALID returns zero,
- it means the given frame is the outermost one and has no caller. */
-
/* We cache information about saved registers in the frame structure,
to save us from having to re-scan function prologues every time
a register in a non-current frame is accessed. */
@@ -221,17 +254,20 @@ extern CORE_ADDR skip_prologue ();
#define INIT_EXTRA_FRAME_INFO(fromleaf, fi) \
((fi)->fsr = 0, (fi)->arg_pointer = -1)
+/* FRAME_CHAIN takes a frame's nominal address
+ and produces the frame's chain-pointer.
+ However, if FRAME_CHAIN_VALID returns zero,
+ it means the given frame is the outermost one and has no caller. */
/* On the arc, we get the chain pointer by reading the PFP saved
on the stack. */
-/* the PFP and RPC is in fp and fp+4. or it is in fp+4 and fp+8 ??? */
+/* The PFP and RPC is in fp and fp+4. */
#define FRAME_CHAIN(thisframe) \
- (read_memory_integer (FRAME_FP(thisframe), 4))
+ (read_memory_integer (FRAME_FP (thisframe), 4))
/* FRAME_CHAIN_VALID returns zero if the given frame is the outermost one
- and has no caller.
-#define FRAME_CHAIN_VALID(thisframe) \
- 1
+ and has no caller. */
+#define FRAME_CHAIN_VALID(chain, thisframe) ((chain) != 0)
/* 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
@@ -242,24 +278,28 @@ extern CORE_ADDR skip_prologue ();
if ((FI)->signal_handler_caller) \
(FRAMELESS) = 0; \
else \
- (FRAMELESS) = frameless_look_for_prologue(FI); \
+ (FRAMELESS) = frameless_look_for_prologue (FI); \
} while (0)
-#define FRAME_SAVED_PC(frame) \
- (read_memory_integer(FRAME_CHAIN(frame)+8,4))
+/* Where is the PC for a specific frame.
+ A leaf function may never save blink, so we have to check for that here. */
+
+#define FRAME_SAVED_PC(frame) (arc_frame_saved_pc (frame))
+struct frame_info; /* in case frame.h not included yet */
+CORE_ADDR arc_frame_saved_pc PARAMS ((struct frame_info *));
-/* On the ARC, FRAME_ARGS_ADDRESS should return the value of
- g14 as passed into the frame, if known. We need a function for this.
+/* If the argument is on the stack, it will be here.
We cache this value in the frame info if we've already looked it up. */
+/* ??? Is the arg_pointer check necessary? */
-#define FRAME_ARGS_ADDRESS(fi) \
- (((fi)->arg_pointer != -1)? (fi)->arg_pointer: (fi)->frame + 4)
+#define FRAME_ARGS_ADDRESS(fi) \
+ (((fi)->arg_pointer != -1) ? (fi)->arg_pointer : (fi)->frame)
/* This is the same except it should return 0 when
it does not really know where the args are, rather than guessing.
This value is not cached since it is only used infrequently. */
-#define FRAME_LOCALS_ADDRESS(fi) (fi)->frame + 4
+#define FRAME_LOCALS_ADDRESS(fi) ((fi)->frame)
/* Set NUMARGS to the number of args passed to a frame.
Can return -1, meaning no way to tell. */