#define MONO_ARCH_FPSTACK_SIZE 0
/* Parameters used by the register allocator */
-#define MONO_ARCH_HAS_XP_LOCAL_REGALLOC
/* On Mips, for regpairs, the lower-numbered reg is most significant
* This is true in both big and little endian
void mips_patch (guint32 *code, guint32 target);
+#define MIPS_LMF_MAGIC1 0xa5a5a5a5
+#define MIPS_LMF_MAGIC2 0xc3c3c3c3
+
struct MonoLMF {
gpointer previous_lmf;
gpointer lmf_addr;
gulong eip;
gulong iregs [MONO_SAVED_GREGS];
gfloat fregs [MONO_SAVED_FREGS];
- gulong pad;
+ gulong magic;
};
/* we define our own structure and we'll copy the data
#define MIPS_NUM_REG_FPARGS (MIPS_LAST_FPARG_REG-MIPS_FIRST_FPARG_REG+1)
/* we have the stack pointer, not the base pointer in sigcontext */
-#define MONO_CONTEXT_SET_IP(ctx,ip) do { (ctx)->sc_pc = (int)ip; } while (0);
-#define MONO_CONTEXT_SET_BP(ctx,bp) do { (ctx)->sc_regs[mips_sp] = (int)bp; } while (0);
-#define MONO_CONTEXT_SET_SP(ctx,sp) do { (ctx)->sc_regs[mips_sp] = (int)sp; } while (0);
+#define MONO_CONTEXT_SET_IP(ctx,ip) do { (ctx)->sc_pc = (int)(ip); } while (0);
+#define MONO_CONTEXT_SET_BP(ctx,bp) do { (ctx)->sc_regs[mips_fp] = (int)(bp); } while (0);
+#define MONO_CONTEXT_SET_SP(ctx,sp) do { (ctx)->sc_regs[mips_sp] = (int)(sp); } while (0);
#define MONO_CONTEXT_GET_IP(ctx) ((gpointer)((ctx)->sc_pc))
-#define MONO_CONTEXT_GET_BP(ctx) ((gpointer)((ctx)->sc_regs[mips_sp]))
+#define MONO_CONTEXT_GET_BP(ctx) ((gpointer)((ctx)->sc_regs[mips_fp]))
#define MONO_CONTEXT_GET_SP(ctx) ((gpointer)((ctx)->sc_regs[mips_sp]))
typedef struct {
MONO_CONTEXT_SET_BP ((ctx), sp + (-imm)); \
ra = *(guint32 *)(sp + (-imm) + MIPS_RET_ADDR_OFFSET); \
MONO_CONTEXT_SET_IP ((ctx),ra); \
+ MONO_CONTEXT_SET_SP ((ctx), MONO_CONTEXT_GET_BP (ctx)); \
} while (0)
-#if 1
+#if 0
#define mono_find_jit_info mono_arch_find_jit_info
#define CUSTOM_STACK_WALK
#endif
/* re-attaches with gdb - sometimes causes executable to hang */
#undef HAVE_BACKTRACE_SYMBOLS
+#undef DEBUG_EXCEPTIONS
#undef CUSTOM_EXCEPTION_HANDLING
#define MONO_ZERO_REG mips_zero
MonoInst *target_label; \
target_label = mono_mempool_alloc0 ((cfg)->mempool, sizeof (MonoInst)); \
target_label->opcode = OP_LABEL; \
- target_label->next = (targetbb)->code; \
+ MONO_INST_LIST_ADD (&target_label->node, \
+ &(targetbb)->ins_list); \
target_label->inst_c0 = (targetbb)->native_offset; \
- (targetbb)->code = target_label; \
inst = mono_mempool_alloc0 ((cfg)->mempool, sizeof (MonoInst)); \
inst->opcode = op; \
(inst)->sreg1 = sr1; \
MonoInst *target_label; \
target_label = mono_mempool_alloc0 ((cfg)->mempool, sizeof (MonoInst)); \
target_label->opcode = OP_LABEL; \
- target_label->next = (targetbb)->code; \
+ MONO_INST_LIST_ADD (&target_label->node, \
+ &(targetbb)->ins_list); \
target_label->inst_c0 = (targetbb)->native_offset; \
- (targetbb)->code = target_label; \
inst = mono_mempool_alloc0 ((cfg)->mempool, sizeof (MonoInst)); \
inst->opcode = op; \
(inst)->sreg1 = sr1; \