2010-05-30 Zoltan Varga <vargaz@gmail.com>
[mono.git] / mono / mini / mini-ia64.h
index 392d19985797340fd07d007e4a21fd65285ec8ac..56d142d4bbe877ab9ed40d8d844b2a77ee6be4c6 100644 (file)
@@ -3,11 +3,10 @@
 
 #include <glib.h>
 
-#define UNW_LOCAL_ONLY
-#include <libunwind.h>
-
 #include <mono/arch/ia64/ia64-codegen.h>
 
+#define MONO_ARCH_CPU_SPEC ia64_desc
+
 /* FIXME: regset -> 128 bits ! */
 
 #define MONO_MAX_IREGS 128
 
 /* Parameters used by the register allocator */
 
-#define MONO_ARCH_HAS_XP_LOCAL_REGALLOC
-
 /* r8..r11, r14..r29 */
-#define MONO_ARCH_CALLEE_REGS (0x700UL | 0x3fffc000UL)
+#define MONO_ARCH_CALLEE_REGS ((regmask_t)(0xf00UL) | (regmask_t)(0x3fffc000UL))
 
-/* f6..f15, f33..f127 */
+/* f6..f15, f34..f127 */
 /* FIXME: Use the upper 64 bits as well */
-#define MONO_ARCH_CALLEE_FREGS (0xfffffffe00000000UL | (0x3ffUL << 6))
+#define MONO_ARCH_CALLEE_FREGS ((regmask_t)(0xfffffffc00000000UL) | ((regmask_t)(0x3ffUL) << 6))
 
 #define MONO_ARCH_CALLEE_SAVED_REGS ~(MONO_ARCH_CALLEE_REGS)
 
@@ -37,6 +34,8 @@
 #define MONO_ARCH_INST_IS_REGPAIR(desc) FALSE
 #define MONO_ARCH_INST_REGPAIR_REG2(desc,hreg1) (-1)
 
+#define MONO_ARCH_IS_GLOBAL_IREG(reg) (is_hard_ireg (reg) && ((reg) >= cfg->arch.reg_local0) && ((reg) < cfg->arch.reg_out0))
+
 #define MONO_ARCH_FRAME_ALIGNMENT 16
 
 #define MONO_ARCH_CODE_ALIGNMENT 16
 #define MONO_ARCH_RETREG1 IA64_R8
 #define MONO_ARCH_FRETREG1 8
 
+#define MONO_ARCH_SIGNAL_STACK_SIZE SIGSTKSZ
+
 struct MonoLMF {
        guint64    ebp;
 };
 
 typedef struct MonoContext {
        unw_cursor_t cursor;
+       /* Whenever the ip in 'cursor' points to the ip where the exception happened */
+       /* This is true for the initial context for exceptions thrown from signal handlers */
+       gboolean precise_ip;
 } MonoContext;
 
 typedef struct MonoCompileArch {
@@ -63,10 +67,11 @@ typedef struct MonoCompileArch {
        gint32 reg_saved_ar_pfs;
        gint32 reg_saved_b0;
        gint32 reg_saved_sp;
+       gint32 reg_fp;
        gint32 reg_saved_return_val;
        guint32 prolog_end_offset, epilog_begin_offset, epilog_end_offset;
        void *ret_var_addr_local;
-       unw_dyn_region_info_t *r_pro;
+       unw_dyn_region_info_t *r_pro, *r_epilog;
        void *last_bb;
        Ia64CodegenState code;
        gboolean omit_fp;
@@ -82,8 +87,12 @@ mono_ia64_context_get_ip (MonoContext *ctx)
        err = unw_get_reg (&ctx->cursor, UNW_IA64_IP, &ip);
        g_assert (err == 0);
 
-       /* Subtrack 1 so ip points into the actual instruction */
-       return ip - 1;
+       if (ctx->precise_ip) {
+               return ip;
+       } else {
+               /* Subtrack 1 so ip points into the actual instruction */
+               return ip - 1;
+       }
 }
 
 static inline unw_word_t
@@ -147,18 +156,22 @@ mono_ia64_context_get_fp (MonoContext *ctx)
        g_assert (res == 0); \
 } while (0)
 
+/* This is ia64 only */
+#define MONO_CONTEXT_SET_FUNC(ctx, func) MONO_CONTEXT_SET_IP ((ctx), ((gpointer*)(func))[0])
+
 #define MONO_ARCH_CONTEXT_DEF unw_context_t unw_ctx;
 
 #define MONO_ARCH_USE_SIGACTION 1
 
 #ifdef HAVE_WORKING_SIGALTSTACK
-/* FIXME: */
-//#define MONO_ARCH_SIGSEGV_ON_ALTSTACK
+/*#define MONO_ARCH_SIGSEGV_ON_ALTSTACK*/
 #endif
 
+unw_dyn_region_info_t* mono_ia64_create_unwind_region (Ia64CodegenState *code);
 
 #define MONO_ARCH_NO_EMULATE_LONG_SHIFT_OPS 1
 #define MONO_ARCH_NO_EMULATE_MUL_IMM 1
+#define MONO_ARCH_NO_EMULATE_MUL     1
 
 #define MONO_ARCH_EMULATE_CONV_R8_UN     1
 #define MONO_ARCH_EMULATE_LCONV_TO_R8_UN 1
@@ -169,14 +182,12 @@ mono_ia64_context_get_fp (MonoContext *ctx)
 
 #define MONO_ARCH_HAVE_IS_INT_OVERFLOW 1
 
-#define MONO_ARCH_ENABLE_EMIT_STATE_OPT 1
 #define MONO_ARCH_HAVE_INVALIDATE_METHOD 1
 #define MONO_ARCH_HAVE_THROW_CORLIB_EXCEPTION 1
-#define MONO_ARCH_HAVE_PIC_AOT 1
-#define MONO_ARCH_HAVE_CREATE_TRAMPOLINE_FROM_TOKEN 1
-#define MONO_ARCH_HAVE_CREATE_SPECIFIC_TRAMPOLINE 1
 #define MONO_ARCH_HAVE_CREATE_DELEGATE_TRAMPOLINE 1
 #define MONO_ARCH_HAVE_SAVE_UNWIND_INFO 1
-#define MONO_ARCH_HAVE_CREATE_VARS 1
+#define MONO_ARCH_HAVE_ATOMIC_EXCHANGE 1
+#define MONO_ARCH_HAVE_IMT 1
+#define MONO_ARCH_HAVE_GENERALIZED_IMT_THUNK 1
 
 #endif /* __MONO_MINI_IA64_H__ */