X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fconfig%2Fm68k%2Ftm-m68k.h;h=9cbb41f0801633a1a7d44950ddec90361abfd559;hb=b83266a0e1813b7f4891d5d6b0ed6b7302a3fe98;hp=4d284b52f4c363820400b201e5ed5fd0e55840e3;hpb=72ae15f6b0b419e5bb334a232f00f5710e8597ba;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/config/m68k/tm-m68k.h b/gdb/config/m68k/tm-m68k.h index 4d284b52f4..9cbb41f080 100644 --- a/gdb/config/m68k/tm-m68k.h +++ b/gdb/config/m68k/tm-m68k.h @@ -33,9 +33,9 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ to reach some "real" code. */ #if !defined(SKIP_PROLOGUE) -#define SKIP_PROLOGUE(ip) {(ip) = m68k_skip_prologue(ip);} -extern CORE_ADDR m68k_skip_prologue PARAMS ((CORE_ADDR ip)); +#define SKIP_PROLOGUE(ip) (m68k_skip_prologue (ip)) #endif +extern CORE_ADDR m68k_skip_prologue PARAMS ((CORE_ADDR ip)); /* Immediately after a function call, return the saved pc. Can't always go through the frames for this because on some machines @@ -44,16 +44,22 @@ extern CORE_ADDR m68k_skip_prologue PARAMS ((CORE_ADDR ip)); #ifdef __STDC__ struct frame_info; +struct frame_saved_regs; #endif extern CORE_ADDR m68k_saved_pc_after_call PARAMS ((struct frame_info *)); +extern void m68k_find_saved_regs PARAMS ((struct frame_info *, struct frame_saved_regs *)); #define SAVED_PC_AFTER_CALL(frame) \ m68k_saved_pc_after_call(frame) /* Stack grows downward. */ -#define INNER_THAN < +#define INNER_THAN(lhs,rhs) ((lhs) < (rhs)) + +/* Stack must be kept short aligned when doing function calls. */ + +#define STACK_ALIGN(ADDR) (((ADDR) + 1) & ~1) /* Sequence of bytes for breakpoint instruction. This is a TRAP instruction. The last 4 bits (0xf below) is the @@ -85,12 +91,6 @@ extern CORE_ADDR m68k_saved_pc_after_call PARAMS ((struct frame_info *)); #define DECR_PC_AFTER_BREAK 2 #endif -/* Nonzero if instruction at PC is a return instruction. */ -/* Allow any of the return instructions, including a trapv and a return - from interupt. */ - -#define ABOUT_TO_RETURN(pc) ((read_memory_integer (pc, 2) & ~0x3) == 0x4e74) - /* Say how long (ordinary) registers are. This is a piece of bogosity used in push_word and a few other places; REGISTER_RAW_SIZE is the real way to know how big a register is. */ @@ -104,6 +104,8 @@ extern CORE_ADDR m68k_saved_pc_after_call PARAMS ((struct frame_info *)); #define NUM_REGS 29 #endif +#define NUM_FREGS (NUM_REGS-24) + #ifndef REGISTER_BYTES_OK #define REGISTER_BYTES_OK(b) \ ((b) == REGISTER_BYTES_FP \ @@ -155,30 +157,36 @@ extern CORE_ADDR m68k_saved_pc_after_call PARAMS ((struct frame_info *)); to virtual format with type TYPE in buffer TO. */ #define REGISTER_CONVERT_TO_VIRTUAL(REGNUM,TYPE,FROM,TO) \ -{ \ - double dbl_tmp_val; \ - floatformat_to_double (&floatformat_m68881_ext, (FROM), &dbl_tmp_val); \ - store_floating ((TO), TYPE_LENGTH (TYPE), dbl_tmp_val); \ -} +do \ + { \ + DOUBLEST dbl_tmp_val; \ + floatformat_to_doublest (&floatformat_m68881_ext, (FROM), &dbl_tmp_val); \ + store_floating ((TO), TYPE_LENGTH (TYPE), dbl_tmp_val); \ + } while (0) /* Convert data from virtual format with type TYPE in buffer FROM to raw format for register REGNUM in buffer TO. */ #define REGISTER_CONVERT_TO_RAW(TYPE,REGNUM,FROM,TO) \ -{ \ - double dbl_tmp_val = extract_floating ((FROM), TYPE_LENGTH (TYPE)); \ - floatformat_from_double (&floatformat_m68881_ext, &dbl_tmp_val, (TO)); \ -} - -/* Return the GDB type object for the "standard" data type - of data in register N. */ -/* Note, for registers which contain addresses return - pointer to void, not pointer to char, because we don't - want to attempt to print the string after printing the address. */ +do \ + { \ + DOUBLEST dbl_tmp_val; \ + dbl_tmp_val = extract_floating ((FROM), TYPE_LENGTH (TYPE)); \ + floatformat_from_doublest (&floatformat_m68881_ext, &dbl_tmp_val, (TO)); \ + } while (0) + +/* Return the GDB type object for the "standard" data type of data + in register N. This should be int for D0-D7, double for FP0-FP7, + and void pointer for all others (A0-A7, PC, SR, FPCONTROL etc). + Note, for registers which contain addresses return pointer to void, + not pointer to char, because we don't want to attempt to print + the string after printing the address. */ + #define REGISTER_VIRTUAL_TYPE(N) \ - (((unsigned)(N) - FP0_REGNUM) < 8 ? builtin_type_double : \ - (N) == PC_REGNUM || (N) == FP_REGNUM || (N) == SP_REGNUM ? \ - lookup_pointer_type (builtin_type_void) : builtin_type_int) + ((unsigned) (N) >= FPC_REGNUM ? lookup_pointer_type (builtin_type_void) : \ + (unsigned) (N) >= FP0_REGNUM ? builtin_type_double : \ + (unsigned) (N) >= A0_REGNUM ? lookup_pointer_type (builtin_type_void) : \ + builtin_type_int) /* Initializer for an array of names of registers. Entries beyond the first NUM_REGS are ignored. */ @@ -381,3 +389,5 @@ extern void m68k_pop_frame PARAMS ((void)); /* Offset from SP to first arg on stack at first instruction of a function */ #define SP_ARG0 (1 * 4) + +#define TARGET_M68K