2008-02-08 Zoltan Varga <vargaz@gmail.com>
[mono.git] / mono / mini / mini-mips.h
index e79ee24a2d5fa6e4de537ab5cdcea7f4309edb84..e375ee8a838a20bb9fb603e28ede25419d72bc7f 100644 (file)
@@ -80,7 +80,6 @@
 #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;
@@ -112,7 +114,7 @@ struct MonoLMF {
        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
@@ -169,12 +171,12 @@ typedef struct MonoCompileArch {
 #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 {
@@ -225,9 +227,10 @@ 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
@@ -235,6 +238,7 @@ typedef struct {
 /* 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
@@ -265,9 +269,9 @@ typedef struct {
                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; \
@@ -282,9 +286,9 @@ typedef struct {
                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; \