X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmini%2Fmini-mips.h;h=7476469c2711742fead279f319b7431504e019cb;hb=a1aa0ca2cba9fd0be685807067e6da8c2acaf69a;hp=f8ac1552eb58118887ff2046aaa913c2fa5e18c4;hpb=3b069656f52c90287a8442070d080950a49bf300;p=mono.git diff --git a/mono/mini/mini-mips.h b/mono/mini/mini-mips.h index f8ac1552eb5..7476469c271 100644 --- a/mono/mini/mini-mips.h +++ b/mono/mini/mini-mips.h @@ -94,7 +94,7 @@ typedef gdouble mips_freg; #define mips_temp mips_t8 -#define MONO_ARCH_CALLEE_REGS (MIPS_T_REGS | MIPS_V_REGS) +#define MONO_ARCH_CALLEE_REGS (MIPS_T_REGS | MIPS_V_REGS | MIPS_A_REGS) #define MONO_ARCH_CALLEE_SAVED_REGS MIPS_S_REGS #define MIPS_ARG_REGS MIPS_A_REGS @@ -199,13 +199,15 @@ void mips_patch (guint32 *code, guint32 target); #define MIPS_LMF_MAGIC1 0xa5a5a5a5 #define MIPS_LMF_MAGIC2 0xc3c3c3c3 +/* Registers saved in lmf->iregs */ +#define MIPS_LMF_IREGMASK (0xffffffff & ~((1 << mips_zero) | (1 << mips_at) | MONO_ARCH_CALLEE_REGS)) + struct MonoLMF { gpointer previous_lmf; gpointer lmf_addr; MonoMethod *method; - mgreg_t ebp; gpointer eip; - mgreg_t iregs [MONO_SAVED_GREGS]; + mgreg_t iregs [MONO_SAVED_GREGS]; mips_freg fregs [MONO_SAVED_FREGS]; gulong magic; }; @@ -219,6 +221,8 @@ typedef struct MonoCompileArch { guint spillvar_offset_float; guint tracing_offset; guint long_branch; + gboolean omit_fp; + gboolean omit_fp_computed; } MonoCompileArch; #if SIZEOF_REGISTER == 4 @@ -256,8 +260,8 @@ typedef struct MonoCompileArch { #define MONO_ARCH_HAVE_IMT 1 #define MONO_ARCH_IMT_REG mips_t0 -#define MONO_ARCH_VTABLE_REG mips_t0 -#define MONO_ARCH_RGCTX_REG mips_t0 +#define MONO_ARCH_VTABLE_REG mips_a0 +#define MONO_ARCH_RGCTX_REG MONO_ARCH_IMT_REG #define MONO_ARCH_HAVE_DECOMPOSE_OPTS 1 #define MONO_ARCH_HAVE_DECOMPOSE_LONG_OPTS 1 @@ -268,10 +272,7 @@ typedef struct MonoCompileArch { #define MONO_ARCH_HAVE_XP_UNWIND 1 #define MONO_ARCH_HAVE_CREATE_DELEGATE_TRAMPOLINE 1 #define MONO_ARCH_HAVE_SETUP_RESUME_FROM_SIGNAL_HANDLER_CTX 1 - -/* XXX - a mystery, but it works */ -#define MONO_GET_CONTEXT \ - void *ctx = (void *)(((int)context)+24); +#define MONO_ARCH_GSHARED_SUPPORTED 1 /* set the next to 0 once inssel-mips.brg is updated */ #define MIPS_PASS_STRUCTS_BY_VALUE 1 @@ -321,22 +322,12 @@ typedef struct { } MonoMipsStackFrame; #define MONO_INIT_CONTEXT_FROM_FUNC(ctx,func) do { \ - guint32 sp, ra; \ - guint32 *code = (guint32 *)(void *)func; \ - short imm; \ - memset ((ctx), 0, sizeof (*(ctx))); \ - __asm__ volatile("addu %0,$0,$29" : "=r" (sp)); \ - /* Look for adjustment of sp */ \ - while ((*code & 0xffff0000) != 0x27bd0000) \ - ++code; \ - imm = (short) (*code & 0xffff); \ - 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)); \ + MONO_CONTEXT_SET_BP ((ctx), __builtin_frame_address (0)); \ + MONO_CONTEXT_SET_SP ((ctx), __builtin_frame_address (0)); \ + MONO_CONTEXT_SET_IP ((ctx), (func)); \ } while (0) -#define MONO_ARCH_INIT_TOP_LMF_ENTRY(lmf) do { (lmf)->ebp = -1; } while (0) +#define MONO_ARCH_INIT_TOP_LMF_ENTRY(lmf) /* re-attaches with gdb - sometimes causes executable to hang */ #undef HAVE_BACKTRACE_SYMBOLS