-/* Parameters for execution on a Matsushita mn10200 processor.
-
- Copyright 1997, 1998, 1999, 2000, 2001, 2002, 2003 Free Software
- Foundation, Inc.
-
- Contributed by Geoffrey Noer <noer@cygnus.com>
-
- This file is part of GDB.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- 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., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
-
-/* FIXME: cagney/2001-03-01: The below macros refer to functions
- declared in "regcache.h". The ``correct fix'' is to convert those
- macros into functions. */
-#include "regcache.h"
-#include "symtab.h" /* For namespace_enum. */
-#include "symfile.h" /* For entry_point_address(). */
-
-/* ints are only 16bits on the mn10200. */
-#undef TARGET_INT_BIT
-#define TARGET_INT_BIT 16
-
-/* The mn10200 doesn't support long long types. */
-#undef TARGET_LONG_LONG_BIT
-#define TARGET_LONG_LONG_BIT 32
-
-/* The mn10200 doesn't support double or long double either. */
-#undef TARGET_DOUBLE_BIT
-#undef TARGET_LONG_DOUBLE_BIT
-#define TARGET_DOUBLE_BIT 32
-#define TARGET_LONG_DOUBLE_BIT 32
-
-/* Not strictly correct, but the machine independent code is not
- ready to handle any of the basic sizes not being a power of two. */
-#undef TARGET_PTR_BIT
-#define TARGET_PTR_BIT 32
-
-/* The mn10200 really has 24 bit registers but the simulator reads/writes
- them as 32bit values, so we claim they're 32bits each. This may have
- to be tweaked if the Matsushita emulator/board really deals with them
- as 24bits each. */
-#define REGISTER_SIZE 4
-
-#define MAX_REGISTER_RAW_SIZE REGISTER_SIZE
-#define NUM_REGS 11
-
-#define REGISTER_BYTES (NUM_REGS * REGISTER_SIZE)
-
-#define REGISTER_NAMES \
-{ "d0", "d1", "d2", "d3", "a0", "a1", "a2", "sp", \
- "pc", "mdr", "psw"}
-
-#define FP_REGNUM 6
-#define SP_REGNUM 7
-#define PC_REGNUM 8
-#define MDR_REGNUM 9
-#define PSW_REGNUM 10
-
-/* Treat the registers as 32bit values. */
-#define REGISTER_VIRTUAL_TYPE(REG) builtin_type_long
-
-#define REGISTER_BYTE(REG) ((REG) * REGISTER_SIZE)
-#define REGISTER_VIRTUAL_SIZE(REG) REGISTER_SIZE
-#define REGISTER_RAW_SIZE(REG) REGISTER_SIZE
-
-#define MAX_REGISTER_VIRTUAL_SIZE REGISTER_SIZE
-
-/* The breakpoint instruction must be the same size as te smallest
- instruction in the instruction set.
-
- The Matsushita mn10x00 processors have single byte instructions
- so we need a single byte breakpoint. Matsushita hasn't defined
- one, so we defined it ourselves.
-
- 0xff is the only available single byte insn left on the mn10200. */
-#define BREAKPOINT {0xff}
-
-#define FUNCTION_START_OFFSET 0
-
-#define DECR_PC_AFTER_BREAK 0
-
-/* Stacks grow the normal way. */
-#define INNER_THAN(lhs,rhs) ((lhs) < (rhs))
-
-#define SAVED_PC_AFTER_CALL(frame) \
- (read_memory_integer (read_register (SP_REGNUM), REGISTER_SIZE) & 0xffffff)
-
-struct frame_info;
-struct frame_saved_regs;
-struct type;
-struct value;
-
-#define EXTRA_FRAME_INFO struct frame_saved_regs fsr; int status; int stack_size;
-
-extern void mn10200_init_extra_frame_info (struct frame_info *);
-#define INIT_EXTRA_FRAME_INFO(fromleaf, fi) mn10200_init_extra_frame_info (fi)
-#define DEPRECATED_INIT_FRAME_PC(x,y) (init_frame_pc_noop (x, y))
-#define INIT_FRAME_PC_FIRST(x,y) (init_frame_pc_noop (x, y))
-
-extern void mn10200_frame_find_saved_regs (struct frame_info *,
- struct frame_saved_regs *);
-#define FRAME_FIND_SAVED_REGS(fi, regaddr) regaddr = fi->fsr
-
-extern CORE_ADDR mn10200_frame_chain (struct frame_info *);
-#define FRAME_CHAIN(fi) mn10200_frame_chain (fi)
-
-extern CORE_ADDR mn10200_find_callers_reg (struct frame_info *, int);
-extern CORE_ADDR mn10200_frame_saved_pc (struct frame_info *);
-#define FRAME_SAVED_PC(FI) (mn10200_frame_saved_pc (FI))
-
-/* Extract from an array REGBUF containing the (raw) register state
- a function return value of type TYPE, and copy that, in virtual format,
- into VALBUF. */
-
-#define DEPRECATED_EXTRACT_RETURN_VALUE(TYPE, REGBUF, VALBUF) \
- { \
- if (TYPE_LENGTH (TYPE) > 8) \
- internal_error (__FILE__, __LINE__, "failed internal consistency check"); \
- else if (TYPE_LENGTH (TYPE) > 2 && TYPE_CODE (TYPE) != TYPE_CODE_PTR) \
- { \
- memcpy (VALBUF, REGBUF + REGISTER_BYTE (0), 2); \
- memcpy (VALBUF + 2, REGBUF + REGISTER_BYTE (1), 2); \
- } \
- else if (TYPE_CODE (TYPE) == TYPE_CODE_PTR)\
- { \
- memcpy (VALBUF, REGBUF + REGISTER_BYTE (4), TYPE_LENGTH (TYPE)); \
- } \
- else \
- { \
- memcpy (VALBUF, REGBUF + REGISTER_BYTE (0), TYPE_LENGTH (TYPE)); \
- } \
- }
-
-#define DEPRECATED_EXTRACT_STRUCT_VALUE_ADDRESS(REGBUF) \
- extract_address (REGBUF + REGISTER_BYTE (4), \
- REGISTER_RAW_SIZE (4))
-
-#define DEPRECATED_STORE_RETURN_VALUE(TYPE, VALBUF) \
- { \
- if (TYPE_LENGTH (TYPE) > 8) \
- internal_error (__FILE__, __LINE__, "failed internal consistency check"); \
- else if (TYPE_LENGTH (TYPE) > 2 && TYPE_CODE (TYPE) != TYPE_CODE_PTR) \
- { \
- deprecated_write_register_bytes (REGISTER_BYTE (0), VALBUF, 2); \
- deprecated_write_register_bytes (REGISTER_BYTE (1), VALBUF + 2, 2); \
- } \
- else if (TYPE_CODE (TYPE) == TYPE_CODE_PTR)\
- { \
- deprecated_write_register_bytes (REGISTER_BYTE (4), VALBUF, TYPE_LENGTH (TYPE)); \
- } \
- else \
- { \
- deprecated_write_register_bytes (REGISTER_BYTE (0), VALBUF, TYPE_LENGTH (TYPE)); \
- } \
- }
-
-
-extern CORE_ADDR mn10200_store_struct_return (CORE_ADDR addr, CORE_ADDR sp);
-#define STORE_STRUCT_RETURN(STRUCT_ADDR, SP) \
- (SP) = mn10200_store_struct_return (STRUCT_ADDR, SP)
-
-extern CORE_ADDR mn10200_skip_prologue (CORE_ADDR);
-#define SKIP_PROLOGUE(pc) (mn10200_skip_prologue (pc))
-
-#define FRAME_ARGS_SKIP 0
-
-#define FRAME_ARGS_ADDRESS(fi) (get_frame_base (fi))
-#define FRAME_LOCALS_ADDRESS(fi) (get_frame_base (fi))
-#define FRAME_NUM_ARGS(fi) (-1)
-
-extern void mn10200_pop_frame (struct frame_info *);
-#define POP_FRAME mn10200_pop_frame (get_current_frame ())
-
-#define DEPRECATED_USE_GENERIC_DUMMY_FRAMES 1
-#define CALL_DUMMY {0}
-#define CALL_DUMMY_START_OFFSET (0)
-#define CALL_DUMMY_BREAKPOINT_OFFSET (0)
-#define CALL_DUMMY_LOCATION AT_ENTRY_POINT
-#define FIX_CALL_DUMMY(DUMMY, START, FUNADDR, NARGS, ARGS, TYPE, GCCP)
-#define CALL_DUMMY_ADDRESS() entry_point_address ()
-
-extern CORE_ADDR mn10200_push_return_address (CORE_ADDR, CORE_ADDR);
-#define PUSH_RETURN_ADDRESS(PC, SP) mn10200_push_return_address (PC, SP)
-
-#define PUSH_DUMMY_FRAME generic_push_dummy_frame ()
-
-extern CORE_ADDR mn10200_push_arguments (int, struct value **, CORE_ADDR,
- unsigned char, CORE_ADDR);
-#define PUSH_ARGUMENTS(NARGS, ARGS, SP, STRUCT_RETURN, STRUCT_ADDR) \
- (mn10200_push_arguments (NARGS, ARGS, SP, STRUCT_RETURN, STRUCT_ADDR))
-
-#define DEPRECATED_PC_IN_CALL_DUMMY(PC, SP, FP) generic_pc_in_call_dummy (PC, SP, FP)
-
-#define REG_STRUCT_HAS_ADDR(gcc_p,TYPE) \
- (TYPE_LENGTH (TYPE) > 8)
-
-extern use_struct_convention_fn mn10200_use_struct_convention;
-#define USE_STRUCT_CONVENTION(GCC_P, TYPE) mn10200_use_struct_convention (GCC_P, TYPE)
-
-/* Define this for Wingdb */
-#define TARGET_MN10200
+// OBSOLETE /* Parameters for execution on a Matsushita mn10200 processor.
+// OBSOLETE
+// OBSOLETE Copyright 1997, 1998, 1999, 2000, 2001, 2002, 2003 Free Software
+// OBSOLETE Foundation, Inc.
+// OBSOLETE
+// OBSOLETE Contributed by Geoffrey Noer <noer@cygnus.com>
+// OBSOLETE
+// OBSOLETE This file is part of GDB.
+// OBSOLETE
+// OBSOLETE This program is free software; you can redistribute it and/or modify
+// OBSOLETE it under the terms of the GNU General Public License as published by
+// OBSOLETE the Free Software Foundation; either version 2 of the License, or
+// OBSOLETE (at your option) any later version.
+// OBSOLETE
+// OBSOLETE This program is distributed in the hope that it will be useful,
+// OBSOLETE but WITHOUT ANY WARRANTY; without even the implied warranty of
+// OBSOLETE MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// OBSOLETE GNU General Public License for more details.
+// OBSOLETE
+// OBSOLETE You should have received a copy of the GNU General Public License
+// OBSOLETE along with this program; if not, write to the Free Software
+// OBSOLETE Foundation, Inc., 59 Temple Place - Suite 330,
+// OBSOLETE Boston, MA 02111-1307, USA. */
+// OBSOLETE
+// OBSOLETE /* FIXME: cagney/2001-03-01: The below macros refer to functions
+// OBSOLETE declared in "regcache.h". The ``correct fix'' is to convert those
+// OBSOLETE macros into functions. */
+// OBSOLETE #include "regcache.h"
+// OBSOLETE #include "symtab.h" /* For namespace_enum. */
+// OBSOLETE #include "symfile.h" /* For entry_point_address(). */
+// OBSOLETE
+// OBSOLETE /* ints are only 16bits on the mn10200. */
+// OBSOLETE #undef TARGET_INT_BIT
+// OBSOLETE #define TARGET_INT_BIT 16
+// OBSOLETE
+// OBSOLETE /* The mn10200 doesn't support long long types. */
+// OBSOLETE #undef TARGET_LONG_LONG_BIT
+// OBSOLETE #define TARGET_LONG_LONG_BIT 32
+// OBSOLETE
+// OBSOLETE /* The mn10200 doesn't support double or long double either. */
+// OBSOLETE #undef TARGET_DOUBLE_BIT
+// OBSOLETE #undef TARGET_LONG_DOUBLE_BIT
+// OBSOLETE #define TARGET_DOUBLE_BIT 32
+// OBSOLETE #define TARGET_LONG_DOUBLE_BIT 32
+// OBSOLETE
+// OBSOLETE /* Not strictly correct, but the machine independent code is not
+// OBSOLETE ready to handle any of the basic sizes not being a power of two. */
+// OBSOLETE #undef TARGET_PTR_BIT
+// OBSOLETE #define TARGET_PTR_BIT 32
+// OBSOLETE
+// OBSOLETE /* The mn10200 really has 24 bit registers but the simulator reads/writes
+// OBSOLETE them as 32bit values, so we claim they're 32bits each. This may have
+// OBSOLETE to be tweaked if the Matsushita emulator/board really deals with them
+// OBSOLETE as 24bits each. */
+// OBSOLETE #define REGISTER_SIZE 4
+// OBSOLETE
+// OBSOLETE #define MAX_REGISTER_RAW_SIZE REGISTER_SIZE
+// OBSOLETE #define NUM_REGS 11
+// OBSOLETE
+// OBSOLETE #define REGISTER_BYTES (NUM_REGS * REGISTER_SIZE)
+// OBSOLETE
+// OBSOLETE #define REGISTER_NAMES \
+// OBSOLETE { "d0", "d1", "d2", "d3", "a0", "a1", "a2", "sp", \
+// OBSOLETE "pc", "mdr", "psw"}
+// OBSOLETE
+// OBSOLETE #define FP_REGNUM 6
+// OBSOLETE #define SP_REGNUM 7
+// OBSOLETE #define PC_REGNUM 8
+// OBSOLETE #define MDR_REGNUM 9
+// OBSOLETE #define PSW_REGNUM 10
+// OBSOLETE
+// OBSOLETE /* Treat the registers as 32bit values. */
+// OBSOLETE #define REGISTER_VIRTUAL_TYPE(REG) builtin_type_long
+// OBSOLETE
+// OBSOLETE #define REGISTER_BYTE(REG) ((REG) * REGISTER_SIZE)
+// OBSOLETE #define REGISTER_VIRTUAL_SIZE(REG) REGISTER_SIZE
+// OBSOLETE #define REGISTER_RAW_SIZE(REG) REGISTER_SIZE
+// OBSOLETE
+// OBSOLETE #define MAX_REGISTER_VIRTUAL_SIZE REGISTER_SIZE
+// OBSOLETE
+// OBSOLETE /* The breakpoint instruction must be the same size as te smallest
+// OBSOLETE instruction in the instruction set.
+// OBSOLETE
+// OBSOLETE The Matsushita mn10x00 processors have single byte instructions
+// OBSOLETE so we need a single byte breakpoint. Matsushita hasn't defined
+// OBSOLETE one, so we defined it ourselves.
+// OBSOLETE
+// OBSOLETE 0xff is the only available single byte insn left on the mn10200. */
+// OBSOLETE #define BREAKPOINT {0xff}
+// OBSOLETE
+// OBSOLETE #define FUNCTION_START_OFFSET 0
+// OBSOLETE
+// OBSOLETE #define DECR_PC_AFTER_BREAK 0
+// OBSOLETE
+// OBSOLETE /* Stacks grow the normal way. */
+// OBSOLETE #define INNER_THAN(lhs,rhs) ((lhs) < (rhs))
+// OBSOLETE
+// OBSOLETE #define SAVED_PC_AFTER_CALL(frame) \
+// OBSOLETE (read_memory_integer (read_register (SP_REGNUM), REGISTER_SIZE) & 0xffffff)
+// OBSOLETE
+// OBSOLETE struct frame_info;
+// OBSOLETE struct frame_saved_regs;
+// OBSOLETE struct type;
+// OBSOLETE struct value;
+// OBSOLETE
+// OBSOLETE #define EXTRA_FRAME_INFO struct frame_saved_regs fsr; int status; int stack_size;
+// OBSOLETE
+// OBSOLETE extern void mn10200_init_extra_frame_info (struct frame_info *);
+// OBSOLETE #define INIT_EXTRA_FRAME_INFO(fromleaf, fi) mn10200_init_extra_frame_info (fi)
+// OBSOLETE #define DEPRECATED_INIT_FRAME_PC(x,y) (init_frame_pc_noop (x, y))
+// OBSOLETE #define INIT_FRAME_PC_FIRST(x,y) (init_frame_pc_noop (x, y))
+// OBSOLETE
+// OBSOLETE extern void mn10200_frame_find_saved_regs (struct frame_info *,
+// OBSOLETE struct frame_saved_regs *);
+// OBSOLETE #define FRAME_FIND_SAVED_REGS(fi, regaddr) regaddr = fi->fsr
+// OBSOLETE
+// OBSOLETE extern CORE_ADDR mn10200_frame_chain (struct frame_info *);
+// OBSOLETE #define FRAME_CHAIN(fi) mn10200_frame_chain (fi)
+// OBSOLETE
+// OBSOLETE extern CORE_ADDR mn10200_find_callers_reg (struct frame_info *, int);
+// OBSOLETE extern CORE_ADDR mn10200_frame_saved_pc (struct frame_info *);
+// OBSOLETE #define FRAME_SAVED_PC(FI) (mn10200_frame_saved_pc (FI))
+// OBSOLETE
+// OBSOLETE /* Extract from an array REGBUF containing the (raw) register state
+// OBSOLETE a function return value of type TYPE, and copy that, in virtual format,
+// OBSOLETE into VALBUF. */
+// OBSOLETE
+// OBSOLETE #define DEPRECATED_EXTRACT_RETURN_VALUE(TYPE, REGBUF, VALBUF) \
+// OBSOLETE { \
+// OBSOLETE if (TYPE_LENGTH (TYPE) > 8) \
+// OBSOLETE internal_error (__FILE__, __LINE__, "failed internal consistency check"); \
+// OBSOLETE else if (TYPE_LENGTH (TYPE) > 2 && TYPE_CODE (TYPE) != TYPE_CODE_PTR) \
+// OBSOLETE { \
+// OBSOLETE memcpy (VALBUF, REGBUF + REGISTER_BYTE (0), 2); \
+// OBSOLETE memcpy (VALBUF + 2, REGBUF + REGISTER_BYTE (1), 2); \
+// OBSOLETE } \
+// OBSOLETE else if (TYPE_CODE (TYPE) == TYPE_CODE_PTR)\
+// OBSOLETE { \
+// OBSOLETE memcpy (VALBUF, REGBUF + REGISTER_BYTE (4), TYPE_LENGTH (TYPE)); \
+// OBSOLETE } \
+// OBSOLETE else \
+// OBSOLETE { \
+// OBSOLETE memcpy (VALBUF, REGBUF + REGISTER_BYTE (0), TYPE_LENGTH (TYPE)); \
+// OBSOLETE } \
+// OBSOLETE }
+// OBSOLETE
+// OBSOLETE #define DEPRECATED_EXTRACT_STRUCT_VALUE_ADDRESS(REGBUF) \
+// OBSOLETE extract_address (REGBUF + REGISTER_BYTE (4), \
+// OBSOLETE REGISTER_RAW_SIZE (4))
+// OBSOLETE
+// OBSOLETE #define DEPRECATED_STORE_RETURN_VALUE(TYPE, VALBUF) \
+// OBSOLETE { \
+// OBSOLETE if (TYPE_LENGTH (TYPE) > 8) \
+// OBSOLETE internal_error (__FILE__, __LINE__, "failed internal consistency check"); \
+// OBSOLETE else if (TYPE_LENGTH (TYPE) > 2 && TYPE_CODE (TYPE) != TYPE_CODE_PTR) \
+// OBSOLETE { \
+// OBSOLETE deprecated_write_register_bytes (REGISTER_BYTE (0), VALBUF, 2); \
+// OBSOLETE deprecated_write_register_bytes (REGISTER_BYTE (1), VALBUF + 2, 2); \
+// OBSOLETE } \
+// OBSOLETE else if (TYPE_CODE (TYPE) == TYPE_CODE_PTR)\
+// OBSOLETE { \
+// OBSOLETE deprecated_write_register_bytes (REGISTER_BYTE (4), VALBUF, TYPE_LENGTH (TYPE)); \
+// OBSOLETE } \
+// OBSOLETE else \
+// OBSOLETE { \
+// OBSOLETE deprecated_write_register_bytes (REGISTER_BYTE (0), VALBUF, TYPE_LENGTH (TYPE)); \
+// OBSOLETE } \
+// OBSOLETE }
+// OBSOLETE
+// OBSOLETE
+// OBSOLETE extern CORE_ADDR mn10200_store_struct_return (CORE_ADDR addr, CORE_ADDR sp);
+// OBSOLETE #define STORE_STRUCT_RETURN(STRUCT_ADDR, SP) \
+// OBSOLETE (SP) = mn10200_store_struct_return (STRUCT_ADDR, SP)
+// OBSOLETE
+// OBSOLETE extern CORE_ADDR mn10200_skip_prologue (CORE_ADDR);
+// OBSOLETE #define SKIP_PROLOGUE(pc) (mn10200_skip_prologue (pc))
+// OBSOLETE
+// OBSOLETE #define FRAME_ARGS_SKIP 0
+// OBSOLETE
+// OBSOLETE #define FRAME_ARGS_ADDRESS(fi) (get_frame_base (fi))
+// OBSOLETE #define FRAME_LOCALS_ADDRESS(fi) (get_frame_base (fi))
+// OBSOLETE #define FRAME_NUM_ARGS(fi) (-1)
+// OBSOLETE
+// OBSOLETE extern void mn10200_pop_frame (struct frame_info *);
+// OBSOLETE #define POP_FRAME mn10200_pop_frame (get_current_frame ())
+// OBSOLETE
+// OBSOLETE #define DEPRECATED_USE_GENERIC_DUMMY_FRAMES 1
+// OBSOLETE #define CALL_DUMMY {0}
+// OBSOLETE #define CALL_DUMMY_START_OFFSET (0)
+// OBSOLETE #define CALL_DUMMY_BREAKPOINT_OFFSET (0)
+// OBSOLETE #define CALL_DUMMY_LOCATION AT_ENTRY_POINT
+// OBSOLETE #define FIX_CALL_DUMMY(DUMMY, START, FUNADDR, NARGS, ARGS, TYPE, GCCP)
+// OBSOLETE #define CALL_DUMMY_ADDRESS() entry_point_address ()
+// OBSOLETE
+// OBSOLETE extern CORE_ADDR mn10200_push_return_address (CORE_ADDR, CORE_ADDR);
+// OBSOLETE #define PUSH_RETURN_ADDRESS(PC, SP) mn10200_push_return_address (PC, SP)
+// OBSOLETE
+// OBSOLETE #define PUSH_DUMMY_FRAME generic_push_dummy_frame ()
+// OBSOLETE
+// OBSOLETE extern CORE_ADDR mn10200_push_arguments (int, struct value **, CORE_ADDR,
+// OBSOLETE unsigned char, CORE_ADDR);
+// OBSOLETE #define PUSH_ARGUMENTS(NARGS, ARGS, SP, STRUCT_RETURN, STRUCT_ADDR) \
+// OBSOLETE (mn10200_push_arguments (NARGS, ARGS, SP, STRUCT_RETURN, STRUCT_ADDR))
+// OBSOLETE
+// OBSOLETE #define DEPRECATED_PC_IN_CALL_DUMMY(PC, SP, FP) generic_pc_in_call_dummy (PC, SP, FP)
+// OBSOLETE
+// OBSOLETE #define REG_STRUCT_HAS_ADDR(gcc_p,TYPE) \
+// OBSOLETE (TYPE_LENGTH (TYPE) > 8)
+// OBSOLETE
+// OBSOLETE extern use_struct_convention_fn mn10200_use_struct_convention;
+// OBSOLETE #define USE_STRUCT_CONVENTION(GCC_P, TYPE) mn10200_use_struct_convention (GCC_P, TYPE)
+// OBSOLETE
+// OBSOLETE /* Define this for Wingdb */
+// OBSOLETE #define TARGET_MN10200
-/* Target-dependent code for the Matsushita MN10200 for GDB, the GNU debugger.
-
- Copyright 1997, 1998, 1999, 2000, 2001, 2003 Free Software
- Foundation, Inc.
-
- This file is part of GDB.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- 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., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
-
-#include "defs.h"
-#include "frame.h"
-#include "inferior.h"
-#include "target.h"
-#include "value.h"
-#include "bfd.h"
-#include "gdb_string.h"
-#include "gdbcore.h"
-#include "symfile.h"
-#include "regcache.h"
-
-
-/* Should call_function allocate stack space for a struct return? */
-int
-mn10200_use_struct_convention (int gcc_p, struct type *type)
-{
- return (TYPE_NFIELDS (type) > 1 || TYPE_LENGTH (type) > 8);
-}
-/* *INDENT-OFF* */
-/* The main purpose of this file is dealing with prologues to extract
- information about stack frames and saved registers.
-
- For reference here's how prologues look on the mn10200:
-
- With frame pointer:
- mov fp,a0
- mov sp,fp
- add <size>,sp
- Register saves for d2, d3, a1, a2 as needed. Saves start
- at fp - <size> + <outgoing_args_size> and work towards higher
- addresses. Note that the saves are actually done off the stack
- pointer in the prologue! This makes for smaller code and easier
- prologue scanning as the displacement fields will unlikely
- be more than 8 bits!
-
- Without frame pointer:
- add <size>,sp
- Register saves for d2, d3, a1, a2 as needed. Saves start
- at sp + <outgoing_args_size> and work towards higher addresses.
-
- Out of line prologue:
- add <local size>,sp -- optional
- jsr __prologue
- add <outgoing_size>,sp -- optional
-
- The stack pointer remains constant throughout the life of most
- functions. As a result the compiler will usually omit the
- frame pointer, so we must handle frame pointerless functions. */
-
-/* Analyze the prologue to determine where registers are saved,
- the end of the prologue, etc etc. Return the end of the prologue
- scanned.
-
- We store into FI (if non-null) several tidbits of information:
-
- * stack_size -- size of this stack frame. Note that if we stop in
- certain parts of the prologue/epilogue we may claim the size of the
- current frame is zero. This happens when the current frame has
- not been allocated yet or has already been deallocated.
-
- * fsr -- Addresses of registers saved in the stack by this frame.
-
- * status -- A (relatively) generic status indicator. It's a bitmask
- with the following bits:
-
- MY_FRAME_IN_SP: The base of the current frame is actually in
- the stack pointer. This can happen for frame pointerless
- functions, or cases where we're stopped in the prologue/epilogue
- itself. For these cases mn10200_analyze_prologue will need up
- update fi->frame before returning or analyzing the register
- save instructions.
-
- MY_FRAME_IN_FP: The base of the current frame is in the
- frame pointer register ($a2).
-
- CALLER_A2_IN_A0: $a2 from the caller's frame is temporarily
- in $a0. This can happen if we're stopped in the prologue.
-
- NO_MORE_FRAMES: Set this if the current frame is "start" or
- if the first instruction looks like mov <imm>,sp. This tells
- frame chain to not bother trying to unwind past this frame. */
-/* *INDENT-ON* */
-
-
-
-
-#define MY_FRAME_IN_SP 0x1
-#define MY_FRAME_IN_FP 0x2
-#define CALLER_A2_IN_A0 0x4
-#define NO_MORE_FRAMES 0x8
-
-static CORE_ADDR
-mn10200_analyze_prologue (struct frame_info *fi, CORE_ADDR pc)
-{
- CORE_ADDR func_addr, func_end, addr, stop;
- CORE_ADDR stack_size = 0;
- unsigned char buf[4];
- int status;
- char *name;
- int out_of_line_prologue = 0;
-
- /* Use the PC in the frame if it's provided to look up the
- start of this function. */
- pc = (fi ? get_frame_pc (fi) : pc);
-
- /* Find the start of this function. */
- status = find_pc_partial_function (pc, &name, &func_addr, &func_end);
-
- /* Do nothing if we couldn't find the start of this function or if we're
- stopped at the first instruction in the prologue. */
- if (status == 0)
- return pc;
-
- /* If we're in start, then give up. */
- if (strcmp (name, "start") == 0)
- {
- if (fi)
- fi->status = NO_MORE_FRAMES;
- return pc;
- }
-
- /* At the start of a function our frame is in the stack pointer. */
- if (fi)
- fi->status = MY_FRAME_IN_SP;
-
- /* If we're physically on an RTS instruction, then our frame has already
- been deallocated.
-
- fi->frame is bogus, we need to fix it. */
- if (fi && get_frame_pc (fi) + 1 == func_end)
- {
- status = target_read_memory (get_frame_pc (fi), buf, 1);
- if (status != 0)
- {
- if (get_next_frame (fi) == NULL)
- deprecated_update_frame_base_hack (fi, read_sp ());
- return get_frame_pc (fi);
- }
-
- if (buf[0] == 0xfe)
- {
- if (get_next_frame (fi) == NULL)
- deprecated_update_frame_base_hack (fi, read_sp ());
- return get_frame_pc (fi);
- }
- }
-
- /* Similarly if we're stopped on the first insn of a prologue as our
- frame hasn't been allocated yet. */
- if (fi && get_frame_pc (fi) == func_addr)
- {
- if (get_next_frame (fi) == NULL)
- deprecated_update_frame_base_hack (fi, read_sp ());
- return get_frame_pc (fi);
- }
-
- /* Figure out where to stop scanning. */
- stop = fi ? get_frame_pc (fi) : func_end;
-
- /* Don't walk off the end of the function. */
- stop = stop > func_end ? func_end : stop;
-
- /* Start scanning on the first instruction of this function. */
- addr = func_addr;
-
- status = target_read_memory (addr, buf, 2);
- if (status != 0)
- {
- if (fi && get_next_frame (fi) == NULL && fi->status & MY_FRAME_IN_SP)
- deprecated_update_frame_base_hack (fi, read_sp ());
- return addr;
- }
-
- /* First see if this insn sets the stack pointer; if so, it's something
- we won't understand, so quit now. */
- if (buf[0] == 0xdf
- || (buf[0] == 0xf4 && buf[1] == 0x77))
- {
- if (fi)
- fi->status = NO_MORE_FRAMES;
- return addr;
- }
-
- /* Now see if we have a frame pointer.
-
- Search for mov a2,a0 (0xf278)
- then mov a3,a2 (0xf27e). */
-
- if (buf[0] == 0xf2 && buf[1] == 0x78)
- {
- /* Our caller's $a2 will be found in $a0 now. Note it for
- our callers. */
- if (fi)
- fi->status |= CALLER_A2_IN_A0;
- addr += 2;
- if (addr >= stop)
- {
- /* We still haven't allocated our local stack. Handle this
- as if we stopped on the first or last insn of a function. */
- if (fi && get_next_frame (fi) == NULL)
- deprecated_update_frame_base_hack (fi, read_sp ());
- return addr;
- }
-
- status = target_read_memory (addr, buf, 2);
- if (status != 0)
- {
- if (fi && get_next_frame (fi) == NULL)
- deprecated_update_frame_base_hack (fi, read_sp ());
- return addr;
- }
- if (buf[0] == 0xf2 && buf[1] == 0x7e)
- {
- addr += 2;
-
- /* Our frame pointer is valid now. */
- if (fi)
- {
- fi->status |= MY_FRAME_IN_FP;
- fi->status &= ~MY_FRAME_IN_SP;
- }
- if (addr >= stop)
- return addr;
- }
- else
- {
- if (fi && get_next_frame (fi) == NULL)
- deprecated_update_frame_base_hack (fi, read_sp ());
- return addr;
- }
- }
-
- /* Next we should allocate the local frame.
-
- Search for add imm8,a3 (0xd3XX)
- or add imm16,a3 (0xf70bXXXX)
- or add imm24,a3 (0xf467XXXXXX).
-
- If none of the above was found, then this prologue has
- no stack, and therefore can't have any register saves,
- so quit now. */
- status = target_read_memory (addr, buf, 2);
- if (status != 0)
- {
- if (fi && get_next_frame (fi) == NULL && (fi->status & MY_FRAME_IN_SP))
- deprecated_update_frame_base_hack (fi, read_sp ());
- return addr;
- }
- if (buf[0] == 0xd3)
- {
- stack_size = extract_signed_integer (&buf[1], 1);
- if (fi)
- fi->stack_size = stack_size;
- addr += 2;
- if (addr >= stop)
- {
- if (fi && get_next_frame (fi) == NULL && (fi->status & MY_FRAME_IN_SP))
- deprecated_update_frame_base_hack (fi, read_sp () - stack_size);
- return addr;
- }
- }
- else if (buf[0] == 0xf7 && buf[1] == 0x0b)
- {
- status = target_read_memory (addr + 2, buf, 2);
- if (status != 0)
- {
- if (fi && get_next_frame (fi) == NULL && (fi->status & MY_FRAME_IN_SP))
- deprecated_update_frame_base_hack (fi, read_sp ());
- return addr;
- }
- stack_size = extract_signed_integer (buf, 2);
- if (fi)
- fi->stack_size = stack_size;
- addr += 4;
- if (addr >= stop)
- {
- if (fi && get_next_frame (fi) == NULL && (fi->status & MY_FRAME_IN_SP))
- deprecated_update_frame_base_hack (fi, read_sp () - stack_size);
- return addr;
- }
- }
- else if (buf[0] == 0xf4 && buf[1] == 0x67)
- {
- status = target_read_memory (addr + 2, buf, 3);
- if (status != 0)
- {
- if (fi && get_next_frame (fi) == NULL && (fi->status & MY_FRAME_IN_SP))
- deprecated_update_frame_base_hack (fi, read_sp ());
- return addr;
- }
- stack_size = extract_signed_integer (buf, 3);
- if (fi)
- fi->stack_size = stack_size;
- addr += 5;
- if (addr >= stop)
- {
- if (fi && get_next_frame (fi) == NULL && (fi->status & MY_FRAME_IN_SP))
- deprecated_update_frame_base_hack (fi, read_sp () - stack_size);
- return addr;
- }
- }
-
- /* Now see if we have a call to __prologue for an out of line
- prologue. */
- status = target_read_memory (addr, buf, 2);
- if (status != 0)
- return addr;
-
- /* First check for 16bit pc-relative call to __prologue. */
- if (buf[0] == 0xfd)
- {
- CORE_ADDR temp;
- status = target_read_memory (addr + 1, buf, 2);
- if (status != 0)
- {
- if (fi && get_next_frame (fi) == NULL && (fi->status & MY_FRAME_IN_SP))
- deprecated_update_frame_base_hack (fi, read_sp ());
- return addr;
- }
-
- /* Get the PC this instruction will branch to. */
- temp = (extract_signed_integer (buf, 2) + addr + 3) & 0xffffff;
-
- /* Get the name of the function at the target address. */
- status = find_pc_partial_function (temp, &name, NULL, NULL);
- if (status == 0)
- {
- if (fi && get_next_frame (fi) == NULL && (fi->status & MY_FRAME_IN_SP))
- deprecated_update_frame_base_hack (fi, read_sp ());
- return addr;
- }
-
- /* Note if it is an out of line prologue. */
- out_of_line_prologue = (strcmp (name, "__prologue") == 0);
-
- /* This sucks up 3 bytes of instruction space. */
- if (out_of_line_prologue)
- addr += 3;
-
- if (addr >= stop)
- {
- if (fi && get_next_frame (fi) == NULL)
- {
- fi->stack_size -= 16;
- deprecated_update_frame_base_hack (fi, read_sp () - fi->stack_size);
- }
- return addr;
- }
- }
- /* Now check for the 24bit pc-relative call to __prologue. */
- else if (buf[0] == 0xf4 && buf[1] == 0xe1)
- {
- CORE_ADDR temp;
- status = target_read_memory (addr + 2, buf, 3);
- if (status != 0)
- {
- if (fi && get_next_frame (fi) == NULL && (fi->status & MY_FRAME_IN_SP))
- deprecated_update_frame_base_hack (fi, read_sp ());
- return addr;
- }
-
- /* Get the PC this instruction will branch to. */
- temp = (extract_signed_integer (buf, 3) + addr + 5) & 0xffffff;
-
- /* Get the name of the function at the target address. */
- status = find_pc_partial_function (temp, &name, NULL, NULL);
- if (status == 0)
- {
- if (fi && get_next_frame (fi) == NULL && (fi->status & MY_FRAME_IN_SP))
- deprecated_update_frame_base_hack (fi, read_sp ());
- return addr;
- }
-
- /* Note if it is an out of line prologue. */
- out_of_line_prologue = (strcmp (name, "__prologue") == 0);
-
- /* This sucks up 5 bytes of instruction space. */
- if (out_of_line_prologue)
- addr += 5;
-
- if (addr >= stop)
- {
- if (fi && get_next_frame (fi) == NULL && (fi->status & MY_FRAME_IN_SP))
- {
- fi->stack_size -= 16;
- deprecated_update_frame_base_hack (fi, read_sp () - fi->stack_size);
- }
- return addr;
- }
- }
-
- /* Now actually handle the out of line prologue. */
- if (out_of_line_prologue)
- {
- int outgoing_args_size = 0;
-
- /* First adjust the stack size for this function. The out of
- line prologue saves 4 registers (16bytes of data). */
- if (fi)
- fi->stack_size -= 16;
-
- /* Update fi->frame if necessary. */
- if (fi && get_next_frame (fi) == NULL)
- deprecated_update_frame_base_hack (fi, read_sp () - fi->stack_size);
-
- /* After the out of line prologue, there may be another
- stack adjustment for the outgoing arguments.
-
- Search for add imm8,a3 (0xd3XX)
- or add imm16,a3 (0xf70bXXXX)
- or add imm24,a3 (0xf467XXXXXX). */
-
- status = target_read_memory (addr, buf, 2);
- if (status != 0)
- {
- if (fi)
- {
- fi->fsr.regs[2] = get_frame_base (fi) + fi->stack_size + 4;
- fi->fsr.regs[3] = get_frame_base (fi) + fi->stack_size + 8;
- fi->fsr.regs[5] = get_frame_base (fi) + fi->stack_size + 12;
- fi->fsr.regs[6] = get_frame_base (fi) + fi->stack_size + 16;
- }
- return addr;
- }
-
- if (buf[0] == 0xd3)
- {
- outgoing_args_size = extract_signed_integer (&buf[1], 1);
- addr += 2;
- }
- else if (buf[0] == 0xf7 && buf[1] == 0x0b)
- {
- status = target_read_memory (addr + 2, buf, 2);
- if (status != 0)
- {
- if (fi)
- {
- fi->fsr.regs[2] = get_frame_base (fi) + fi->stack_size + 4;
- fi->fsr.regs[3] = get_frame_base (fi) + fi->stack_size + 8;
- fi->fsr.regs[5] = get_frame_base (fi) + fi->stack_size + 12;
- fi->fsr.regs[6] = get_frame_base (fi) + fi->stack_size + 16;
- }
- return addr;
- }
- outgoing_args_size = extract_signed_integer (buf, 2);
- addr += 4;
- }
- else if (buf[0] == 0xf4 && buf[1] == 0x67)
- {
- status = target_read_memory (addr + 2, buf, 3);
- if (status != 0)
- {
- if (fi && get_next_frame (fi) == NULL)
- {
- fi->fsr.regs[2] = get_frame_base (fi) + fi->stack_size + 4;
- fi->fsr.regs[3] = get_frame_base (fi) + fi->stack_size + 8;
- fi->fsr.regs[5] = get_frame_base (fi) + fi->stack_size + 12;
- fi->fsr.regs[6] = get_frame_base (fi) + fi->stack_size + 16;
- }
- return addr;
- }
- outgoing_args_size = extract_signed_integer (buf, 3);
- addr += 5;
- }
- else
- outgoing_args_size = 0;
-
- /* Now that we know the size of the outgoing arguments, fix
- fi->frame again if this is the innermost frame. */
- if (fi && get_next_frame (fi) == NULL)
- deprecated_update_frame_base_hack (fi, get_frame_base (fi) - outgoing_args_size);
-
- /* Note the register save information and update the stack
- size for this frame too. */
- if (fi)
- {
- fi->fsr.regs[2] = get_frame_base (fi) + fi->stack_size + 4;
- fi->fsr.regs[3] = get_frame_base (fi) + fi->stack_size + 8;
- fi->fsr.regs[5] = get_frame_base (fi) + fi->stack_size + 12;
- fi->fsr.regs[6] = get_frame_base (fi) + fi->stack_size + 16;
- fi->stack_size += outgoing_args_size;
- }
- /* There can be no more prologue insns, so return now. */
- return addr;
- }
-
- /* At this point fi->frame needs to be correct.
-
- If MY_FRAME_IN_SP is set and we're the innermost frame, then we
- need to fix fi->frame so that backtracing, find_frame_saved_regs,
- etc work correctly. */
- if (fi && get_next_frame (fi) == NULL && (fi->status & MY_FRAME_IN_SP) != 0)
- deprecated_update_frame_base_hack (fi, read_sp () - fi->stack_size);
-
- /* And last we have the register saves. These are relatively
- simple because they're physically done off the stack pointer,
- and thus the number of different instructions we need to
- check is greatly reduced because we know the displacements
- will be small.
-
- Search for movx d2,(X,a3) (0xf55eXX)
- then movx d3,(X,a3) (0xf55fXX)
- then mov a1,(X,a3) (0x5dXX) No frame pointer case
- then mov a2,(X,a3) (0x5eXX) No frame pointer case
- or mov a0,(X,a3) (0x5cXX) Frame pointer case. */
-
- status = target_read_memory (addr, buf, 2);
- if (status != 0)
- return addr;
- if (buf[0] == 0xf5 && buf[1] == 0x5e)
- {
- if (fi)
- {
- status = target_read_memory (addr + 2, buf, 1);
- if (status != 0)
- return addr;
- fi->fsr.regs[2] = (get_frame_base (fi) + stack_size
- + extract_signed_integer (buf, 1));
- }
- addr += 3;
- if (addr >= stop)
- return addr;
- status = target_read_memory (addr, buf, 2);
- if (status != 0)
- return addr;
- }
- if (buf[0] == 0xf5 && buf[1] == 0x5f)
- {
- if (fi)
- {
- status = target_read_memory (addr + 2, buf, 1);
- if (status != 0)
- return addr;
- fi->fsr.regs[3] = (get_frame_base (fi) + stack_size
- + extract_signed_integer (buf, 1));
- }
- addr += 3;
- if (addr >= stop)
- return addr;
- status = target_read_memory (addr, buf, 2);
- if (status != 0)
- return addr;
- }
- if (buf[0] == 0x5d)
- {
- if (fi)
- {
- status = target_read_memory (addr + 1, buf, 1);
- if (status != 0)
- return addr;
- fi->fsr.regs[5] = (get_frame_base (fi) + stack_size
- + extract_signed_integer (buf, 1));
- }
- addr += 2;
- if (addr >= stop)
- return addr;
- status = target_read_memory (addr, buf, 2);
- if (status != 0)
- return addr;
- }
- if (buf[0] == 0x5e || buf[0] == 0x5c)
- {
- if (fi)
- {
- status = target_read_memory (addr + 1, buf, 1);
- if (status != 0)
- return addr;
- fi->fsr.regs[6] = (get_frame_base (fi) + stack_size
- + extract_signed_integer (buf, 1));
- fi->status &= ~CALLER_A2_IN_A0;
- }
- addr += 2;
- if (addr >= stop)
- return addr;
- return addr;
- }
- return addr;
-}
-
-/* Function: frame_chain
- Figure out and return the caller's frame pointer given current
- frame_info struct.
-
- We don't handle dummy frames yet but we would probably just return the
- stack pointer that was in use at the time the function call was made? */
-
-CORE_ADDR
-mn10200_frame_chain (struct frame_info *fi)
-{
- struct frame_info *dummy_frame = deprecated_frame_xmalloc ();
- struct cleanup *old_chain = make_cleanup (xfree, dummy_frame);
- CORE_ADDR ret;
-
- /* Walk through the prologue to determine the stack size,
- location of saved registers, end of the prologue, etc. */
- if (fi->status == 0)
- mn10200_analyze_prologue (fi, (CORE_ADDR) 0);
-
- /* Quit now if mn10200_analyze_prologue set NO_MORE_FRAMES. */
- if (fi->status & NO_MORE_FRAMES)
- return 0;
-
- /* Now that we've analyzed our prologue, determine the frame
- pointer for our caller.
-
- If our caller has a frame pointer, then we need to
- find the entry value of $a2 to our function.
-
- If CALLER_A2_IN_A0, then the chain is in $a0.
-
- If fsr.regs[6] is nonzero, then it's at the memory
- location pointed to by fsr.regs[6].
-
- Else it's still in $a2.
-
- If our caller does not have a frame pointer, then his
- frame base is fi->frame + -caller's stack size + 4. */
-
- /* The easiest way to get that info is to analyze our caller's frame.
-
- So we set up a dummy frame and call mn10200_analyze_prologue to
- find stuff for us. */
- deprecated_update_frame_pc_hack (dummy_frame, FRAME_SAVED_PC (fi));
- deprecated_update_frame_base_hack (dummy_frame, get_frame_base (fi));
- memset (dummy_frame->fsr.regs, '\000', sizeof dummy_frame->fsr.regs);
- dummy_frame->status = 0;
- dummy_frame->stack_size = 0;
- mn10200_analyze_prologue (dummy_frame, 0);
-
- if (dummy_frame->status & MY_FRAME_IN_FP)
- {
- /* Our caller has a frame pointer. So find the frame in $a2, $a0,
- or in the stack. */
- if (fi->fsr.regs[6])
- ret = (read_memory_integer (fi->fsr.regs[FP_REGNUM], REGISTER_SIZE)
- & 0xffffff);
- else if (fi->status & CALLER_A2_IN_A0)
- ret = read_register (4);
- else
- ret = read_register (FP_REGNUM);
- }
- else
- {
- /* Our caller does not have a frame pointer. So his frame starts
- at the base of our frame (fi->frame) + <his size> + 4 (saved pc). */
- ret = get_frame_base (fi) + -dummy_frame->stack_size + 4;
- }
- do_cleanups (old_chain);
- return ret;
-}
-
-/* Function: skip_prologue
- Return the address of the first inst past the prologue of the function. */
-
-CORE_ADDR
-mn10200_skip_prologue (CORE_ADDR pc)
-{
- /* We used to check the debug symbols, but that can lose if
- we have a null prologue. */
- return mn10200_analyze_prologue (NULL, pc);
-}
-
-/* Function: pop_frame
- This routine gets called when either the user uses the `return'
- command, or the call dummy breakpoint gets hit. */
-
-void
-mn10200_pop_frame (struct frame_info *frame)
-{
- int regnum;
-
- if (DEPRECATED_PC_IN_CALL_DUMMY (get_frame_pc (frame),
- get_frame_base (frame),
- get_frame_base (frame)))
- generic_pop_dummy_frame ();
- else
- {
- write_register (PC_REGNUM, FRAME_SAVED_PC (frame));
-
- /* Restore any saved registers. */
- for (regnum = 0; regnum < NUM_REGS; regnum++)
- if (frame->fsr.regs[regnum] != 0)
- {
- ULONGEST value;
-
- value = read_memory_unsigned_integer (frame->fsr.regs[regnum],
- REGISTER_RAW_SIZE (regnum));
- write_register (regnum, value);
- }
-
- /* Actually cut back the stack. */
- write_register (SP_REGNUM, get_frame_base (frame));
-
- /* Don't we need to set the PC?!? XXX FIXME. */
- }
-
- /* Throw away any cached frame information. */
- flush_cached_frames ();
-}
-
-/* Function: push_arguments
- Setup arguments for a call to the target. Arguments go in
- order on the stack. */
-
-CORE_ADDR
-mn10200_push_arguments (int nargs, struct value **args, CORE_ADDR sp,
- unsigned char struct_return, CORE_ADDR struct_addr)
-{
- int argnum = 0;
- int len = 0;
- int stack_offset = 0;
- int regsused = struct_return ? 1 : 0;
-
- /* This should be a nop, but align the stack just in case something
- went wrong. Stacks are two byte aligned on the mn10200. */
- sp &= ~1;
-
- /* Now make space on the stack for the args.
-
- XXX This doesn't appear to handle pass-by-invisible reference
- arguments. */
- for (argnum = 0; argnum < nargs; argnum++)
- {
- int arg_length = (TYPE_LENGTH (VALUE_TYPE (args[argnum])) + 1) & ~1;
-
- /* If we've used all argument registers, then this argument is
- pushed. */
- if (regsused >= 2 || arg_length > 4)
- {
- regsused = 2;
- len += arg_length;
- }
- /* We know we've got some arg register space left. If this argument
- will fit entirely in regs, then put it there. */
- else if (arg_length <= 2
- || TYPE_CODE (VALUE_TYPE (args[argnum])) == TYPE_CODE_PTR)
- {
- regsused++;
- }
- else if (regsused == 0)
- {
- regsused = 2;
- }
- else
- {
- regsused = 2;
- len += arg_length;
- }
- }
-
- /* Allocate stack space. */
- sp -= len;
-
- regsused = struct_return ? 1 : 0;
- /* Push all arguments onto the stack. */
- for (argnum = 0; argnum < nargs; argnum++)
- {
- int len;
- char *val;
-
- /* XXX Check this. What about UNIONS? */
- if (TYPE_CODE (VALUE_TYPE (*args)) == TYPE_CODE_STRUCT
- && TYPE_LENGTH (VALUE_TYPE (*args)) > 8)
- {
- /* XXX Wrong, we want a pointer to this argument. */
- len = TYPE_LENGTH (VALUE_TYPE (*args));
- val = (char *) VALUE_CONTENTS (*args);
- }
- else
- {
- len = TYPE_LENGTH (VALUE_TYPE (*args));
- val = (char *) VALUE_CONTENTS (*args);
- }
-
- if (regsused < 2
- && (len <= 2
- || TYPE_CODE (VALUE_TYPE (*args)) == TYPE_CODE_PTR))
- {
- write_register (regsused, extract_unsigned_integer (val, 4));
- regsused++;
- }
- else if (regsused == 0 && len == 4)
- {
- write_register (regsused, extract_unsigned_integer (val, 2));
- write_register (regsused + 1, extract_unsigned_integer (val + 2, 2));
- regsused = 2;
- }
- else
- {
- regsused = 2;
- while (len > 0)
- {
- write_memory (sp + stack_offset, val, 2);
-
- len -= 2;
- val += 2;
- stack_offset += 2;
- }
- }
- args++;
- }
-
- return sp;
-}
-
-/* Function: push_return_address (pc)
- Set up the return address for the inferior function call.
- Needed for targets where we don't actually execute a JSR/BSR instruction */
-
-CORE_ADDR
-mn10200_push_return_address (CORE_ADDR pc, CORE_ADDR sp)
-{
- unsigned char buf[4];
-
- store_unsigned_integer (buf, 4, CALL_DUMMY_ADDRESS ());
- write_memory (sp - 4, buf, 4);
- return sp - 4;
-}
-
-/* Function: store_struct_return (addr,sp)
- Store the structure value return address for an inferior function
- call. */
-
-CORE_ADDR
-mn10200_store_struct_return (CORE_ADDR addr, CORE_ADDR sp)
-{
- /* The structure return address is passed as the first argument. */
- write_register (0, addr);
- return sp;
-}
-
-/* Function: frame_saved_pc
- Find the caller of this frame. We do this by seeing if RP_REGNUM
- is saved in the stack anywhere, otherwise we get it from the
- registers. If the inner frame is a dummy frame, return its PC
- instead of RP, because that's where "caller" of the dummy-frame
- will be found. */
-
-CORE_ADDR
-mn10200_frame_saved_pc (struct frame_info *fi)
-{
- /* The saved PC will always be at the base of the current frame. */
- return (read_memory_integer (get_frame_base (fi), REGISTER_SIZE) & 0xffffff);
-}
-
-/* Function: init_extra_frame_info
- Setup the frame's frame pointer, pc, and frame addresses for saved
- registers. Most of the work is done in mn10200_analyze_prologue().
-
- Note that when we are called for the last frame (currently active frame),
- that get_frame_pc (fi) and fi->frame will already be setup. However, fi->frame will
- be valid only if this routine uses FP. For previous frames, fi-frame will
- always be correct. mn10200_analyze_prologue will fix fi->frame if
- it's not valid.
-
- We can be called with the PC in the call dummy under two circumstances.
- First, during normal backtracing, second, while figuring out the frame
- pointer just prior to calling the target function (see run_stack_dummy). */
-
-void
-mn10200_init_extra_frame_info (struct frame_info *fi)
-{
- if (get_next_frame (fi))
- deprecated_update_frame_pc_hack (fi, FRAME_SAVED_PC (get_next_frame (fi)));
-
- memset (fi->fsr.regs, '\000', sizeof fi->fsr.regs);
- fi->status = 0;
- fi->stack_size = 0;
-
- mn10200_analyze_prologue (fi, 0);
-}
-
-void
-_initialize_mn10200_tdep (void)
-{
- tm_print_insn = print_insn_mn10200;
-}
+// OBSOLETE /* Target-dependent code for the Matsushita MN10200 for GDB, the GNU debugger.
+// OBSOLETE
+// OBSOLETE Copyright 1997, 1998, 1999, 2000, 2001, 2003 Free Software
+// OBSOLETE Foundation, Inc.
+// OBSOLETE
+// OBSOLETE This file is part of GDB.
+// OBSOLETE
+// OBSOLETE This program is free software; you can redistribute it and/or modify
+// OBSOLETE it under the terms of the GNU General Public License as published by
+// OBSOLETE the Free Software Foundation; either version 2 of the License, or
+// OBSOLETE (at your option) any later version.
+// OBSOLETE
+// OBSOLETE This program is distributed in the hope that it will be useful,
+// OBSOLETE but WITHOUT ANY WARRANTY; without even the implied warranty of
+// OBSOLETE MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// OBSOLETE GNU General Public License for more details.
+// OBSOLETE
+// OBSOLETE You should have received a copy of the GNU General Public License
+// OBSOLETE along with this program; if not, write to the Free Software
+// OBSOLETE Foundation, Inc., 59 Temple Place - Suite 330,
+// OBSOLETE Boston, MA 02111-1307, USA. */
+// OBSOLETE
+// OBSOLETE #include "defs.h"
+// OBSOLETE #include "frame.h"
+// OBSOLETE #include "inferior.h"
+// OBSOLETE #include "target.h"
+// OBSOLETE #include "value.h"
+// OBSOLETE #include "bfd.h"
+// OBSOLETE #include "gdb_string.h"
+// OBSOLETE #include "gdbcore.h"
+// OBSOLETE #include "symfile.h"
+// OBSOLETE #include "regcache.h"
+// OBSOLETE
+// OBSOLETE
+// OBSOLETE /* Should call_function allocate stack space for a struct return? */
+// OBSOLETE int
+// OBSOLETE mn10200_use_struct_convention (int gcc_p, struct type *type)
+// OBSOLETE {
+// OBSOLETE return (TYPE_NFIELDS (type) > 1 || TYPE_LENGTH (type) > 8);
+// OBSOLETE }
+// OBSOLETE /* *INDENT-OFF* */
+// OBSOLETE /* The main purpose of this file is dealing with prologues to extract
+// OBSOLETE information about stack frames and saved registers.
+// OBSOLETE
+// OBSOLETE For reference here's how prologues look on the mn10200:
+// OBSOLETE
+// OBSOLETE With frame pointer:
+// OBSOLETE mov fp,a0
+// OBSOLETE mov sp,fp
+// OBSOLETE add <size>,sp
+// OBSOLETE Register saves for d2, d3, a1, a2 as needed. Saves start
+// OBSOLETE at fp - <size> + <outgoing_args_size> and work towards higher
+// OBSOLETE addresses. Note that the saves are actually done off the stack
+// OBSOLETE pointer in the prologue! This makes for smaller code and easier
+// OBSOLETE prologue scanning as the displacement fields will unlikely
+// OBSOLETE be more than 8 bits!
+// OBSOLETE
+// OBSOLETE Without frame pointer:
+// OBSOLETE add <size>,sp
+// OBSOLETE Register saves for d2, d3, a1, a2 as needed. Saves start
+// OBSOLETE at sp + <outgoing_args_size> and work towards higher addresses.
+// OBSOLETE
+// OBSOLETE Out of line prologue:
+// OBSOLETE add <local size>,sp -- optional
+// OBSOLETE jsr __prologue
+// OBSOLETE add <outgoing_size>,sp -- optional
+// OBSOLETE
+// OBSOLETE The stack pointer remains constant throughout the life of most
+// OBSOLETE functions. As a result the compiler will usually omit the
+// OBSOLETE frame pointer, so we must handle frame pointerless functions. */
+// OBSOLETE
+// OBSOLETE /* Analyze the prologue to determine where registers are saved,
+// OBSOLETE the end of the prologue, etc etc. Return the end of the prologue
+// OBSOLETE scanned.
+// OBSOLETE
+// OBSOLETE We store into FI (if non-null) several tidbits of information:
+// OBSOLETE
+// OBSOLETE * stack_size -- size of this stack frame. Note that if we stop in
+// OBSOLETE certain parts of the prologue/epilogue we may claim the size of the
+// OBSOLETE current frame is zero. This happens when the current frame has
+// OBSOLETE not been allocated yet or has already been deallocated.
+// OBSOLETE
+// OBSOLETE * fsr -- Addresses of registers saved in the stack by this frame.
+// OBSOLETE
+// OBSOLETE * status -- A (relatively) generic status indicator. It's a bitmask
+// OBSOLETE with the following bits:
+// OBSOLETE
+// OBSOLETE MY_FRAME_IN_SP: The base of the current frame is actually in
+// OBSOLETE the stack pointer. This can happen for frame pointerless
+// OBSOLETE functions, or cases where we're stopped in the prologue/epilogue
+// OBSOLETE itself. For these cases mn10200_analyze_prologue will need up
+// OBSOLETE update fi->frame before returning or analyzing the register
+// OBSOLETE save instructions.
+// OBSOLETE
+// OBSOLETE MY_FRAME_IN_FP: The base of the current frame is in the
+// OBSOLETE frame pointer register ($a2).
+// OBSOLETE
+// OBSOLETE CALLER_A2_IN_A0: $a2 from the caller's frame is temporarily
+// OBSOLETE in $a0. This can happen if we're stopped in the prologue.
+// OBSOLETE
+// OBSOLETE NO_MORE_FRAMES: Set this if the current frame is "start" or
+// OBSOLETE if the first instruction looks like mov <imm>,sp. This tells
+// OBSOLETE frame chain to not bother trying to unwind past this frame. */
+// OBSOLETE /* *INDENT-ON* */
+// OBSOLETE
+// OBSOLETE
+// OBSOLETE
+// OBSOLETE
+// OBSOLETE #define MY_FRAME_IN_SP 0x1
+// OBSOLETE #define MY_FRAME_IN_FP 0x2
+// OBSOLETE #define CALLER_A2_IN_A0 0x4
+// OBSOLETE #define NO_MORE_FRAMES 0x8
+// OBSOLETE
+// OBSOLETE static CORE_ADDR
+// OBSOLETE mn10200_analyze_prologue (struct frame_info *fi, CORE_ADDR pc)
+// OBSOLETE {
+// OBSOLETE CORE_ADDR func_addr, func_end, addr, stop;
+// OBSOLETE CORE_ADDR stack_size = 0;
+// OBSOLETE unsigned char buf[4];
+// OBSOLETE int status;
+// OBSOLETE char *name;
+// OBSOLETE int out_of_line_prologue = 0;
+// OBSOLETE
+// OBSOLETE /* Use the PC in the frame if it's provided to look up the
+// OBSOLETE start of this function. */
+// OBSOLETE pc = (fi ? get_frame_pc (fi) : pc);
+// OBSOLETE
+// OBSOLETE /* Find the start of this function. */
+// OBSOLETE status = find_pc_partial_function (pc, &name, &func_addr, &func_end);
+// OBSOLETE
+// OBSOLETE /* Do nothing if we couldn't find the start of this function or if we're
+// OBSOLETE stopped at the first instruction in the prologue. */
+// OBSOLETE if (status == 0)
+// OBSOLETE return pc;
+// OBSOLETE
+// OBSOLETE /* If we're in start, then give up. */
+// OBSOLETE if (strcmp (name, "start") == 0)
+// OBSOLETE {
+// OBSOLETE if (fi)
+// OBSOLETE fi->status = NO_MORE_FRAMES;
+// OBSOLETE return pc;
+// OBSOLETE }
+// OBSOLETE
+// OBSOLETE /* At the start of a function our frame is in the stack pointer. */
+// OBSOLETE if (fi)
+// OBSOLETE fi->status = MY_FRAME_IN_SP;
+// OBSOLETE
+// OBSOLETE /* If we're physically on an RTS instruction, then our frame has already
+// OBSOLETE been deallocated.
+// OBSOLETE
+// OBSOLETE fi->frame is bogus, we need to fix it. */
+// OBSOLETE if (fi && get_frame_pc (fi) + 1 == func_end)
+// OBSOLETE {
+// OBSOLETE status = target_read_memory (get_frame_pc (fi), buf, 1);
+// OBSOLETE if (status != 0)
+// OBSOLETE {
+// OBSOLETE if (get_next_frame (fi) == NULL)
+// OBSOLETE deprecated_update_frame_base_hack (fi, read_sp ());
+// OBSOLETE return get_frame_pc (fi);
+// OBSOLETE }
+// OBSOLETE
+// OBSOLETE if (buf[0] == 0xfe)
+// OBSOLETE {
+// OBSOLETE if (get_next_frame (fi) == NULL)
+// OBSOLETE deprecated_update_frame_base_hack (fi, read_sp ());
+// OBSOLETE return get_frame_pc (fi);
+// OBSOLETE }
+// OBSOLETE }
+// OBSOLETE
+// OBSOLETE /* Similarly if we're stopped on the first insn of a prologue as our
+// OBSOLETE frame hasn't been allocated yet. */
+// OBSOLETE if (fi && get_frame_pc (fi) == func_addr)
+// OBSOLETE {
+// OBSOLETE if (get_next_frame (fi) == NULL)
+// OBSOLETE deprecated_update_frame_base_hack (fi, read_sp ());
+// OBSOLETE return get_frame_pc (fi);
+// OBSOLETE }
+// OBSOLETE
+// OBSOLETE /* Figure out where to stop scanning. */
+// OBSOLETE stop = fi ? get_frame_pc (fi) : func_end;
+// OBSOLETE
+// OBSOLETE /* Don't walk off the end of the function. */
+// OBSOLETE stop = stop > func_end ? func_end : stop;
+// OBSOLETE
+// OBSOLETE /* Start scanning on the first instruction of this function. */
+// OBSOLETE addr = func_addr;
+// OBSOLETE
+// OBSOLETE status = target_read_memory (addr, buf, 2);
+// OBSOLETE if (status != 0)
+// OBSOLETE {
+// OBSOLETE if (fi && get_next_frame (fi) == NULL && fi->status & MY_FRAME_IN_SP)
+// OBSOLETE deprecated_update_frame_base_hack (fi, read_sp ());
+// OBSOLETE return addr;
+// OBSOLETE }
+// OBSOLETE
+// OBSOLETE /* First see if this insn sets the stack pointer; if so, it's something
+// OBSOLETE we won't understand, so quit now. */
+// OBSOLETE if (buf[0] == 0xdf
+// OBSOLETE || (buf[0] == 0xf4 && buf[1] == 0x77))
+// OBSOLETE {
+// OBSOLETE if (fi)
+// OBSOLETE fi->status = NO_MORE_FRAMES;
+// OBSOLETE return addr;
+// OBSOLETE }
+// OBSOLETE
+// OBSOLETE /* Now see if we have a frame pointer.
+// OBSOLETE
+// OBSOLETE Search for mov a2,a0 (0xf278)
+// OBSOLETE then mov a3,a2 (0xf27e). */
+// OBSOLETE
+// OBSOLETE if (buf[0] == 0xf2 && buf[1] == 0x78)
+// OBSOLETE {
+// OBSOLETE /* Our caller's $a2 will be found in $a0 now. Note it for
+// OBSOLETE our callers. */
+// OBSOLETE if (fi)
+// OBSOLETE fi->status |= CALLER_A2_IN_A0;
+// OBSOLETE addr += 2;
+// OBSOLETE if (addr >= stop)
+// OBSOLETE {
+// OBSOLETE /* We still haven't allocated our local stack. Handle this
+// OBSOLETE as if we stopped on the first or last insn of a function. */
+// OBSOLETE if (fi && get_next_frame (fi) == NULL)
+// OBSOLETE deprecated_update_frame_base_hack (fi, read_sp ());
+// OBSOLETE return addr;
+// OBSOLETE }
+// OBSOLETE
+// OBSOLETE status = target_read_memory (addr, buf, 2);
+// OBSOLETE if (status != 0)
+// OBSOLETE {
+// OBSOLETE if (fi && get_next_frame (fi) == NULL)
+// OBSOLETE deprecated_update_frame_base_hack (fi, read_sp ());
+// OBSOLETE return addr;
+// OBSOLETE }
+// OBSOLETE if (buf[0] == 0xf2 && buf[1] == 0x7e)
+// OBSOLETE {
+// OBSOLETE addr += 2;
+// OBSOLETE
+// OBSOLETE /* Our frame pointer is valid now. */
+// OBSOLETE if (fi)
+// OBSOLETE {
+// OBSOLETE fi->status |= MY_FRAME_IN_FP;
+// OBSOLETE fi->status &= ~MY_FRAME_IN_SP;
+// OBSOLETE }
+// OBSOLETE if (addr >= stop)
+// OBSOLETE return addr;
+// OBSOLETE }
+// OBSOLETE else
+// OBSOLETE {
+// OBSOLETE if (fi && get_next_frame (fi) == NULL)
+// OBSOLETE deprecated_update_frame_base_hack (fi, read_sp ());
+// OBSOLETE return addr;
+// OBSOLETE }
+// OBSOLETE }
+// OBSOLETE
+// OBSOLETE /* Next we should allocate the local frame.
+// OBSOLETE
+// OBSOLETE Search for add imm8,a3 (0xd3XX)
+// OBSOLETE or add imm16,a3 (0xf70bXXXX)
+// OBSOLETE or add imm24,a3 (0xf467XXXXXX).
+// OBSOLETE
+// OBSOLETE If none of the above was found, then this prologue has
+// OBSOLETE no stack, and therefore can't have any register saves,
+// OBSOLETE so quit now. */
+// OBSOLETE status = target_read_memory (addr, buf, 2);
+// OBSOLETE if (status != 0)
+// OBSOLETE {
+// OBSOLETE if (fi && get_next_frame (fi) == NULL && (fi->status & MY_FRAME_IN_SP))
+// OBSOLETE deprecated_update_frame_base_hack (fi, read_sp ());
+// OBSOLETE return addr;
+// OBSOLETE }
+// OBSOLETE if (buf[0] == 0xd3)
+// OBSOLETE {
+// OBSOLETE stack_size = extract_signed_integer (&buf[1], 1);
+// OBSOLETE if (fi)
+// OBSOLETE fi->stack_size = stack_size;
+// OBSOLETE addr += 2;
+// OBSOLETE if (addr >= stop)
+// OBSOLETE {
+// OBSOLETE if (fi && get_next_frame (fi) == NULL && (fi->status & MY_FRAME_IN_SP))
+// OBSOLETE deprecated_update_frame_base_hack (fi, read_sp () - stack_size);
+// OBSOLETE return addr;
+// OBSOLETE }
+// OBSOLETE }
+// OBSOLETE else if (buf[0] == 0xf7 && buf[1] == 0x0b)
+// OBSOLETE {
+// OBSOLETE status = target_read_memory (addr + 2, buf, 2);
+// OBSOLETE if (status != 0)
+// OBSOLETE {
+// OBSOLETE if (fi && get_next_frame (fi) == NULL && (fi->status & MY_FRAME_IN_SP))
+// OBSOLETE deprecated_update_frame_base_hack (fi, read_sp ());
+// OBSOLETE return addr;
+// OBSOLETE }
+// OBSOLETE stack_size = extract_signed_integer (buf, 2);
+// OBSOLETE if (fi)
+// OBSOLETE fi->stack_size = stack_size;
+// OBSOLETE addr += 4;
+// OBSOLETE if (addr >= stop)
+// OBSOLETE {
+// OBSOLETE if (fi && get_next_frame (fi) == NULL && (fi->status & MY_FRAME_IN_SP))
+// OBSOLETE deprecated_update_frame_base_hack (fi, read_sp () - stack_size);
+// OBSOLETE return addr;
+// OBSOLETE }
+// OBSOLETE }
+// OBSOLETE else if (buf[0] == 0xf4 && buf[1] == 0x67)
+// OBSOLETE {
+// OBSOLETE status = target_read_memory (addr + 2, buf, 3);
+// OBSOLETE if (status != 0)
+// OBSOLETE {
+// OBSOLETE if (fi && get_next_frame (fi) == NULL && (fi->status & MY_FRAME_IN_SP))
+// OBSOLETE deprecated_update_frame_base_hack (fi, read_sp ());
+// OBSOLETE return addr;
+// OBSOLETE }
+// OBSOLETE stack_size = extract_signed_integer (buf, 3);
+// OBSOLETE if (fi)
+// OBSOLETE fi->stack_size = stack_size;
+// OBSOLETE addr += 5;
+// OBSOLETE if (addr >= stop)
+// OBSOLETE {
+// OBSOLETE if (fi && get_next_frame (fi) == NULL && (fi->status & MY_FRAME_IN_SP))
+// OBSOLETE deprecated_update_frame_base_hack (fi, read_sp () - stack_size);
+// OBSOLETE return addr;
+// OBSOLETE }
+// OBSOLETE }
+// OBSOLETE
+// OBSOLETE /* Now see if we have a call to __prologue for an out of line
+// OBSOLETE prologue. */
+// OBSOLETE status = target_read_memory (addr, buf, 2);
+// OBSOLETE if (status != 0)
+// OBSOLETE return addr;
+// OBSOLETE
+// OBSOLETE /* First check for 16bit pc-relative call to __prologue. */
+// OBSOLETE if (buf[0] == 0xfd)
+// OBSOLETE {
+// OBSOLETE CORE_ADDR temp;
+// OBSOLETE status = target_read_memory (addr + 1, buf, 2);
+// OBSOLETE if (status != 0)
+// OBSOLETE {
+// OBSOLETE if (fi && get_next_frame (fi) == NULL && (fi->status & MY_FRAME_IN_SP))
+// OBSOLETE deprecated_update_frame_base_hack (fi, read_sp ());
+// OBSOLETE return addr;
+// OBSOLETE }
+// OBSOLETE
+// OBSOLETE /* Get the PC this instruction will branch to. */
+// OBSOLETE temp = (extract_signed_integer (buf, 2) + addr + 3) & 0xffffff;
+// OBSOLETE
+// OBSOLETE /* Get the name of the function at the target address. */
+// OBSOLETE status = find_pc_partial_function (temp, &name, NULL, NULL);
+// OBSOLETE if (status == 0)
+// OBSOLETE {
+// OBSOLETE if (fi && get_next_frame (fi) == NULL && (fi->status & MY_FRAME_IN_SP))
+// OBSOLETE deprecated_update_frame_base_hack (fi, read_sp ());
+// OBSOLETE return addr;
+// OBSOLETE }
+// OBSOLETE
+// OBSOLETE /* Note if it is an out of line prologue. */
+// OBSOLETE out_of_line_prologue = (strcmp (name, "__prologue") == 0);
+// OBSOLETE
+// OBSOLETE /* This sucks up 3 bytes of instruction space. */
+// OBSOLETE if (out_of_line_prologue)
+// OBSOLETE addr += 3;
+// OBSOLETE
+// OBSOLETE if (addr >= stop)
+// OBSOLETE {
+// OBSOLETE if (fi && get_next_frame (fi) == NULL)
+// OBSOLETE {
+// OBSOLETE fi->stack_size -= 16;
+// OBSOLETE deprecated_update_frame_base_hack (fi, read_sp () - fi->stack_size);
+// OBSOLETE }
+// OBSOLETE return addr;
+// OBSOLETE }
+// OBSOLETE }
+// OBSOLETE /* Now check for the 24bit pc-relative call to __prologue. */
+// OBSOLETE else if (buf[0] == 0xf4 && buf[1] == 0xe1)
+// OBSOLETE {
+// OBSOLETE CORE_ADDR temp;
+// OBSOLETE status = target_read_memory (addr + 2, buf, 3);
+// OBSOLETE if (status != 0)
+// OBSOLETE {
+// OBSOLETE if (fi && get_next_frame (fi) == NULL && (fi->status & MY_FRAME_IN_SP))
+// OBSOLETE deprecated_update_frame_base_hack (fi, read_sp ());
+// OBSOLETE return addr;
+// OBSOLETE }
+// OBSOLETE
+// OBSOLETE /* Get the PC this instruction will branch to. */
+// OBSOLETE temp = (extract_signed_integer (buf, 3) + addr + 5) & 0xffffff;
+// OBSOLETE
+// OBSOLETE /* Get the name of the function at the target address. */
+// OBSOLETE status = find_pc_partial_function (temp, &name, NULL, NULL);
+// OBSOLETE if (status == 0)
+// OBSOLETE {
+// OBSOLETE if (fi && get_next_frame (fi) == NULL && (fi->status & MY_FRAME_IN_SP))
+// OBSOLETE deprecated_update_frame_base_hack (fi, read_sp ());
+// OBSOLETE return addr;
+// OBSOLETE }
+// OBSOLETE
+// OBSOLETE /* Note if it is an out of line prologue. */
+// OBSOLETE out_of_line_prologue = (strcmp (name, "__prologue") == 0);
+// OBSOLETE
+// OBSOLETE /* This sucks up 5 bytes of instruction space. */
+// OBSOLETE if (out_of_line_prologue)
+// OBSOLETE addr += 5;
+// OBSOLETE
+// OBSOLETE if (addr >= stop)
+// OBSOLETE {
+// OBSOLETE if (fi && get_next_frame (fi) == NULL && (fi->status & MY_FRAME_IN_SP))
+// OBSOLETE {
+// OBSOLETE fi->stack_size -= 16;
+// OBSOLETE deprecated_update_frame_base_hack (fi, read_sp () - fi->stack_size);
+// OBSOLETE }
+// OBSOLETE return addr;
+// OBSOLETE }
+// OBSOLETE }
+// OBSOLETE
+// OBSOLETE /* Now actually handle the out of line prologue. */
+// OBSOLETE if (out_of_line_prologue)
+// OBSOLETE {
+// OBSOLETE int outgoing_args_size = 0;
+// OBSOLETE
+// OBSOLETE /* First adjust the stack size for this function. The out of
+// OBSOLETE line prologue saves 4 registers (16bytes of data). */
+// OBSOLETE if (fi)
+// OBSOLETE fi->stack_size -= 16;
+// OBSOLETE
+// OBSOLETE /* Update fi->frame if necessary. */
+// OBSOLETE if (fi && get_next_frame (fi) == NULL)
+// OBSOLETE deprecated_update_frame_base_hack (fi, read_sp () - fi->stack_size);
+// OBSOLETE
+// OBSOLETE /* After the out of line prologue, there may be another
+// OBSOLETE stack adjustment for the outgoing arguments.
+// OBSOLETE
+// OBSOLETE Search for add imm8,a3 (0xd3XX)
+// OBSOLETE or add imm16,a3 (0xf70bXXXX)
+// OBSOLETE or add imm24,a3 (0xf467XXXXXX). */
+// OBSOLETE
+// OBSOLETE status = target_read_memory (addr, buf, 2);
+// OBSOLETE if (status != 0)
+// OBSOLETE {
+// OBSOLETE if (fi)
+// OBSOLETE {
+// OBSOLETE fi->fsr.regs[2] = get_frame_base (fi) + fi->stack_size + 4;
+// OBSOLETE fi->fsr.regs[3] = get_frame_base (fi) + fi->stack_size + 8;
+// OBSOLETE fi->fsr.regs[5] = get_frame_base (fi) + fi->stack_size + 12;
+// OBSOLETE fi->fsr.regs[6] = get_frame_base (fi) + fi->stack_size + 16;
+// OBSOLETE }
+// OBSOLETE return addr;
+// OBSOLETE }
+// OBSOLETE
+// OBSOLETE if (buf[0] == 0xd3)
+// OBSOLETE {
+// OBSOLETE outgoing_args_size = extract_signed_integer (&buf[1], 1);
+// OBSOLETE addr += 2;
+// OBSOLETE }
+// OBSOLETE else if (buf[0] == 0xf7 && buf[1] == 0x0b)
+// OBSOLETE {
+// OBSOLETE status = target_read_memory (addr + 2, buf, 2);
+// OBSOLETE if (status != 0)
+// OBSOLETE {
+// OBSOLETE if (fi)
+// OBSOLETE {
+// OBSOLETE fi->fsr.regs[2] = get_frame_base (fi) + fi->stack_size + 4;
+// OBSOLETE fi->fsr.regs[3] = get_frame_base (fi) + fi->stack_size + 8;
+// OBSOLETE fi->fsr.regs[5] = get_frame_base (fi) + fi->stack_size + 12;
+// OBSOLETE fi->fsr.regs[6] = get_frame_base (fi) + fi->stack_size + 16;
+// OBSOLETE }
+// OBSOLETE return addr;
+// OBSOLETE }
+// OBSOLETE outgoing_args_size = extract_signed_integer (buf, 2);
+// OBSOLETE addr += 4;
+// OBSOLETE }
+// OBSOLETE else if (buf[0] == 0xf4 && buf[1] == 0x67)
+// OBSOLETE {
+// OBSOLETE status = target_read_memory (addr + 2, buf, 3);
+// OBSOLETE if (status != 0)
+// OBSOLETE {
+// OBSOLETE if (fi && get_next_frame (fi) == NULL)
+// OBSOLETE {
+// OBSOLETE fi->fsr.regs[2] = get_frame_base (fi) + fi->stack_size + 4;
+// OBSOLETE fi->fsr.regs[3] = get_frame_base (fi) + fi->stack_size + 8;
+// OBSOLETE fi->fsr.regs[5] = get_frame_base (fi) + fi->stack_size + 12;
+// OBSOLETE fi->fsr.regs[6] = get_frame_base (fi) + fi->stack_size + 16;
+// OBSOLETE }
+// OBSOLETE return addr;
+// OBSOLETE }
+// OBSOLETE outgoing_args_size = extract_signed_integer (buf, 3);
+// OBSOLETE addr += 5;
+// OBSOLETE }
+// OBSOLETE else
+// OBSOLETE outgoing_args_size = 0;
+// OBSOLETE
+// OBSOLETE /* Now that we know the size of the outgoing arguments, fix
+// OBSOLETE fi->frame again if this is the innermost frame. */
+// OBSOLETE if (fi && get_next_frame (fi) == NULL)
+// OBSOLETE deprecated_update_frame_base_hack (fi, get_frame_base (fi) - outgoing_args_size);
+// OBSOLETE
+// OBSOLETE /* Note the register save information and update the stack
+// OBSOLETE size for this frame too. */
+// OBSOLETE if (fi)
+// OBSOLETE {
+// OBSOLETE fi->fsr.regs[2] = get_frame_base (fi) + fi->stack_size + 4;
+// OBSOLETE fi->fsr.regs[3] = get_frame_base (fi) + fi->stack_size + 8;
+// OBSOLETE fi->fsr.regs[5] = get_frame_base (fi) + fi->stack_size + 12;
+// OBSOLETE fi->fsr.regs[6] = get_frame_base (fi) + fi->stack_size + 16;
+// OBSOLETE fi->stack_size += outgoing_args_size;
+// OBSOLETE }
+// OBSOLETE /* There can be no more prologue insns, so return now. */
+// OBSOLETE return addr;
+// OBSOLETE }
+// OBSOLETE
+// OBSOLETE /* At this point fi->frame needs to be correct.
+// OBSOLETE
+// OBSOLETE If MY_FRAME_IN_SP is set and we're the innermost frame, then we
+// OBSOLETE need to fix fi->frame so that backtracing, find_frame_saved_regs,
+// OBSOLETE etc work correctly. */
+// OBSOLETE if (fi && get_next_frame (fi) == NULL && (fi->status & MY_FRAME_IN_SP) != 0)
+// OBSOLETE deprecated_update_frame_base_hack (fi, read_sp () - fi->stack_size);
+// OBSOLETE
+// OBSOLETE /* And last we have the register saves. These are relatively
+// OBSOLETE simple because they're physically done off the stack pointer,
+// OBSOLETE and thus the number of different instructions we need to
+// OBSOLETE check is greatly reduced because we know the displacements
+// OBSOLETE will be small.
+// OBSOLETE
+// OBSOLETE Search for movx d2,(X,a3) (0xf55eXX)
+// OBSOLETE then movx d3,(X,a3) (0xf55fXX)
+// OBSOLETE then mov a1,(X,a3) (0x5dXX) No frame pointer case
+// OBSOLETE then mov a2,(X,a3) (0x5eXX) No frame pointer case
+// OBSOLETE or mov a0,(X,a3) (0x5cXX) Frame pointer case. */
+// OBSOLETE
+// OBSOLETE status = target_read_memory (addr, buf, 2);
+// OBSOLETE if (status != 0)
+// OBSOLETE return addr;
+// OBSOLETE if (buf[0] == 0xf5 && buf[1] == 0x5e)
+// OBSOLETE {
+// OBSOLETE if (fi)
+// OBSOLETE {
+// OBSOLETE status = target_read_memory (addr + 2, buf, 1);
+// OBSOLETE if (status != 0)
+// OBSOLETE return addr;
+// OBSOLETE fi->fsr.regs[2] = (get_frame_base (fi) + stack_size
+// OBSOLETE + extract_signed_integer (buf, 1));
+// OBSOLETE }
+// OBSOLETE addr += 3;
+// OBSOLETE if (addr >= stop)
+// OBSOLETE return addr;
+// OBSOLETE status = target_read_memory (addr, buf, 2);
+// OBSOLETE if (status != 0)
+// OBSOLETE return addr;
+// OBSOLETE }
+// OBSOLETE if (buf[0] == 0xf5 && buf[1] == 0x5f)
+// OBSOLETE {
+// OBSOLETE if (fi)
+// OBSOLETE {
+// OBSOLETE status = target_read_memory (addr + 2, buf, 1);
+// OBSOLETE if (status != 0)
+// OBSOLETE return addr;
+// OBSOLETE fi->fsr.regs[3] = (get_frame_base (fi) + stack_size
+// OBSOLETE + extract_signed_integer (buf, 1));
+// OBSOLETE }
+// OBSOLETE addr += 3;
+// OBSOLETE if (addr >= stop)
+// OBSOLETE return addr;
+// OBSOLETE status = target_read_memory (addr, buf, 2);
+// OBSOLETE if (status != 0)
+// OBSOLETE return addr;
+// OBSOLETE }
+// OBSOLETE if (buf[0] == 0x5d)
+// OBSOLETE {
+// OBSOLETE if (fi)
+// OBSOLETE {
+// OBSOLETE status = target_read_memory (addr + 1, buf, 1);
+// OBSOLETE if (status != 0)
+// OBSOLETE return addr;
+// OBSOLETE fi->fsr.regs[5] = (get_frame_base (fi) + stack_size
+// OBSOLETE + extract_signed_integer (buf, 1));
+// OBSOLETE }
+// OBSOLETE addr += 2;
+// OBSOLETE if (addr >= stop)
+// OBSOLETE return addr;
+// OBSOLETE status = target_read_memory (addr, buf, 2);
+// OBSOLETE if (status != 0)
+// OBSOLETE return addr;
+// OBSOLETE }
+// OBSOLETE if (buf[0] == 0x5e || buf[0] == 0x5c)
+// OBSOLETE {
+// OBSOLETE if (fi)
+// OBSOLETE {
+// OBSOLETE status = target_read_memory (addr + 1, buf, 1);
+// OBSOLETE if (status != 0)
+// OBSOLETE return addr;
+// OBSOLETE fi->fsr.regs[6] = (get_frame_base (fi) + stack_size
+// OBSOLETE + extract_signed_integer (buf, 1));
+// OBSOLETE fi->status &= ~CALLER_A2_IN_A0;
+// OBSOLETE }
+// OBSOLETE addr += 2;
+// OBSOLETE if (addr >= stop)
+// OBSOLETE return addr;
+// OBSOLETE return addr;
+// OBSOLETE }
+// OBSOLETE return addr;
+// OBSOLETE }
+// OBSOLETE
+// OBSOLETE /* Function: frame_chain
+// OBSOLETE Figure out and return the caller's frame pointer given current
+// OBSOLETE frame_info struct.
+// OBSOLETE
+// OBSOLETE We don't handle dummy frames yet but we would probably just return the
+// OBSOLETE stack pointer that was in use at the time the function call was made? */
+// OBSOLETE
+// OBSOLETE CORE_ADDR
+// OBSOLETE mn10200_frame_chain (struct frame_info *fi)
+// OBSOLETE {
+// OBSOLETE struct frame_info *dummy_frame = deprecated_frame_xmalloc ();
+// OBSOLETE struct cleanup *old_chain = make_cleanup (xfree, dummy_frame);
+// OBSOLETE CORE_ADDR ret;
+// OBSOLETE
+// OBSOLETE /* Walk through the prologue to determine the stack size,
+// OBSOLETE location of saved registers, end of the prologue, etc. */
+// OBSOLETE if (fi->status == 0)
+// OBSOLETE mn10200_analyze_prologue (fi, (CORE_ADDR) 0);
+// OBSOLETE
+// OBSOLETE /* Quit now if mn10200_analyze_prologue set NO_MORE_FRAMES. */
+// OBSOLETE if (fi->status & NO_MORE_FRAMES)
+// OBSOLETE return 0;
+// OBSOLETE
+// OBSOLETE /* Now that we've analyzed our prologue, determine the frame
+// OBSOLETE pointer for our caller.
+// OBSOLETE
+// OBSOLETE If our caller has a frame pointer, then we need to
+// OBSOLETE find the entry value of $a2 to our function.
+// OBSOLETE
+// OBSOLETE If CALLER_A2_IN_A0, then the chain is in $a0.
+// OBSOLETE
+// OBSOLETE If fsr.regs[6] is nonzero, then it's at the memory
+// OBSOLETE location pointed to by fsr.regs[6].
+// OBSOLETE
+// OBSOLETE Else it's still in $a2.
+// OBSOLETE
+// OBSOLETE If our caller does not have a frame pointer, then his
+// OBSOLETE frame base is fi->frame + -caller's stack size + 4. */
+// OBSOLETE
+// OBSOLETE /* The easiest way to get that info is to analyze our caller's frame.
+// OBSOLETE
+// OBSOLETE So we set up a dummy frame and call mn10200_analyze_prologue to
+// OBSOLETE find stuff for us. */
+// OBSOLETE deprecated_update_frame_pc_hack (dummy_frame, FRAME_SAVED_PC (fi));
+// OBSOLETE deprecated_update_frame_base_hack (dummy_frame, get_frame_base (fi));
+// OBSOLETE memset (dummy_frame->fsr.regs, '\000', sizeof dummy_frame->fsr.regs);
+// OBSOLETE dummy_frame->status = 0;
+// OBSOLETE dummy_frame->stack_size = 0;
+// OBSOLETE mn10200_analyze_prologue (dummy_frame, 0);
+// OBSOLETE
+// OBSOLETE if (dummy_frame->status & MY_FRAME_IN_FP)
+// OBSOLETE {
+// OBSOLETE /* Our caller has a frame pointer. So find the frame in $a2, $a0,
+// OBSOLETE or in the stack. */
+// OBSOLETE if (fi->fsr.regs[6])
+// OBSOLETE ret = (read_memory_integer (fi->fsr.regs[FP_REGNUM], REGISTER_SIZE)
+// OBSOLETE & 0xffffff);
+// OBSOLETE else if (fi->status & CALLER_A2_IN_A0)
+// OBSOLETE ret = read_register (4);
+// OBSOLETE else
+// OBSOLETE ret = read_register (FP_REGNUM);
+// OBSOLETE }
+// OBSOLETE else
+// OBSOLETE {
+// OBSOLETE /* Our caller does not have a frame pointer. So his frame starts
+// OBSOLETE at the base of our frame (fi->frame) + <his size> + 4 (saved pc). */
+// OBSOLETE ret = get_frame_base (fi) + -dummy_frame->stack_size + 4;
+// OBSOLETE }
+// OBSOLETE do_cleanups (old_chain);
+// OBSOLETE return ret;
+// OBSOLETE }
+// OBSOLETE
+// OBSOLETE /* Function: skip_prologue
+// OBSOLETE Return the address of the first inst past the prologue of the function. */
+// OBSOLETE
+// OBSOLETE CORE_ADDR
+// OBSOLETE mn10200_skip_prologue (CORE_ADDR pc)
+// OBSOLETE {
+// OBSOLETE /* We used to check the debug symbols, but that can lose if
+// OBSOLETE we have a null prologue. */
+// OBSOLETE return mn10200_analyze_prologue (NULL, pc);
+// OBSOLETE }
+// OBSOLETE
+// OBSOLETE /* Function: pop_frame
+// OBSOLETE This routine gets called when either the user uses the `return'
+// OBSOLETE command, or the call dummy breakpoint gets hit. */
+// OBSOLETE
+// OBSOLETE void
+// OBSOLETE mn10200_pop_frame (struct frame_info *frame)
+// OBSOLETE {
+// OBSOLETE int regnum;
+// OBSOLETE
+// OBSOLETE if (DEPRECATED_PC_IN_CALL_DUMMY (get_frame_pc (frame),
+// OBSOLETE get_frame_base (frame),
+// OBSOLETE get_frame_base (frame)))
+// OBSOLETE generic_pop_dummy_frame ();
+// OBSOLETE else
+// OBSOLETE {
+// OBSOLETE write_register (PC_REGNUM, FRAME_SAVED_PC (frame));
+// OBSOLETE
+// OBSOLETE /* Restore any saved registers. */
+// OBSOLETE for (regnum = 0; regnum < NUM_REGS; regnum++)
+// OBSOLETE if (frame->fsr.regs[regnum] != 0)
+// OBSOLETE {
+// OBSOLETE ULONGEST value;
+// OBSOLETE
+// OBSOLETE value = read_memory_unsigned_integer (frame->fsr.regs[regnum],
+// OBSOLETE REGISTER_RAW_SIZE (regnum));
+// OBSOLETE write_register (regnum, value);
+// OBSOLETE }
+// OBSOLETE
+// OBSOLETE /* Actually cut back the stack. */
+// OBSOLETE write_register (SP_REGNUM, get_frame_base (frame));
+// OBSOLETE
+// OBSOLETE /* Don't we need to set the PC?!? XXX FIXME. */
+// OBSOLETE }
+// OBSOLETE
+// OBSOLETE /* Throw away any cached frame information. */
+// OBSOLETE flush_cached_frames ();
+// OBSOLETE }
+// OBSOLETE
+// OBSOLETE /* Function: push_arguments
+// OBSOLETE Setup arguments for a call to the target. Arguments go in
+// OBSOLETE order on the stack. */
+// OBSOLETE
+// OBSOLETE CORE_ADDR
+// OBSOLETE mn10200_push_arguments (int nargs, struct value **args, CORE_ADDR sp,
+// OBSOLETE unsigned char struct_return, CORE_ADDR struct_addr)
+// OBSOLETE {
+// OBSOLETE int argnum = 0;
+// OBSOLETE int len = 0;
+// OBSOLETE int stack_offset = 0;
+// OBSOLETE int regsused = struct_return ? 1 : 0;
+// OBSOLETE
+// OBSOLETE /* This should be a nop, but align the stack just in case something
+// OBSOLETE went wrong. Stacks are two byte aligned on the mn10200. */
+// OBSOLETE sp &= ~1;
+// OBSOLETE
+// OBSOLETE /* Now make space on the stack for the args.
+// OBSOLETE
+// OBSOLETE XXX This doesn't appear to handle pass-by-invisible reference
+// OBSOLETE arguments. */
+// OBSOLETE for (argnum = 0; argnum < nargs; argnum++)
+// OBSOLETE {
+// OBSOLETE int arg_length = (TYPE_LENGTH (VALUE_TYPE (args[argnum])) + 1) & ~1;
+// OBSOLETE
+// OBSOLETE /* If we've used all argument registers, then this argument is
+// OBSOLETE pushed. */
+// OBSOLETE if (regsused >= 2 || arg_length > 4)
+// OBSOLETE {
+// OBSOLETE regsused = 2;
+// OBSOLETE len += arg_length;
+// OBSOLETE }
+// OBSOLETE /* We know we've got some arg register space left. If this argument
+// OBSOLETE will fit entirely in regs, then put it there. */
+// OBSOLETE else if (arg_length <= 2
+// OBSOLETE || TYPE_CODE (VALUE_TYPE (args[argnum])) == TYPE_CODE_PTR)
+// OBSOLETE {
+// OBSOLETE regsused++;
+// OBSOLETE }
+// OBSOLETE else if (regsused == 0)
+// OBSOLETE {
+// OBSOLETE regsused = 2;
+// OBSOLETE }
+// OBSOLETE else
+// OBSOLETE {
+// OBSOLETE regsused = 2;
+// OBSOLETE len += arg_length;
+// OBSOLETE }
+// OBSOLETE }
+// OBSOLETE
+// OBSOLETE /* Allocate stack space. */
+// OBSOLETE sp -= len;
+// OBSOLETE
+// OBSOLETE regsused = struct_return ? 1 : 0;
+// OBSOLETE /* Push all arguments onto the stack. */
+// OBSOLETE for (argnum = 0; argnum < nargs; argnum++)
+// OBSOLETE {
+// OBSOLETE int len;
+// OBSOLETE char *val;
+// OBSOLETE
+// OBSOLETE /* XXX Check this. What about UNIONS? */
+// OBSOLETE if (TYPE_CODE (VALUE_TYPE (*args)) == TYPE_CODE_STRUCT
+// OBSOLETE && TYPE_LENGTH (VALUE_TYPE (*args)) > 8)
+// OBSOLETE {
+// OBSOLETE /* XXX Wrong, we want a pointer to this argument. */
+// OBSOLETE len = TYPE_LENGTH (VALUE_TYPE (*args));
+// OBSOLETE val = (char *) VALUE_CONTENTS (*args);
+// OBSOLETE }
+// OBSOLETE else
+// OBSOLETE {
+// OBSOLETE len = TYPE_LENGTH (VALUE_TYPE (*args));
+// OBSOLETE val = (char *) VALUE_CONTENTS (*args);
+// OBSOLETE }
+// OBSOLETE
+// OBSOLETE if (regsused < 2
+// OBSOLETE && (len <= 2
+// OBSOLETE || TYPE_CODE (VALUE_TYPE (*args)) == TYPE_CODE_PTR))
+// OBSOLETE {
+// OBSOLETE write_register (regsused, extract_unsigned_integer (val, 4));
+// OBSOLETE regsused++;
+// OBSOLETE }
+// OBSOLETE else if (regsused == 0 && len == 4)
+// OBSOLETE {
+// OBSOLETE write_register (regsused, extract_unsigned_integer (val, 2));
+// OBSOLETE write_register (regsused + 1, extract_unsigned_integer (val + 2, 2));
+// OBSOLETE regsused = 2;
+// OBSOLETE }
+// OBSOLETE else
+// OBSOLETE {
+// OBSOLETE regsused = 2;
+// OBSOLETE while (len > 0)
+// OBSOLETE {
+// OBSOLETE write_memory (sp + stack_offset, val, 2);
+// OBSOLETE
+// OBSOLETE len -= 2;
+// OBSOLETE val += 2;
+// OBSOLETE stack_offset += 2;
+// OBSOLETE }
+// OBSOLETE }
+// OBSOLETE args++;
+// OBSOLETE }
+// OBSOLETE
+// OBSOLETE return sp;
+// OBSOLETE }
+// OBSOLETE
+// OBSOLETE /* Function: push_return_address (pc)
+// OBSOLETE Set up the return address for the inferior function call.
+// OBSOLETE Needed for targets where we don't actually execute a JSR/BSR instruction */
+// OBSOLETE
+// OBSOLETE CORE_ADDR
+// OBSOLETE mn10200_push_return_address (CORE_ADDR pc, CORE_ADDR sp)
+// OBSOLETE {
+// OBSOLETE unsigned char buf[4];
+// OBSOLETE
+// OBSOLETE store_unsigned_integer (buf, 4, CALL_DUMMY_ADDRESS ());
+// OBSOLETE write_memory (sp - 4, buf, 4);
+// OBSOLETE return sp - 4;
+// OBSOLETE }
+// OBSOLETE
+// OBSOLETE /* Function: store_struct_return (addr,sp)
+// OBSOLETE Store the structure value return address for an inferior function
+// OBSOLETE call. */
+// OBSOLETE
+// OBSOLETE CORE_ADDR
+// OBSOLETE mn10200_store_struct_return (CORE_ADDR addr, CORE_ADDR sp)
+// OBSOLETE {
+// OBSOLETE /* The structure return address is passed as the first argument. */
+// OBSOLETE write_register (0, addr);
+// OBSOLETE return sp;
+// OBSOLETE }
+// OBSOLETE
+// OBSOLETE /* Function: frame_saved_pc
+// OBSOLETE Find the caller of this frame. We do this by seeing if RP_REGNUM
+// OBSOLETE is saved in the stack anywhere, otherwise we get it from the
+// OBSOLETE registers. If the inner frame is a dummy frame, return its PC
+// OBSOLETE instead of RP, because that's where "caller" of the dummy-frame
+// OBSOLETE will be found. */
+// OBSOLETE
+// OBSOLETE CORE_ADDR
+// OBSOLETE mn10200_frame_saved_pc (struct frame_info *fi)
+// OBSOLETE {
+// OBSOLETE /* The saved PC will always be at the base of the current frame. */
+// OBSOLETE return (read_memory_integer (get_frame_base (fi), REGISTER_SIZE) & 0xffffff);
+// OBSOLETE }
+// OBSOLETE
+// OBSOLETE /* Function: init_extra_frame_info
+// OBSOLETE Setup the frame's frame pointer, pc, and frame addresses for saved
+// OBSOLETE registers. Most of the work is done in mn10200_analyze_prologue().
+// OBSOLETE
+// OBSOLETE Note that when we are called for the last frame (currently active frame),
+// OBSOLETE that get_frame_pc (fi) and fi->frame will already be setup. However, fi->frame will
+// OBSOLETE be valid only if this routine uses FP. For previous frames, fi-frame will
+// OBSOLETE always be correct. mn10200_analyze_prologue will fix fi->frame if
+// OBSOLETE it's not valid.
+// OBSOLETE
+// OBSOLETE We can be called with the PC in the call dummy under two circumstances.
+// OBSOLETE First, during normal backtracing, second, while figuring out the frame
+// OBSOLETE pointer just prior to calling the target function (see run_stack_dummy). */
+// OBSOLETE
+// OBSOLETE void
+// OBSOLETE mn10200_init_extra_frame_info (struct frame_info *fi)
+// OBSOLETE {
+// OBSOLETE if (get_next_frame (fi))
+// OBSOLETE deprecated_update_frame_pc_hack (fi, FRAME_SAVED_PC (get_next_frame (fi)));
+// OBSOLETE
+// OBSOLETE memset (fi->fsr.regs, '\000', sizeof fi->fsr.regs);
+// OBSOLETE fi->status = 0;
+// OBSOLETE fi->stack_size = 0;
+// OBSOLETE
+// OBSOLETE mn10200_analyze_prologue (fi, 0);
+// OBSOLETE }
+// OBSOLETE
+// OBSOLETE void
+// OBSOLETE _initialize_mn10200_tdep (void)
+// OBSOLETE {
+// OBSOLETE tm_print_insn = print_insn_mn10200;
+// OBSOLETE }
-
-# Copyright 1997 Free Software Foundation, Inc.
-
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-
-# Please email any bugs, comments, and/or additions to this file to:
-# bug-gdb@prep.ai.mit.edu
-
-# This file was written by Jeff Law. (law@cygnus.com)
-
-if $tracelevel then {
- strace $tracelevel
-}
-
-if ![istarget "mn10200*-*-*"] {
- verbose "Tests ignored for all but mn10200 based targets."
- return
-}
-
-global exec_output
-set prms_id 0
-set bug_id 0
-
-set testfile "mn10200"
-set srcfile ${srcdir}/${subdir}/${testfile}.s
-set binfile ${objdir}/${subdir}/${testfile}
-if { [gdb_compile "${srcfile}" "${binfile}" executable ""] != "" } {
- gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
-}
-
-proc add_tests { } {
- global gdb_prompt
- global hex
- global decimal
-
- send_gdb "x/12i add_tests\n"
- gdb_expect {
- -re "
-.*add d1,d2.*
-.*add d2,a3.*
-.*add a2,d1.*
-.*add a3,a2.*
-.*add 16,d1.*
-.*add 256,d2.*
-.*add 131071,d3.*
-.*add 16,a1.*
-.*add 256,a2.*
-.*add 131071,a3.*
-.*addc d1,d2.*
-.*addnf 16,a2.*
-.*$gdb_prompt $" { pass "add tests" }
- -re "$gdb_prompt $" { fail "add tests" }
- timeout { fail "(timeout) add tests" }
- }
-}
-
-proc bcc_tests { } {
- global gdb_prompt
- global hex
- global decimal
-
- send_gdb "x/15i bCC_tests\n"
- gdb_expect {
- -re "
-.*beq 0x\[0-9a-f]+ <bCC_tests>.*
-.*bne 0x\[0-9a-f]+ <bCC_tests>.*
-.*bgt 0x\[0-9a-f]+ <bCC_tests>.*
-.*bge 0x\[0-9a-f]+ <bCC_tests>.*
-.*ble 0x\[0-9a-f]+ <bCC_tests>.*
-.*blt 0x\[0-9a-f]+ <bCC_tests>.*
-.*bhi 0x\[0-9a-f]+ <bCC_tests>.*
-.*bcc 0x\[0-9a-f]+ <bCC_tests>.*
-.*bls 0x\[0-9a-f]+ <bCC_tests>.*
-.*bcs 0x\[0-9a-f]+ <bCC_tests>.*
-.*bvc 0x\[0-9a-f]+ <bCC_tests>.*
-.*bvs 0x\[0-9a-f]+ <bCC_tests>.*
-.*bnc 0x\[0-9a-f]+ <bCC_tests>.*
-.*bns 0x\[0-9a-f]+ <bCC_tests>.*
-.*bra 0x\[0-9a-f]+ <bCC_tests>.*
-.*$gdb_prompt $" { pass "bCC tests" }
- -re "$gdb_prompt $" { fail "bCC tests" }
- timeout { fail "(timeout) bCC tests" }
- }
-}
-
-proc bccx_tests { } {
- global gdb_prompt
- global hex
- global decimal
-
- send_gdb "x/14i bCCx_tests\n"
- gdb_expect {
- -re "
-.*beqx 0x\[0-9a-f]+ <bCCx_tests>.*
-.*bnex 0x\[0-9a-f]+ <bCCx_tests>.*
-.*bgtx 0x\[0-9a-f]+ <bCCx_tests>.*
-.*bgex 0x\[0-9a-f]+ <bCCx_tests>.*
-.*blex 0x\[0-9a-f]+ <bCCx_tests>.*
-.*bltx 0x\[0-9a-f]+ <bCCx_tests>.*
-.*bhix 0x\[0-9a-f]+ <bCCx_tests>.*
-.*bccx 0x\[0-9a-f]+ <bCCx_tests>.*
-.*blsx 0x\[0-9a-f]+ <bCCx_tests>.*
-.*bcsx 0x\[0-9a-f]+ <bCCx_tests>.*
-.*bvcx 0x\[0-9a-f]+ <bCCx_tests>.*
-.*bvsx 0x\[0-9a-f]+ <bCCx_tests>.*
-.*bncx 0x\[0-9a-f]+ <bCCx_tests>.*
-.*bnsx 0x\[0-9a-f]+ <bCCx_tests>.*
-.*$gdb_prompt $" { pass "bCCx tests" }
- -re "$gdb_prompt $" { fail "bCCx tests" }
- timeout { fail "(timeout) bCCx tests" }
- }
-}
-
-proc bit_tests { } {
- global gdb_prompt
- global hex
- global decimal
-
- send_gdb "x/4 bit_tests\n"
- gdb_expect {
- -re "
-.*btst 64,d1.*
-.*btst 8192,d2.*
-.*bset d1,\\(a2\\).*
-.*bclr d1,\\(a2\\).*
-.*$gdb_prompt $" { pass "bit tests" }
- -re "$gdb_prompt $" { fail "bit tests" }
- timeout { fail "(timeout) bit tests" }
- }
-}
-
-proc cmp_tests { } {
- global gdb_prompt
- global hex
- global decimal
-
- send_gdb "x/9i cmp_tests\n"
- gdb_expect {
- -re "
-.*cmp d1,d2.*
-.*cmp d2,a3.*
-.*cmp a3,d3.*
-.*cmp a3,a2.*
-.*cmp 16,d3.*
-.*cmp 256,d2.*
-.*cmp 131071,d1.*
-.*cmp 256,a2.*
-.*cmp 131071,a1.*
-.*$gdb_prompt $" { pass "cmp tests" }
- -re "$gdb_prompt $" { fail "cmp tests" }
- timeout { fail "(timeout) cmp tests" }
- }
-}
-
-proc extend_tests { } {
- global gdb_prompt
- global hex
- global decimal
-
- send_gdb "x/5i extend_tests\n"
- gdb_expect {
- -re "
-.*ext d1.*
-.*extx d2.*
-.*extxu d3.*
-.*extxb d2.*
-.*extxbu d1.*
-.*$gdb_prompt $" { pass "extend tests" }
- -re "$gdb_prompt $" { fail "extend tests" }
- timeout { fail "(timeout) extend tests" }
- }
-}
-
-proc logical_tests { } {
- global gdb_prompt
- global hex
- global decimal
-
- send_gdb "x/11i logical_tests\n"
- gdb_expect {
- -re "
-.*and d1,d2.*
-.*and 127,d2.*
-.*and 32767,d3.*
-.*and 32767,psw.*
-.*or d1,d2.*
-.*or 127,d2.*
-.*or 32767,d3.*
-.*or 32767,psw.*
-.*xor d1,d2.*
-.*xor 32767,d3.*
-.*not d3.*
-.*$gdb_prompt $" { pass "logical tests" }
- -re "$gdb_prompt $" { fail "logical tests" }
- timeout { fail "(timeout) logical tests" }
- }
-}
-
-proc mov_tests_1 { } {
- global gdb_prompt
- global hex
- global decimal
-
- send_gdb "x/12i mov_tests_1\n"
- gdb_expect {
- -re "
-.*mov d1,a2.*
-.*mov a2,d1.*
-.*mov d1,d2.*
-.*mov a2,a1.*
-.*mov psw,d3.*
-.*mov d2,psw.*
-.*mov mdr,d1.*
-.*mov d2,mdr.*
-.*mov \\(a2\\),d1.*
-.*mov \\(8,a2\\),d1.*
-.*mov \\(256,a2\\),d1.*
-.*mov \\(131071,a2\\),d1.*
-.*$gdb_prompt $" { pass "mov1 tests" }
- -re "$gdb_prompt $" { fail "mov1 tests" }
- timeout { fail "(timeout) mov1 tests" }
- }
-}
-
-proc mov_tests_2 { } {
- global gdb_prompt
- global hex
- global decimal
-
- send_gdb "x/9 mov_tests_2\n"
- gdb_expect {
- -re "
-.*mov \\(d1,a1\\),d2.*
-.*mov \\(0x8000.*\\),d1.*
-.*mov \\(0x1ffff.*\\),d1.*
-.*mov \\(8,a2\\),a1.*
-.*mov \\(256,a2\\),a1.*
-.*mov \\(131071,a2\\),a1.*
-.*mov \\(d1,a1\\),a2.*
-.*mov \\(0x8000.*\\),a1.*
-.*mov \\(0x1ffff.*\\),a1.*
-.*$gdb_prompt $" { pass "mov2 tests" }
- -re "$gdb_prompt $" { fail "mov2 tests" }
- timeout { fail "(timeout) mov2 tests" }
- }
-}
-
-proc mov_tests_3 { } {
- global gdb_prompt
- global hex
- global decimal
-
- send_gdb "x/10 mov_tests_3\n"
- gdb_expect {
- -re "
-.*mov d1,\\(a2\\).*
-.*mov d1,\\(32,a2\\).*
-.*mov d1,\\(256,a2\\).*
-.*mov d1,\\(131071,a2\\).*
-.*mov d1,\\(d2,a2\\).*
-.*mov d1,\\(0x80.*\\).*
-.*mov d1,\\(0x1ffff.*\\).*
-.*mov a1,\\(32,a2\\).*
-.*mov a1,\\(256,a2\\).*
-.*mov a1,\\(131071,a2\\).*
-.*$gdb_prompt $" { pass "mov3 tests" }
- -re "$gdb_prompt $" { fail "mov3 tests" }
- timeout { fail "(timeout) mov3 tests" }
- }
-}
-
-proc mov_tests_4 { } {
- global gdb_prompt
- global hex
- global decimal
-
- send_gdb "x/8 mov_tests_4\n"
- gdb_expect {
- -re "
-.*mov a1,\\(d2,a2\\).*
-.*mov a1,\\(0x80.*\\).*
-.*mov a1,\\(0x1ffff.*\\).*
-.*mov 8,d1.*
-.*mov 256,d1.*
-.*mov 131071,d1.*
-.*mov 256,a1.*
-.*mov 131071,a1.*
-.*$gdb_prompt $" { pass "mov4 tests" }
- -re "$gdb_prompt $" { fail "mov4 tests" }
- timeout { fail "(timeout) mov4 tests" }
- }
-}
-
-proc movb_tests { } {
- global gdb_prompt
- global hex
- global decimal
-
- send_gdb "x/12 movb_tests\n"
- gdb_expect {
- -re "
-.*movb \\(8,a2\\),d1.*
-.*movb \\(256,a2\\),d1.*
-.*movb \\(131071,a2\\),d1.*
-.*movb \\(d2,a2\\),d3.*
-.*movb \\(0x1ffff.*\\),d2.*
-.*movb d1,\\(a2\\).*
-.*movb d1,\\(8,a2\\).*
-.*movb d1,\\(256,a2\\).*
-.*movb d1,\\(131071,a2\\).*
-.*movb d1,\\(d2,a2\\).*
-.*movb d1,\\(0x100.*\\).*
-.*movb d1,\\(0x1ffff.*\\).*
-.*$gdb_prompt $" { pass "movb tests" }
- -re "$gdb_prompt $" { fail "movb tests" }
- timeout { fail "(timeout) movb tests" }
- }
-}
-
-proc movbu_tests { } {
- global gdb_prompt
- global hex
- global decimal
-
- send_gdb "x/7 movbu_tests\n"
- gdb_expect {
- -re "
-.*movbu \\(a2\\),d1.*
-.*movbu \\(8,a2\\),d1.*
-.*movbu \\(256,a2\\),d1.*
-.*movbu \\(131071,a2\\),d1.*
-.*movbu \\(d1,a1\\),d2.*
-.*movbu \\(0x8000.*\\),d1.*
-.*movbu \\(0x1ffff.*\\),d1.*
-.*$gdb_prompt $" { pass "movbu tests" }
- -re "$gdb_prompt $" { fail "movbu tests" }
- timeout { fail "(timeout) movbu tests" }
- }
-}
-
-proc movx_tests { } {
- global gdb_prompt
- global hex
- global decimal
-
- send_gdb "x/6 movx_tests\n"
- gdb_expect {
- -re "
-.*movx \\(8,a2\\),d1.*
-.*movx \\(256,a2\\),d1.*
-.*movx \\(131071,a2\\),d1.*
-.*movx d1,\\(8,a2\\).*
-.*movx d1,\\(256,a2\\).*
-.*movx d1,\\(131071,a2\\).*
-.*$gdb_prompt $" { pass "movx tests" }
- -re "$gdb_prompt $" { fail "movx tests" }
- timeout { fail "(timeout) movx tests" }
- }
-}
-
-proc muldiv_tests { } {
- global gdb_prompt
- global hex
- global decimal
-
- send_gdb "x/3 muldiv_tests\n"
- gdb_expect {
- -re "
-.*mul d1,d2.*
-.*mulu d2,d3.*
-.*divu d3,d2.*
-.*$gdb_prompt $" { pass "muldiv tests" }
- -re "$gdb_prompt $" { fail "muldiv tests" }
- timeout { fail "(timeout) muldiv tests" }
- }
-}
-
-proc misc_tests { } {
- global gdb_prompt
- global hex
- global decimal
-
- send_gdb "x/9 misc_tests\n"
- gdb_expect {
- -re "
-.*jmp 0x\[0-9a-f]+ <main>.*
-.*jmp 0x\[0-9a-f]+ <start>.*
-.*jmp \\(a2\\).*
-.*jsr 0x\[0-9a-f]+ <main>.*
-.*jsr 0x\[0-9a-f]+ <start>.*
-.*jsr \\(a2\\).*
-.*rts.*
-.*rti.*
-.*nop.*
-.*$gdb_prompt $" { pass "misc tests" }
- -re "$gdb_prompt $" { fail "misc tests" }
- timeout { fail "(timeout) misc tests" }
- }
-}
-
-proc shift_tests { } {
- global gdb_prompt
- global hex
- global decimal
-
- send_gdb "x/4i shift_tests\n"
- gdb_expect {
- -re "
-.*asr d2.*
-.*lsr d3.*
-.*ror d1.*
-.*rol d2.*
-.*$gdb_prompt $" { pass "shift tests" }
- -re "$gdb_prompt $" { fail "shift tests" }
- timeout { fail "(timeout) shift tests" }
- }
-}
-
-proc sub_tests { } {
- global gdb_prompt
- global hex
- global decimal
-
- send_gdb "x/9i sub_tests\n"
- gdb_expect {
- -re "
-.*sub d1,d2.*
-.*sub d2,a3.*
-.*sub a3,d3.*
-.*sub a3,a2.*
-.*sub 32767,d2.*
-.*sub 131071,d2.*
-.*sub 32767,a2.*
-.*sub 131071,a2.*
-.*subc d1,d2.*
-.*$gdb_prompt $" { pass "sub tests" }
- -re "$gdb_prompt $" { fail "sub tests" }
- timeout { fail "(timeout) sub tests" }
- }
-}
-
-# Start with a fresh gdb.
-
-gdb_exit
-gdb_start
-gdb_reinitialize_dir $srcdir/$subdir
-gdb_load $binfile
-
-add_tests
-bcc_tests
-bccx_tests
-bit_tests
-cmp_tests
-extend_tests
-logical_tests
-mov_tests_1
-mov_tests_2
-mov_tests_3
-mov_tests_4
-movb_tests
-movbu_tests
-movx_tests
-muldiv_tests
-misc_tests
-shift_tests
-sub_tests
+# OBSOLETE
+# OBSOLETE # Copyright 1997 Free Software Foundation, Inc.
+# OBSOLETE
+# OBSOLETE # This program is free software; you can redistribute it and/or modify
+# OBSOLETE # it under the terms of the GNU General Public License as published by
+# OBSOLETE # the Free Software Foundation; either version 2 of the License, or
+# OBSOLETE # (at your option) any later version.
+# OBSOLETE #
+# OBSOLETE # This program is distributed in the hope that it will be useful,
+# OBSOLETE # but WITHOUT ANY WARRANTY; without even the implied warranty of
+# OBSOLETE # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# OBSOLETE # GNU General Public License for more details.
+# OBSOLETE #
+# OBSOLETE # You should have received a copy of the GNU General Public License
+# OBSOLETE # along with this program; if not, write to the Free Software
+# OBSOLETE # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+# OBSOLETE
+# OBSOLETE # Please email any bugs, comments, and/or additions to this file to:
+# OBSOLETE # bug-gdb@prep.ai.mit.edu
+# OBSOLETE
+# OBSOLETE # This file was written by Jeff Law. (law@cygnus.com)
+# OBSOLETE
+# OBSOLETE if $tracelevel then {
+# OBSOLETE strace $tracelevel
+# OBSOLETE }
+# OBSOLETE
+# OBSOLETE if ![istarget "mn10200*-*-*"] {
+# OBSOLETE verbose "Tests ignored for all but mn10200 based targets."
+# OBSOLETE return
+# OBSOLETE }
+# OBSOLETE
+# OBSOLETE global exec_output
+# OBSOLETE set prms_id 0
+# OBSOLETE set bug_id 0
+# OBSOLETE
+# OBSOLETE set testfile "mn10200"
+# OBSOLETE set srcfile ${srcdir}/${subdir}/${testfile}.s
+# OBSOLETE set binfile ${objdir}/${subdir}/${testfile}
+# OBSOLETE if { [gdb_compile "${srcfile}" "${binfile}" executable ""] != "" } {
+# OBSOLETE gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
+# OBSOLETE }
+# OBSOLETE
+# OBSOLETE proc add_tests { } {
+# OBSOLETE global gdb_prompt
+# OBSOLETE global hex
+# OBSOLETE global decimal
+# OBSOLETE
+# OBSOLETE send_gdb "x/12i add_tests\n"
+# OBSOLETE gdb_expect {
+# OBSOLETE -re "
+# OBSOLETE .*add d1,d2.*
+# OBSOLETE .*add d2,a3.*
+# OBSOLETE .*add a2,d1.*
+# OBSOLETE .*add a3,a2.*
+# OBSOLETE .*add 16,d1.*
+# OBSOLETE .*add 256,d2.*
+# OBSOLETE .*add 131071,d3.*
+# OBSOLETE .*add 16,a1.*
+# OBSOLETE .*add 256,a2.*
+# OBSOLETE .*add 131071,a3.*
+# OBSOLETE .*addc d1,d2.*
+# OBSOLETE .*addnf 16,a2.*
+# OBSOLETE .*$gdb_prompt $" { pass "add tests" }
+# OBSOLETE -re "$gdb_prompt $" { fail "add tests" }
+# OBSOLETE timeout { fail "(timeout) add tests" }
+# OBSOLETE }
+# OBSOLETE }
+# OBSOLETE
+# OBSOLETE proc bcc_tests { } {
+# OBSOLETE global gdb_prompt
+# OBSOLETE global hex
+# OBSOLETE global decimal
+# OBSOLETE
+# OBSOLETE send_gdb "x/15i bCC_tests\n"
+# OBSOLETE gdb_expect {
+# OBSOLETE -re "
+# OBSOLETE .*beq 0x\[0-9a-f]+ <bCC_tests>.*
+# OBSOLETE .*bne 0x\[0-9a-f]+ <bCC_tests>.*
+# OBSOLETE .*bgt 0x\[0-9a-f]+ <bCC_tests>.*
+# OBSOLETE .*bge 0x\[0-9a-f]+ <bCC_tests>.*
+# OBSOLETE .*ble 0x\[0-9a-f]+ <bCC_tests>.*
+# OBSOLETE .*blt 0x\[0-9a-f]+ <bCC_tests>.*
+# OBSOLETE .*bhi 0x\[0-9a-f]+ <bCC_tests>.*
+# OBSOLETE .*bcc 0x\[0-9a-f]+ <bCC_tests>.*
+# OBSOLETE .*bls 0x\[0-9a-f]+ <bCC_tests>.*
+# OBSOLETE .*bcs 0x\[0-9a-f]+ <bCC_tests>.*
+# OBSOLETE .*bvc 0x\[0-9a-f]+ <bCC_tests>.*
+# OBSOLETE .*bvs 0x\[0-9a-f]+ <bCC_tests>.*
+# OBSOLETE .*bnc 0x\[0-9a-f]+ <bCC_tests>.*
+# OBSOLETE .*bns 0x\[0-9a-f]+ <bCC_tests>.*
+# OBSOLETE .*bra 0x\[0-9a-f]+ <bCC_tests>.*
+# OBSOLETE .*$gdb_prompt $" { pass "bCC tests" }
+# OBSOLETE -re "$gdb_prompt $" { fail "bCC tests" }
+# OBSOLETE timeout { fail "(timeout) bCC tests" }
+# OBSOLETE }
+# OBSOLETE }
+# OBSOLETE
+# OBSOLETE proc bccx_tests { } {
+# OBSOLETE global gdb_prompt
+# OBSOLETE global hex
+# OBSOLETE global decimal
+# OBSOLETE
+# OBSOLETE send_gdb "x/14i bCCx_tests\n"
+# OBSOLETE gdb_expect {
+# OBSOLETE -re "
+# OBSOLETE .*beqx 0x\[0-9a-f]+ <bCCx_tests>.*
+# OBSOLETE .*bnex 0x\[0-9a-f]+ <bCCx_tests>.*
+# OBSOLETE .*bgtx 0x\[0-9a-f]+ <bCCx_tests>.*
+# OBSOLETE .*bgex 0x\[0-9a-f]+ <bCCx_tests>.*
+# OBSOLETE .*blex 0x\[0-9a-f]+ <bCCx_tests>.*
+# OBSOLETE .*bltx 0x\[0-9a-f]+ <bCCx_tests>.*
+# OBSOLETE .*bhix 0x\[0-9a-f]+ <bCCx_tests>.*
+# OBSOLETE .*bccx 0x\[0-9a-f]+ <bCCx_tests>.*
+# OBSOLETE .*blsx 0x\[0-9a-f]+ <bCCx_tests>.*
+# OBSOLETE .*bcsx 0x\[0-9a-f]+ <bCCx_tests>.*
+# OBSOLETE .*bvcx 0x\[0-9a-f]+ <bCCx_tests>.*
+# OBSOLETE .*bvsx 0x\[0-9a-f]+ <bCCx_tests>.*
+# OBSOLETE .*bncx 0x\[0-9a-f]+ <bCCx_tests>.*
+# OBSOLETE .*bnsx 0x\[0-9a-f]+ <bCCx_tests>.*
+# OBSOLETE .*$gdb_prompt $" { pass "bCCx tests" }
+# OBSOLETE -re "$gdb_prompt $" { fail "bCCx tests" }
+# OBSOLETE timeout { fail "(timeout) bCCx tests" }
+# OBSOLETE }
+# OBSOLETE }
+# OBSOLETE
+# OBSOLETE proc bit_tests { } {
+# OBSOLETE global gdb_prompt
+# OBSOLETE global hex
+# OBSOLETE global decimal
+# OBSOLETE
+# OBSOLETE send_gdb "x/4 bit_tests\n"
+# OBSOLETE gdb_expect {
+# OBSOLETE -re "
+# OBSOLETE .*btst 64,d1.*
+# OBSOLETE .*btst 8192,d2.*
+# OBSOLETE .*bset d1,\\(a2\\).*
+# OBSOLETE .*bclr d1,\\(a2\\).*
+# OBSOLETE .*$gdb_prompt $" { pass "bit tests" }
+# OBSOLETE -re "$gdb_prompt $" { fail "bit tests" }
+# OBSOLETE timeout { fail "(timeout) bit tests" }
+# OBSOLETE }
+# OBSOLETE }
+# OBSOLETE
+# OBSOLETE proc cmp_tests { } {
+# OBSOLETE global gdb_prompt
+# OBSOLETE global hex
+# OBSOLETE global decimal
+# OBSOLETE
+# OBSOLETE send_gdb "x/9i cmp_tests\n"
+# OBSOLETE gdb_expect {
+# OBSOLETE -re "
+# OBSOLETE .*cmp d1,d2.*
+# OBSOLETE .*cmp d2,a3.*
+# OBSOLETE .*cmp a3,d3.*
+# OBSOLETE .*cmp a3,a2.*
+# OBSOLETE .*cmp 16,d3.*
+# OBSOLETE .*cmp 256,d2.*
+# OBSOLETE .*cmp 131071,d1.*
+# OBSOLETE .*cmp 256,a2.*
+# OBSOLETE .*cmp 131071,a1.*
+# OBSOLETE .*$gdb_prompt $" { pass "cmp tests" }
+# OBSOLETE -re "$gdb_prompt $" { fail "cmp tests" }
+# OBSOLETE timeout { fail "(timeout) cmp tests" }
+# OBSOLETE }
+# OBSOLETE }
+# OBSOLETE
+# OBSOLETE proc extend_tests { } {
+# OBSOLETE global gdb_prompt
+# OBSOLETE global hex
+# OBSOLETE global decimal
+# OBSOLETE
+# OBSOLETE send_gdb "x/5i extend_tests\n"
+# OBSOLETE gdb_expect {
+# OBSOLETE -re "
+# OBSOLETE .*ext d1.*
+# OBSOLETE .*extx d2.*
+# OBSOLETE .*extxu d3.*
+# OBSOLETE .*extxb d2.*
+# OBSOLETE .*extxbu d1.*
+# OBSOLETE .*$gdb_prompt $" { pass "extend tests" }
+# OBSOLETE -re "$gdb_prompt $" { fail "extend tests" }
+# OBSOLETE timeout { fail "(timeout) extend tests" }
+# OBSOLETE }
+# OBSOLETE }
+# OBSOLETE
+# OBSOLETE proc logical_tests { } {
+# OBSOLETE global gdb_prompt
+# OBSOLETE global hex
+# OBSOLETE global decimal
+# OBSOLETE
+# OBSOLETE send_gdb "x/11i logical_tests\n"
+# OBSOLETE gdb_expect {
+# OBSOLETE -re "
+# OBSOLETE .*and d1,d2.*
+# OBSOLETE .*and 127,d2.*
+# OBSOLETE .*and 32767,d3.*
+# OBSOLETE .*and 32767,psw.*
+# OBSOLETE .*or d1,d2.*
+# OBSOLETE .*or 127,d2.*
+# OBSOLETE .*or 32767,d3.*
+# OBSOLETE .*or 32767,psw.*
+# OBSOLETE .*xor d1,d2.*
+# OBSOLETE .*xor 32767,d3.*
+# OBSOLETE .*not d3.*
+# OBSOLETE .*$gdb_prompt $" { pass "logical tests" }
+# OBSOLETE -re "$gdb_prompt $" { fail "logical tests" }
+# OBSOLETE timeout { fail "(timeout) logical tests" }
+# OBSOLETE }
+# OBSOLETE }
+# OBSOLETE
+# OBSOLETE proc mov_tests_1 { } {
+# OBSOLETE global gdb_prompt
+# OBSOLETE global hex
+# OBSOLETE global decimal
+# OBSOLETE
+# OBSOLETE send_gdb "x/12i mov_tests_1\n"
+# OBSOLETE gdb_expect {
+# OBSOLETE -re "
+# OBSOLETE .*mov d1,a2.*
+# OBSOLETE .*mov a2,d1.*
+# OBSOLETE .*mov d1,d2.*
+# OBSOLETE .*mov a2,a1.*
+# OBSOLETE .*mov psw,d3.*
+# OBSOLETE .*mov d2,psw.*
+# OBSOLETE .*mov mdr,d1.*
+# OBSOLETE .*mov d2,mdr.*
+# OBSOLETE .*mov \\(a2\\),d1.*
+# OBSOLETE .*mov \\(8,a2\\),d1.*
+# OBSOLETE .*mov \\(256,a2\\),d1.*
+# OBSOLETE .*mov \\(131071,a2\\),d1.*
+# OBSOLETE .*$gdb_prompt $" { pass "mov1 tests" }
+# OBSOLETE -re "$gdb_prompt $" { fail "mov1 tests" }
+# OBSOLETE timeout { fail "(timeout) mov1 tests" }
+# OBSOLETE }
+# OBSOLETE }
+# OBSOLETE
+# OBSOLETE proc mov_tests_2 { } {
+# OBSOLETE global gdb_prompt
+# OBSOLETE global hex
+# OBSOLETE global decimal
+# OBSOLETE
+# OBSOLETE send_gdb "x/9 mov_tests_2\n"
+# OBSOLETE gdb_expect {
+# OBSOLETE -re "
+# OBSOLETE .*mov \\(d1,a1\\),d2.*
+# OBSOLETE .*mov \\(0x8000.*\\),d1.*
+# OBSOLETE .*mov \\(0x1ffff.*\\),d1.*
+# OBSOLETE .*mov \\(8,a2\\),a1.*
+# OBSOLETE .*mov \\(256,a2\\),a1.*
+# OBSOLETE .*mov \\(131071,a2\\),a1.*
+# OBSOLETE .*mov \\(d1,a1\\),a2.*
+# OBSOLETE .*mov \\(0x8000.*\\),a1.*
+# OBSOLETE .*mov \\(0x1ffff.*\\),a1.*
+# OBSOLETE .*$gdb_prompt $" { pass "mov2 tests" }
+# OBSOLETE -re "$gdb_prompt $" { fail "mov2 tests" }
+# OBSOLETE timeout { fail "(timeout) mov2 tests" }
+# OBSOLETE }
+# OBSOLETE }
+# OBSOLETE
+# OBSOLETE proc mov_tests_3 { } {
+# OBSOLETE global gdb_prompt
+# OBSOLETE global hex
+# OBSOLETE global decimal
+# OBSOLETE
+# OBSOLETE send_gdb "x/10 mov_tests_3\n"
+# OBSOLETE gdb_expect {
+# OBSOLETE -re "
+# OBSOLETE .*mov d1,\\(a2\\).*
+# OBSOLETE .*mov d1,\\(32,a2\\).*
+# OBSOLETE .*mov d1,\\(256,a2\\).*
+# OBSOLETE .*mov d1,\\(131071,a2\\).*
+# OBSOLETE .*mov d1,\\(d2,a2\\).*
+# OBSOLETE .*mov d1,\\(0x80.*\\).*
+# OBSOLETE .*mov d1,\\(0x1ffff.*\\).*
+# OBSOLETE .*mov a1,\\(32,a2\\).*
+# OBSOLETE .*mov a1,\\(256,a2\\).*
+# OBSOLETE .*mov a1,\\(131071,a2\\).*
+# OBSOLETE .*$gdb_prompt $" { pass "mov3 tests" }
+# OBSOLETE -re "$gdb_prompt $" { fail "mov3 tests" }
+# OBSOLETE timeout { fail "(timeout) mov3 tests" }
+# OBSOLETE }
+# OBSOLETE }
+# OBSOLETE
+# OBSOLETE proc mov_tests_4 { } {
+# OBSOLETE global gdb_prompt
+# OBSOLETE global hex
+# OBSOLETE global decimal
+# OBSOLETE
+# OBSOLETE send_gdb "x/8 mov_tests_4\n"
+# OBSOLETE gdb_expect {
+# OBSOLETE -re "
+# OBSOLETE .*mov a1,\\(d2,a2\\).*
+# OBSOLETE .*mov a1,\\(0x80.*\\).*
+# OBSOLETE .*mov a1,\\(0x1ffff.*\\).*
+# OBSOLETE .*mov 8,d1.*
+# OBSOLETE .*mov 256,d1.*
+# OBSOLETE .*mov 131071,d1.*
+# OBSOLETE .*mov 256,a1.*
+# OBSOLETE .*mov 131071,a1.*
+# OBSOLETE .*$gdb_prompt $" { pass "mov4 tests" }
+# OBSOLETE -re "$gdb_prompt $" { fail "mov4 tests" }
+# OBSOLETE timeout { fail "(timeout) mov4 tests" }
+# OBSOLETE }
+# OBSOLETE }
+# OBSOLETE
+# OBSOLETE proc movb_tests { } {
+# OBSOLETE global gdb_prompt
+# OBSOLETE global hex
+# OBSOLETE global decimal
+# OBSOLETE
+# OBSOLETE send_gdb "x/12 movb_tests\n"
+# OBSOLETE gdb_expect {
+# OBSOLETE -re "
+# OBSOLETE .*movb \\(8,a2\\),d1.*
+# OBSOLETE .*movb \\(256,a2\\),d1.*
+# OBSOLETE .*movb \\(131071,a2\\),d1.*
+# OBSOLETE .*movb \\(d2,a2\\),d3.*
+# OBSOLETE .*movb \\(0x1ffff.*\\),d2.*
+# OBSOLETE .*movb d1,\\(a2\\).*
+# OBSOLETE .*movb d1,\\(8,a2\\).*
+# OBSOLETE .*movb d1,\\(256,a2\\).*
+# OBSOLETE .*movb d1,\\(131071,a2\\).*
+# OBSOLETE .*movb d1,\\(d2,a2\\).*
+# OBSOLETE .*movb d1,\\(0x100.*\\).*
+# OBSOLETE .*movb d1,\\(0x1ffff.*\\).*
+# OBSOLETE .*$gdb_prompt $" { pass "movb tests" }
+# OBSOLETE -re "$gdb_prompt $" { fail "movb tests" }
+# OBSOLETE timeout { fail "(timeout) movb tests" }
+# OBSOLETE }
+# OBSOLETE }
+# OBSOLETE
+# OBSOLETE proc movbu_tests { } {
+# OBSOLETE global gdb_prompt
+# OBSOLETE global hex
+# OBSOLETE global decimal
+# OBSOLETE
+# OBSOLETE send_gdb "x/7 movbu_tests\n"
+# OBSOLETE gdb_expect {
+# OBSOLETE -re "
+# OBSOLETE .*movbu \\(a2\\),d1.*
+# OBSOLETE .*movbu \\(8,a2\\),d1.*
+# OBSOLETE .*movbu \\(256,a2\\),d1.*
+# OBSOLETE .*movbu \\(131071,a2\\),d1.*
+# OBSOLETE .*movbu \\(d1,a1\\),d2.*
+# OBSOLETE .*movbu \\(0x8000.*\\),d1.*
+# OBSOLETE .*movbu \\(0x1ffff.*\\),d1.*
+# OBSOLETE .*$gdb_prompt $" { pass "movbu tests" }
+# OBSOLETE -re "$gdb_prompt $" { fail "movbu tests" }
+# OBSOLETE timeout { fail "(timeout) movbu tests" }
+# OBSOLETE }
+# OBSOLETE }
+# OBSOLETE
+# OBSOLETE proc movx_tests { } {
+# OBSOLETE global gdb_prompt
+# OBSOLETE global hex
+# OBSOLETE global decimal
+# OBSOLETE
+# OBSOLETE send_gdb "x/6 movx_tests\n"
+# OBSOLETE gdb_expect {
+# OBSOLETE -re "
+# OBSOLETE .*movx \\(8,a2\\),d1.*
+# OBSOLETE .*movx \\(256,a2\\),d1.*
+# OBSOLETE .*movx \\(131071,a2\\),d1.*
+# OBSOLETE .*movx d1,\\(8,a2\\).*
+# OBSOLETE .*movx d1,\\(256,a2\\).*
+# OBSOLETE .*movx d1,\\(131071,a2\\).*
+# OBSOLETE .*$gdb_prompt $" { pass "movx tests" }
+# OBSOLETE -re "$gdb_prompt $" { fail "movx tests" }
+# OBSOLETE timeout { fail "(timeout) movx tests" }
+# OBSOLETE }
+# OBSOLETE }
+# OBSOLETE
+# OBSOLETE proc muldiv_tests { } {
+# OBSOLETE global gdb_prompt
+# OBSOLETE global hex
+# OBSOLETE global decimal
+# OBSOLETE
+# OBSOLETE send_gdb "x/3 muldiv_tests\n"
+# OBSOLETE gdb_expect {
+# OBSOLETE -re "
+# OBSOLETE .*mul d1,d2.*
+# OBSOLETE .*mulu d2,d3.*
+# OBSOLETE .*divu d3,d2.*
+# OBSOLETE .*$gdb_prompt $" { pass "muldiv tests" }
+# OBSOLETE -re "$gdb_prompt $" { fail "muldiv tests" }
+# OBSOLETE timeout { fail "(timeout) muldiv tests" }
+# OBSOLETE }
+# OBSOLETE }
+# OBSOLETE
+# OBSOLETE proc misc_tests { } {
+# OBSOLETE global gdb_prompt
+# OBSOLETE global hex
+# OBSOLETE global decimal
+# OBSOLETE
+# OBSOLETE send_gdb "x/9 misc_tests\n"
+# OBSOLETE gdb_expect {
+# OBSOLETE -re "
+# OBSOLETE .*jmp 0x\[0-9a-f]+ <main>.*
+# OBSOLETE .*jmp 0x\[0-9a-f]+ <start>.*
+# OBSOLETE .*jmp \\(a2\\).*
+# OBSOLETE .*jsr 0x\[0-9a-f]+ <main>.*
+# OBSOLETE .*jsr 0x\[0-9a-f]+ <start>.*
+# OBSOLETE .*jsr \\(a2\\).*
+# OBSOLETE .*rts.*
+# OBSOLETE .*rti.*
+# OBSOLETE .*nop.*
+# OBSOLETE .*$gdb_prompt $" { pass "misc tests" }
+# OBSOLETE -re "$gdb_prompt $" { fail "misc tests" }
+# OBSOLETE timeout { fail "(timeout) misc tests" }
+# OBSOLETE }
+# OBSOLETE }
+# OBSOLETE
+# OBSOLETE proc shift_tests { } {
+# OBSOLETE global gdb_prompt
+# OBSOLETE global hex
+# OBSOLETE global decimal
+# OBSOLETE
+# OBSOLETE send_gdb "x/4i shift_tests\n"
+# OBSOLETE gdb_expect {
+# OBSOLETE -re "
+# OBSOLETE .*asr d2.*
+# OBSOLETE .*lsr d3.*
+# OBSOLETE .*ror d1.*
+# OBSOLETE .*rol d2.*
+# OBSOLETE .*$gdb_prompt $" { pass "shift tests" }
+# OBSOLETE -re "$gdb_prompt $" { fail "shift tests" }
+# OBSOLETE timeout { fail "(timeout) shift tests" }
+# OBSOLETE }
+# OBSOLETE }
+# OBSOLETE
+# OBSOLETE proc sub_tests { } {
+# OBSOLETE global gdb_prompt
+# OBSOLETE global hex
+# OBSOLETE global decimal
+# OBSOLETE
+# OBSOLETE send_gdb "x/9i sub_tests\n"
+# OBSOLETE gdb_expect {
+# OBSOLETE -re "
+# OBSOLETE .*sub d1,d2.*
+# OBSOLETE .*sub d2,a3.*
+# OBSOLETE .*sub a3,d3.*
+# OBSOLETE .*sub a3,a2.*
+# OBSOLETE .*sub 32767,d2.*
+# OBSOLETE .*sub 131071,d2.*
+# OBSOLETE .*sub 32767,a2.*
+# OBSOLETE .*sub 131071,a2.*
+# OBSOLETE .*subc d1,d2.*
+# OBSOLETE .*$gdb_prompt $" { pass "sub tests" }
+# OBSOLETE -re "$gdb_prompt $" { fail "sub tests" }
+# OBSOLETE timeout { fail "(timeout) sub tests" }
+# OBSOLETE }
+# OBSOLETE }
+# OBSOLETE
+# OBSOLETE # Start with a fresh gdb.
+# OBSOLETE
+# OBSOLETE gdb_exit
+# OBSOLETE gdb_start
+# OBSOLETE gdb_reinitialize_dir $srcdir/$subdir
+# OBSOLETE gdb_load $binfile
+# OBSOLETE
+# OBSOLETE add_tests
+# OBSOLETE bcc_tests
+# OBSOLETE bccx_tests
+# OBSOLETE bit_tests
+# OBSOLETE cmp_tests
+# OBSOLETE extend_tests
+# OBSOLETE logical_tests
+# OBSOLETE mov_tests_1
+# OBSOLETE mov_tests_2
+# OBSOLETE mov_tests_3
+# OBSOLETE mov_tests_4
+# OBSOLETE movb_tests
+# OBSOLETE movbu_tests
+# OBSOLETE movx_tests
+# OBSOLETE muldiv_tests
+# OBSOLETE misc_tests
+# OBSOLETE shift_tests
+# OBSOLETE sub_tests