#ifndef TM_MIPS_H
#define TM_MIPS_H 1
#define GDB_MULTI_ARCH 1
struct frame_info;
struct symbol;
struct type;
struct value;
#include <bfd.h>
#include "coff/sym.h"
#include "coff/symconst.h"
#if !defined (MIPS_EABI)
#define MIPS_EABI 0
#endif
#if !defined (GDB_TARGET_MASK_DISAS_PC)
#define GDB_TARGET_MASK_DISAS_PC(addr) UNMAKE_MIPS16_ADDR(addr)
#endif
#if !defined (GDB_TARGET_UNMASK_DISAS_PC)
#define GDB_TARGET_UNMASK_DISAS_PC(addr) MAKE_MIPS16_ADDR(addr)
#endif
#define DEFAULT_MIPS_TYPE "generic"
#define ADDR_BITS_REMOVE(addr) mips_addr_bits_remove(addr)
CORE_ADDR mips_addr_bits_remove (CORE_ADDR addr);
#define TARGET_READ_SP() ADDR_BITS_REMOVE (read_register (SP_REGNUM))
#define FUNCTION_START_OFFSET 0
extern int mips_step_skips_delay (CORE_ADDR);
#define STEP_SKIPS_DELAY_P (1)
#define STEP_SKIPS_DELAY(pc) (mips_step_skips_delay (pc))
extern int in_sigtramp (CORE_ADDR, char *);
#define IN_SIGTRAMP(pc, name) in_sigtramp(pc, name)
#define REGISTER_SIZE 4
#ifndef MIPS_REGSIZE
#define MIPS_REGSIZE 4
#endif
#ifndef NUM_REGS
#define NUM_REGS 90
#endif
extern char *mips_register_name (int regnr);
#define REGISTER_NAME(i) mips_register_name (i)
#ifndef MIPS_REGISTER_NAMES
#define MIPS_REGISTER_NAMES \
{ "zero", "at", "v0", "v1", "a0", "a1", "a2", "a3", \
"t0", "t1", "t2", "t3", "t4", "t5", "t6", "t7", \
"s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", \
"t8", "t9", "k0", "k1", "gp", "sp", "s8", "ra", \
"sr", "lo", "hi", "bad", "cause","pc", \
"f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7", \
"f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15", \
"f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",\
"f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",\
"fsr", "fir", "fp", "", \
"", "", "", "", "", "", "", "", \
"", "", "", "", "", "", "", "", \
}
#endif
#define ZERO_REGNUM 0
#define V0_REGNUM 2
#define A0_REGNUM 4
#if MIPS_EABI
#define MIPS_LAST_ARG_REGNUM 11
#else
#define MIPS_LAST_ARG_REGNUM 7
#endif
#define T9_REGNUM 25
#define SP_REGNUM 29
#define RA_REGNUM 31
#define PS_REGNUM 32
#define HI_REGNUM 34
#define LO_REGNUM 33
#define BADVADDR_REGNUM 35
#define CAUSE_REGNUM 36
#define PC_REGNUM 37
#define FP0_REGNUM 38
#define FPA0_REGNUM (FP0_REGNUM+12)
#if MIPS_EABI
#define MIPS_LAST_FP_ARG_REGNUM (FP0_REGNUM+19)
#else
#define MIPS_LAST_FP_ARG_REGNUM (FP0_REGNUM+15)
#endif
#define FCRCS_REGNUM 70
#define FCRIR_REGNUM 71
#define FP_REGNUM 72
#define UNUSED_REGNUM 73
#define FIRST_EMBED_REGNUM 74
#define PRID_REGNUM 89
#define LAST_EMBED_REGNUM 89
#define DO_REGISTERS_INFO(_regnum, fp) mips_do_registers_info(_regnum, fp)
extern void mips_do_registers_info (int, int);
#define REGISTER_BYTES (NUM_REGS*MIPS_REGSIZE)
#define REGISTER_BYTE(N) ((N) * MIPS_REGSIZE)
extern int mips_register_raw_size (int reg_nr);
#define REGISTER_RAW_SIZE(N) (mips_register_raw_size ((N)))
extern int mips_register_convertible (int reg_nr);
#define REGISTER_CONVERTIBLE(N) (mips_register_convertible ((N)))
void mips_register_convert_to_virtual (int reg_nr, struct type *virtual_type,
char *raw_buf, char *virt_buf);
#define REGISTER_CONVERT_TO_VIRTUAL(N,VIRTUAL_TYPE,RAW_BUF,VIRT_BUF) \
mips_register_convert_to_virtual (N,VIRTUAL_TYPE,RAW_BUF,VIRT_BUF)
void mips_register_convert_to_raw (struct type *virtual_type, int reg_nr,
char *virt_buf, char *raw_buf);
#define REGISTER_CONVERT_TO_RAW(VIRTUAL_TYPE,N,VIRT_BUF,RAW_BUF) \
mips_register_convert_to_raw (VIRTUAL_TYPE,N,VIRT_BUF,RAW_BUF)
#define REGISTER_VIRTUAL_SIZE(N) TYPE_LENGTH (REGISTER_VIRTUAL_TYPE (N))
#define MAX_REGISTER_RAW_SIZE 8
#define MAX_REGISTER_VIRTUAL_SIZE 8
#ifndef REGISTER_VIRTUAL_TYPE
#define REGISTER_VIRTUAL_TYPE(N) \
(((N) >= FP0_REGNUM && (N) < FP0_REGNUM+32) ? builtin_type_float \
: ((N) == 32 ) ? builtin_type_uint32 \
: ((N) >= 70 && (N) <= 89) ? builtin_type_uint32 \
: builtin_type_int)
#endif
#define REGISTER_CONVERT_TO_TYPE(n, type, buffer) \
do {if (TARGET_BYTE_ORDER == BIG_ENDIAN \
&& REGISTER_RAW_SIZE (n) == 4 \
&& (n) >= FP0_REGNUM && (n) < FP0_REGNUM + 32 \
&& TYPE_CODE(type) == TYPE_CODE_FLT \
&& TYPE_LENGTH(type) == 8) { \
char __temp[4]; \
memcpy (__temp, ((char *)(buffer))+4, 4); \
memcpy (((char *)(buffer))+4, (buffer), 4); \
memcpy (((char *)(buffer)), __temp, 4); }} while (0)
#define REGISTER_CONVERT_FROM_TYPE(n, type, buffer) \
do {if (TARGET_BYTE_ORDER == BIG_ENDIAN \
&& REGISTER_RAW_SIZE (n) == 4 \
&& (n) >= FP0_REGNUM && (n) < FP0_REGNUM + 32 \
&& TYPE_CODE(type) == TYPE_CODE_FLT \
&& TYPE_LENGTH(type) == 8) { \
char __temp[4]; \
memcpy (__temp, ((char *)(buffer))+4, 4); \
memcpy (((char *)(buffer))+4, (buffer), 4); \
memcpy (((char *)(buffer)), __temp, 4); }} while (0)
#define STORE_STRUCT_RETURN(addr, sp)
#define EXTRACT_RETURN_VALUE(TYPE,REGBUF,VALBUF) \
mips_extract_return_value(TYPE, REGBUF, VALBUF)
extern void mips_extract_return_value (struct type *, char[], char *);
#define STORE_RETURN_VALUE(TYPE,VALBUF) \
mips_store_return_value(TYPE, VALBUF)
extern void mips_store_return_value (struct type *, char *);
#define EXTRACT_STRUCT_VALUE_ADDRESS(REGBUF) \
(extract_address (REGBUF + REGISTER_BYTE (V0_REGNUM), \
REGISTER_RAW_SIZE (V0_REGNUM)))
extern use_struct_convention_fn mips_use_struct_convention;
#define USE_STRUCT_CONVENTION(gcc_p, type) mips_use_struct_convention (gcc_p, type)
#define FRAME_CHAIN(thisframe) (CORE_ADDR) mips_frame_chain (thisframe)
extern CORE_ADDR mips_frame_chain (struct frame_info *);
#define FRAMELESS_FUNCTION_INVOCATION(FI) (0)
#define FRAME_SAVED_PC(FRAME) (mips_frame_saved_pc(FRAME))
extern CORE_ADDR mips_frame_saved_pc (struct frame_info *);
#define FRAME_ARGS_ADDRESS(fi) (fi)->frame
#define FRAME_LOCALS_ADDRESS(fi) (fi)->frame
#define FRAME_NUM_ARGS(fi) (mips_frame_num_args(fi))
extern int mips_frame_num_args (struct frame_info *);
#define FRAME_ARGS_SKIP 0
#define FRAME_INIT_SAVED_REGS(frame_info) \
do { \
if ((frame_info)->saved_regs == NULL) \
mips_find_saved_regs (frame_info); \
(frame_info)->saved_regs[SP_REGNUM] = (frame_info)->frame; \
} while (0)
extern void mips_find_saved_regs (struct frame_info *);
extern CORE_ADDR mips_push_arguments (int, struct value **, CORE_ADDR, int,
CORE_ADDR);
#define PUSH_ARGUMENTS(nargs, args, sp, struct_return, struct_addr) \
(mips_push_arguments((nargs), (args), (sp), (struct_return), (struct_addr)))
extern CORE_ADDR mips_push_return_address (CORE_ADDR pc, CORE_ADDR sp);
#define PUSH_RETURN_ADDRESS(PC, SP) (mips_push_return_address ((PC), (SP)))
#define PUSH_DUMMY_FRAME mips_push_dummy_frame()
extern void mips_push_dummy_frame (void);
#define POP_FRAME mips_pop_frame()
extern void mips_pop_frame (void);
#define CALL_DUMMY_START_OFFSET (0)
#define CALL_DUMMY_BREAKPOINT_OFFSET (0)
#define FIX_CALL_DUMMY(dummyname, start_sp, fun, nargs, args, rettype, gcc_p) \
write_register(T9_REGNUM, fun)
#define CALL_DUMMY_LOCATION AT_ENTRY_POINT
#define CALL_DUMMY_ADDRESS() (mips_call_dummy_address ())
extern CORE_ADDR mips_call_dummy_address (void);
#define INIT_FRAME_PC(fromleaf, prev)
#define INIT_FRAME_PC_FIRST(fromleaf, prev) \
mips_init_frame_pc_first(fromleaf, prev)
extern void mips_init_frame_pc_first (int, struct frame_info *);
#define MIPS_EFI_SYMBOL_NAME "__GDB_EFI_INFO__"
extern void ecoff_relocate_efi (struct symbol *, CORE_ADDR);
typedef struct mips_extra_func_info
{
long numargs;
bfd_vma high_addr;
long frame_adjust;
PDR pdr;
}
*mips_extra_func_info_t;
extern void mips_init_extra_frame_info (int fromleaf, struct frame_info *);
#define INIT_EXTRA_FRAME_INFO(fromleaf, fci) \
mips_init_extra_frame_info(fromleaf, fci)
extern void mips_print_extra_frame_info (struct frame_info *frame);
#define PRINT_EXTRA_FRAME_INFO(fi) \
mips_print_extra_frame_info (fi)
#define SETUP_ARBITRARY_FRAME(argc, argv) setup_arbitrary_frame (argc, argv)
extern struct frame_info *setup_arbitrary_frame (int, CORE_ADDR *);
#define STAB_REG_TO_REGNUM(num) ((num) < 32 ? (num) : (num)+FP0_REGNUM-38)
#define ECOFF_REG_TO_REGNUM(num) ((num) < 32 ? (num) : (num)+FP0_REGNUM-32)
#define TM_PRINT_INSN_MACH 0
extern CORE_ADDR sigtramp_address, sigtramp_end;
extern void fixup_sigtramp (void);
extern char *mips_read_processor_type (void);
#define IN_SOLIB_CALL_TRAMPOLINE(pc, name) mips_in_call_stub (pc, name)
#define IN_SOLIB_RETURN_TRAMPOLINE(pc, name) mips_in_return_stub (pc, name)
#define SKIP_TRAMPOLINE_CODE(pc) mips_skip_stub (pc)
#define IGNORE_HELPER_CALL(pc) mips_ignore_helper (pc)
extern int mips_in_call_stub (CORE_ADDR pc, char *name);
extern int mips_in_return_stub (CORE_ADDR pc, char *name);
extern CORE_ADDR mips_skip_stub (CORE_ADDR pc);
extern int mips_ignore_helper (CORE_ADDR pc);
#ifndef TARGET_MIPS
#define TARGET_MIPS
#endif
#define MIPS_INSTLEN 4
#define MIPS16_INSTLEN 2
#define MIPS_NUMREGS 32
typedef unsigned long t_inst;
#define IS_MIPS16_ADDR(addr) ((addr) & 1)
#define MAKE_MIPS16_ADDR(addr) ((addr) | 1)
#define UNMAKE_MIPS16_ADDR(addr) ((addr) & ~1)
#endif
#define ELF_MAKE_MSYMBOL_SPECIAL(sym,msym) \
{ \
if (((elf_symbol_type *)(sym))->internal_elf_sym.st_other == STO_MIPS16) { \
MSYMBOL_INFO (msym) = (char *) (((long) MSYMBOL_INFO (msym)) | 0x80000000); \
SYMBOL_VALUE_ADDRESS (msym) |= 1; \
} \
}
#define MSYMBOL_IS_SPECIAL(msym) \
(((long) MSYMBOL_INFO (msym) & 0x80000000) != 0)
#define MSYMBOL_SIZE(msym) \
((long) MSYMBOL_INFO (msym) & 0x7fffffff)
extern void mips_set_processor_type_command (char *, int);
#define POINTER_TO_ADDRESS(TYPE,BUF) (signed_pointer_to_address (TYPE, BUF))
#define ADDRESS_TO_POINTER(TYPE,BUF,ADDR) (address_to_signed_pointer (TYPE, BUF, ADDR))