X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmini%2Fmini-amd64.h;h=5ad5b691e298a856ec60c384b2e1bf76bab98f3a;hb=dba1e96418a00b863db3565d5997314105bd8aa3;hp=03a9fb06c55096d3501609e940d8c8992d8eadfb;hpb=8eef5791c0c3f55ca65f10ae8fb060194dbc634b;p=mono.git diff --git a/mono/mini/mini-amd64.h b/mono/mini/mini-amd64.h index 03a9fb06c55..5ad5b691e29 100644 --- a/mono/mini/mini-amd64.h +++ b/mono/mini/mini-amd64.h @@ -47,6 +47,7 @@ LONG CALLBACK seh_handler(EXCEPTION_POINTERS* ep); #ifdef sun // Solaris x86 # undef SIGSEGV_ON_ALTSTACK +# define MONO_ARCH_NOMAP32BIT struct sigcontext { unsigned short gs, __gsh; @@ -73,7 +74,7 @@ struct sigcontext { }; #endif // sun, Solaris x86 -#define MONO_ARCH_SIGNAL_STACK_SIZE (64 * 1024) +#define MONO_ARCH_SIGNAL_STACK_SIZE (16 * 1024) #define MONO_ARCH_CPU_SPEC amd64_desc @@ -81,8 +82,6 @@ struct sigcontext { #define MONO_MAX_FREGS AMD64_XMM_NREG -#define MONO_ARCH_HAS_XP_LOCAL_REGALLOC - /* xmm15 is reserved for use by some opcodes */ #define MONO_ARCH_CALLEE_FREGS 0xef #define MONO_ARCH_CALLEE_SAVED_FREGS 0 @@ -143,6 +142,7 @@ typedef struct MonoCompileArch { gint32 reg_save_area_offset; gint32 stack_alloc_size; gboolean omit_fp, omit_fp_computed; + gpointer cinfo; } MonoCompileArch; typedef struct { @@ -161,21 +161,41 @@ typedef struct { guint64 r15; } MonoContext; -#define MONO_CONTEXT_SET_IP(ctx,ip) do { (ctx)->rip = (long)(ip); } while (0); -#define MONO_CONTEXT_SET_BP(ctx,bp) do { (ctx)->rbp = (long)(bp); } while (0); -#define MONO_CONTEXT_SET_SP(ctx,esp) do { (ctx)->rsp = (long)(esp); } while (0); +#define MONO_CONTEXT_SET_IP(ctx,ip) do { (ctx)->rip = (guint64)(ip); } while (0); +#define MONO_CONTEXT_SET_BP(ctx,bp) do { (ctx)->rbp = (guint64)(bp); } while (0); +#define MONO_CONTEXT_SET_SP(ctx,esp) do { (ctx)->rsp = (guint64)(esp); } while (0); #define MONO_CONTEXT_GET_IP(ctx) ((gpointer)((ctx)->rip)) #define MONO_CONTEXT_GET_BP(ctx) ((gpointer)((ctx)->rbp)) #define MONO_CONTEXT_GET_SP(ctx) ((gpointer)((ctx)->rsp)) +#ifdef _MSC_VER + +#define MONO_INIT_CONTEXT_FROM_FUNC(ctx, start_func) do { \ + guint64 stackptr; \ + mono_arch_flush_register_windows (); \ + stackptr = ((guint64)_GetAddressOfReturnAddress () - sizeof (void*));\ + MONO_CONTEXT_SET_IP ((ctx), (start_func)); \ + MONO_CONTEXT_SET_BP ((ctx), stackptr); \ + MONO_CONTEXT_SET_SP ((ctx), stackptr); \ +} while (0) + +#else + +/* + * __builtin_frame_address () is broken on some older gcc versions in the presence of + * frame pointer elimination, see bug #82095. + */ #define MONO_INIT_CONTEXT_FROM_FUNC(ctx,start_func) do { \ + int tmp; \ + guint64 stackptr = (guint64)&tmp; \ mono_arch_flush_register_windows (); \ MONO_CONTEXT_SET_IP ((ctx), (start_func)); \ - MONO_CONTEXT_SET_BP ((ctx), __builtin_frame_address (0)); \ + MONO_CONTEXT_SET_BP ((ctx), stackptr); \ + MONO_CONTEXT_SET_SP ((ctx), stackptr); \ } while (0) -#define MONO_ARCH_USE_SIGACTION 1 +#endif /* * some icalls like mono_array_new_va needs to be called using a different @@ -185,6 +205,8 @@ typedef struct { #ifndef PLATFORM_WIN32 +#define MONO_ARCH_USE_SIGACTION 1 + #ifdef HAVE_WORKING_SIGALTSTACK #define MONO_ARCH_SIGSEGV_ON_ALTSTACK @@ -239,6 +261,10 @@ typedef struct { #define MONO_ARCH_HAVE_CREATE_SPECIFIC_TRAMPOLINE 1 #define MONO_ARCH_HAVE_CREATE_DELEGATE_TRAMPOLINE 1 #define MONO_ARCH_HAVE_CREATE_VARS 1 +#define MONO_ARCH_HAVE_IMT 1 +#define MONO_ARCH_IMT_REG AMD64_R11 + +#define MONO_ARCH_AOT_SUPPORTED 1 gboolean mono_amd64_is_sse2 (void);