summaryrefslogtreecommitdiff
path: root/mono/mini/mini-amd64.h
diff options
context:
space:
mode:
Diffstat (limited to 'mono/mini/mini-amd64.h')
-rw-r--r--mono/mini/mini-amd64.h32
1 files changed, 19 insertions, 13 deletions
diff --git a/mono/mini/mini-amd64.h b/mono/mini/mini-amd64.h
index fd84eab379..b523d9981c 100644
--- a/mono/mini/mini-amd64.h
+++ b/mono/mini/mini-amd64.h
@@ -47,7 +47,7 @@ struct sigcontext {
guint64 eip;
};
-typedef void (* MonoW32ExceptionHandler) (int _dummy, EXCEPTION_RECORD *info, void *context);
+typedef void (* MonoW32ExceptionHandler) (int _dummy, EXCEPTION_POINTERS *info, void *context);
void win32_seh_init(void);
void win32_seh_cleanup(void);
void win32_seh_set_handler(int type, MonoW32ExceptionHandler handler);
@@ -159,16 +159,17 @@ struct sigcontext {
struct MonoLMF {
/*
- * If the lowest bit is set to 1, then this LMF has the rip field set. Otherwise,
+ * If the lowest bit is set, then this LMF has the rip field set. Otherwise,
* the rip field is not set, and the rsp field points to the stack location where
* the caller ip is saved.
- * If the second lowest bit is set to 1, then this is a MonoLMFExt structure, and
+ * If the second lowest bit is set, then this is a MonoLMFExt structure, and
* the other fields are not valid.
+ * If the third lowest bit is set, then this is a MonoLMFTramp structure.
*/
gpointer previous_lmf;
+#ifdef HOST_WIN32
gpointer lmf_addr;
- /* This is only set in trampoline LMF frames */
- MonoMethod *method;
+#endif
#if defined(__default_codegen__) || defined(HOST_WIN32)
guint64 rip;
#elif defined(__native_client_codegen__)
@@ -189,6 +190,13 @@ struct MonoLMF {
#endif
};
+/* LMF structure used by the JIT trampolines */
+typedef struct {
+ struct MonoLMF lmf;
+ guint64 *regs;
+ gpointer lmf_addr;
+} MonoLMFTramp;
+
typedef struct MonoCompileArch {
gint32 localloc_offset;
gint32 reg_save_area_offset;
@@ -334,9 +342,7 @@ typedef struct MonoCompileArch {
#define MONO_ARCH_HAVE_IS_INT_OVERFLOW 1
#define MONO_ARCH_ENABLE_REGALLOC_IN_EH_BLOCKS 1
-#if !defined(__APPLE__)
#define MONO_ARCH_ENABLE_MONO_LMF_VAR 1
-#endif
#define MONO_ARCH_HAVE_INVALIDATE_METHOD 1
#define MONO_ARCH_HAVE_CREATE_DELEGATE_TRAMPOLINE 1
#define MONO_ARCH_HAVE_ATOMIC_ADD 1
@@ -396,16 +402,13 @@ typedef struct MonoCompileArch {
#define MONO_ARCH_HAVE_CONTEXT_SET_INT_REG 1
#define MONO_ARCH_HAVE_SETUP_ASYNC_CALLBACK 1
#define MONO_ARCH_HAVE_CREATE_LLVM_NATIVE_THUNK 1
+#define MONO_ARCH_HAVE_OP_TAIL_CALL 1
+#define MONO_ARCH_HAVE_TRANSLATE_TLS_OFFSET 1
-#ifdef TARGET_OSX
+#if defined(TARGET_OSX) || defined(__linux__)
#define MONO_ARCH_HAVE_TLS_GET_REG 1
#endif
-gboolean
-mono_amd64_tail_call_supported (MonoMethodSignature *caller_sig, MonoMethodSignature *callee_sig) MONO_INTERNAL;
-
-#define MONO_ARCH_USE_OP_TAIL_CALL(caller_sig, callee_sig) mono_amd64_tail_call_supported (caller_sig, callee_sig)
-
/* Used for optimization, not complete */
#define MONO_ARCH_IS_OP_MEMBASE(opcode) ((opcode) == OP_X86_PUSH_MEMBASE)
@@ -446,6 +449,9 @@ mono_amd64_have_tls_get (void) MONO_INTERNAL;
GSList*
mono_amd64_get_exception_trampolines (gboolean aot) MONO_INTERNAL;
+int
+mono_amd64_get_tls_gs_offset (void) MONO_INTERNAL;
+
typedef struct {
guint8 *address;
guint8 saved_byte;