2005-08-20 Zoltan Varga <vargaz@freemail.hu>
authorZoltan Varga <vargaz@gmail.com>
Sat, 20 Aug 2005 17:08:21 +0000 (17:08 -0000)
committerZoltan Varga <vargaz@gmail.com>
Sat, 20 Aug 2005 17:08:21 +0000 (17:08 -0000)
* mini.h mini.c jit-icalls.c exceptions-ia64.cdriver.c: Add support
for IA64 function descriptors.

svn path=/trunk/mono/; revision=48602

mono/mini/ChangeLog
mono/mini/driver.c
mono/mini/exceptions-ia64.c
mono/mini/jit-icalls.c
mono/mini/mini.c
mono/mini/mini.h

index 06770e80f6d14cc90b467435928b14606cc4ec36..203dd9a30793f85853b288584fa60d101572df3a 100644 (file)
@@ -1,3 +1,7 @@
+2005-08-20  Zoltan Varga  <vargaz@freemail.hu>
+
+       * mini.h mini.c jit-icalls.c exceptions-ia64.cdriver.c: Add support
+       for IA64 function descriptors.
 
 Sat Aug 20 16:51:44 BST 2005 Paolo Molaro <lupus@ximian.com>
 
index 08dbd2f6c61338870b55a21e00db35f7e5b3abec..040fe8066072ae5483e9fae4e51d127268ce4bf8 100644 (file)
@@ -333,7 +333,8 @@ mini_regression (MonoImage *image, int verbose, int *total_run) {
                                                func = jinfo->code_start;
                                        else
 #endif
-                                               func = (TestMethod)cfg->native_code;
+                                               func = (TestMethod)(gpointer)cfg->native_code;
+                                       func = (TestMethod)mono_create_ftnptr (mono_get_root_domain (), func);
                                        result = func ();
                                        if (result != expected) {
                                                failed++;
index 936396f5c97b0eb5dc63223306afa25b9db3bf37..3d2db50505783a3810d6142288a0c5e5a6237c9c 100644 (file)
@@ -43,9 +43,9 @@
 #define GP_SCRATCH_REG2 30
 
 static gpointer
-mono_create_ftnptr (gpointer ptr)
+ia64_create_ftnptr (gpointer ptr)
 {
-       gpointer *desc = g_malloc (2 * sizeof (gpointer));
+       gpointer *desc = mono_global_codeman_reserve (2 * sizeof (gpointer));
        desc [0] = ptr;
        desc [1] = NULL;
 
@@ -172,7 +172,7 @@ get_real_call_filter (void)
 
        _U_dyn_register (di);
 
-       return mono_create_ftnptr (start);
+       return ia64_create_ftnptr (start);
 }
 
 static int
@@ -314,7 +314,7 @@ get_throw_trampoline (gboolean rethrow)
 
        _U_dyn_register (di);
 
-       return mono_create_ftnptr (start);
+       return ia64_create_ftnptr (start);
 }
 
 /**
@@ -469,7 +469,7 @@ mono_arch_get_throw_corlib_exception (void)
 
        mono_arch_flush_icache (start, code.buf - start);
 
-       return mono_create_ftnptr (start);
+       return ia64_create_ftnptr (start);
 }
 
 /* mono_arch_find_jit_info:
@@ -520,21 +520,6 @@ mono_arch_find_jit_info (MonoDomain *domain, MonoJitTlsData *jit_tls, MonoJitInf
                                if (!ji->method->wrapper_type)
                                        *managed = TRUE;
 
-                       /*
-                        * Some managed methods like pinvoke wrappers might have save_lmf set.
-                        * In this case, register save/restore code is not generated by the 
-                        * JIT, so we have to restore callee saved registers from the lmf.
-                        */
-                       if (ji->method->save_lmf) {
-                       }
-                       else {
-                       }
-
-                       if (*lmf && (MONO_CONTEXT_GET_BP (new_ctx) >= (gpointer)(*lmf)->ebp)) {
-                               /* remove any unused lmf */
-                               *lmf = (*lmf)->previous_lmf;
-                       }
-
                        break;
                }
 
index 8acce64f28d169eca1d3ff07a3cb24b54ec77a01..c0a4040be339e11d591301513e53c228b02d7e8d 100644 (file)
@@ -19,7 +19,7 @@ mono_ldftn (MonoMethod *method)
 
        addr = mono_create_jump_trampoline (mono_domain_get (), method, TRUE);
 
-       return addr;
+       return mono_create_ftnptr (mono_domain_get (), addr);
 }
 
 /*
@@ -35,7 +35,7 @@ mono_ldftn_nosync (MonoMethod *method)
 
        addr = mono_create_jump_trampoline (mono_domain_get (), method, FALSE);
 
-       return addr;
+       return mono_create_ftnptr (mono_domain_get (), addr);
 }
 
 static void*
index 8b42e30b40d2dce81861e0db8a0becef454511fe..b5c10064ed1a0218bb7b780cbca8fbc3e658b4c9 100644 (file)
@@ -130,6 +130,31 @@ mono_running_on_valgrind (void)
 #endif
 }
 
+/*
+ * mono_create_ftnptr:
+ *
+ *   Given a function address, create a function descriptor for it.
+ * This is only needed on IA64.
+ */
+gpointer
+mono_create_ftnptr (MonoDomain *domain, gpointer addr)
+{
+#ifdef __ia64__
+       gpointer *desc;
+
+       mono_domain_lock (domain);
+       desc = mono_code_manager_reserve (domain->code_mp, 2 * sizeof (gpointer));
+       mono_domain_unlock (domain);
+
+       desc [0] = addr;
+       desc [1] = NULL;
+
+       return desc;
+#else
+       return addr;
+#endif
+}
+
 /* debug function */
 G_GNUC_UNUSED static char*
 get_method_from_ip (void *ip)
@@ -2728,6 +2753,9 @@ mini_get_ldelema_ins (MonoCompile *cfg, MonoBasicBlock *bblock, MonoMethod *cmet
        rank = mono_method_signature (cmethod)->param_count - (is_set? 1: 0);
 
        if (rank == 2 && (cfg->opt & MONO_OPT_INTRINS)) {
+#ifdef MONO_ARCH_EMULATE_MUL_DIV
+               /* OP_LDELEMA2D depends on OP_LMUL */
+#else
                MonoInst *indexes;
                NEW_GROUP (cfg, indexes, sp [1], sp [2]);
                MONO_INST_NEW (cfg, addr, OP_LDELEMA2D);
@@ -2737,6 +2765,7 @@ mini_get_ldelema_ins (MonoCompile *cfg, MonoBasicBlock *bblock, MonoMethod *cmet
                addr->type = STACK_MP;
                addr->klass = cmethod->klass;
                return addr;
+#endif
        }
 
        /* Need to register the icall so it gets an icall wrapper */
@@ -2802,9 +2831,13 @@ mini_get_inst_for_method (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSigna
                        ins->inst_i0 = args [0];
                        return ins;
                } else if (strcmp (cmethod->name, "InternalGetHashCode") == 0) {
+#ifdef MONO_ARCH_EMULATE_MUL_DIV
+               /* The OP_GETHASHCODE rule depends on OP_MUL */
+#else
                        MONO_INST_NEW (cfg, ins, OP_GETHASHCODE);
                        ins->inst_i0 = args [0];
                        return ins;
+#endif
                } else
                        return NULL;
        } else if (mini_class_is_system_array (cmethod->klass)) {
@@ -6810,16 +6843,16 @@ mono_get_trampoline_code (MonoTrampolineType tramp_type)
 gpointer
 mono_create_class_init_trampoline (MonoVTable *vtable)
 {
-       gpointer code;
+       gpointer code, ptr;
 
        /* previously created trampoline code */
        mono_domain_lock (vtable->domain);
-       code = 
+       ptr = 
                g_hash_table_lookup (vtable->domain->class_init_trampoline_hash,
                                                                  vtable);
        mono_domain_unlock (vtable->domain);
-       if (code)
-               return code;
+       if (ptr)
+               return ptr;
 
 #ifdef MONO_ARCH_HAVE_CREATE_SPECIFIC_TRAMPOLINE
        code = mono_arch_create_specific_trampoline (vtable, MONO_TRAMPOLINE_CLASS_INIT, vtable->domain, NULL);
@@ -6827,10 +6860,12 @@ mono_create_class_init_trampoline (MonoVTable *vtable)
        code = mono_arch_create_class_init_trampoline (vtable);
 #endif
 
+       ptr = mono_create_ftnptr (vtable->domain, code);
+
        /* store trampoline address */
        mono_domain_lock (vtable->domain);
        g_hash_table_insert (vtable->domain->class_init_trampoline_hash,
-                                                         vtable, code);
+                                                         vtable, ptr);
        mono_domain_unlock (vtable->domain);
 
        EnterCriticalSection (&jit_mutex);
@@ -6839,7 +6874,7 @@ mono_create_class_init_trampoline (MonoVTable *vtable)
        g_hash_table_insert (class_init_hash_addr, code, vtable);
        LeaveCriticalSection (&jit_mutex);
 
-       return code;
+       return ptr;
 }
 
 gpointer
@@ -6933,9 +6968,9 @@ mono_create_jit_trampoline_from_token (MonoImage *image, guint32 token)
        buf = start = mono_code_manager_reserve (domain->code_mp, 2 * sizeof (gpointer));
        mono_domain_unlock (domain);
 
-       *(gpointer*)buf = image;
+       *(gpointer*)(gpointer)buf = image;
        buf += sizeof (gpointer);
-       *(guint32*)buf = token;
+       *(guint32*)(gpointer)buf = token;
 
        tramp = mono_arch_create_specific_trampoline (start, MONO_TRAMPOLINE_AOT, domain, NULL);
 
@@ -9312,7 +9347,7 @@ mono_jit_compile_method_inner (MonoMethod *method, MonoDomain *target_domain)
                                        mono_lookup_pinvoke_call (method, NULL, NULL);
                }
                        nm = mono_marshal_get_native_wrapper (method);
-                       return mono_compile_method (nm);
+                       return mono_get_addr_from_ftnptr (mono_compile_method (nm));
 
                        //if (mono_debug_format != MONO_DEBUG_FORMAT_NONE) 
                        //mono_debug_add_wrapper (method, nm);
@@ -9324,16 +9359,16 @@ mono_jit_compile_method_inner (MonoMethod *method, MonoDomain *target_domain)
                        if (*name == '.' && (strcmp (name, ".ctor") == 0)) {
                                MonoJitICallInfo *mi = mono_find_jit_icall_by_name ("mono_delegate_ctor");
                                g_assert (mi);
-                               return (gpointer)mono_icall_get_wrapper (mi);
+                               return mono_get_addr_from_ftnptr ((gpointer)mono_icall_get_wrapper (mi));
                        } else if (*name == 'I' && (strcmp (name, "Invoke") == 0)) {
                                nm = mono_marshal_get_delegate_invoke (method);
-                               return mono_jit_compile_method (nm);
+                                       return mono_get_addr_from_ftnptr (mono_compile_method (nm));
                        } else if (*name == 'B' && (strcmp (name, "BeginInvoke") == 0)) {
                                nm = mono_marshal_get_delegate_begin_invoke (method);
-                               return mono_jit_compile_method (nm);
+                               return mono_get_addr_from_ftnptr (mono_compile_method (nm));
                        } else if (*name == 'E' && (strcmp (name, "EndInvoke") == 0)) {
                                nm = mono_marshal_get_delegate_end_invoke (method);
-                               return mono_jit_compile_method (nm);
+                               return mono_get_addr_from_ftnptr (mono_compile_method (nm));
                        }
                }
                return NULL;
@@ -9404,13 +9439,13 @@ mono_jit_compile_method_with_opt (MonoMethod *method, guint32 opt)
                        mono_domain_unlock (target_domain);
                        mono_jit_stats.methods_lookups++;
                        mono_runtime_class_init (mono_class_vtable (domain, method->klass));
-                       return info->code_start;
+                       return mono_create_ftnptr (domain, info->code_start);
                }
        }
 
        mono_domain_unlock (target_domain);
        p = mono_jit_compile_method_inner (method, target_domain);
-       return p;
+       return mono_create_ftnptr (domain, p);
 }
 
 static gpointer
@@ -9867,7 +9902,7 @@ mono_jit_create_remoting_trampoline (MonoMethod *method, MonoRemotingTarget targ
        } else {
                addr = mono_compile_method (method);
        }
-       return addr;
+       return mono_get_addr_from_ftnptr (addr);
 }
 
 static void
index d80ecb7be4c2e5db41a25587638726e83adb5820..9a5a43aeaa38af1804ff2ff6d5a290db73a39601 100644 (file)
@@ -818,6 +818,7 @@ void      mono_register_opcode_emulation    (int opcode, const char* name, const
 void      mono_draw_graph                   (MonoCompile *cfg, MonoGraphOptions draw_options);
 void      mono_add_varcopy_to_end           (MonoCompile *cfg, MonoBasicBlock *bb, int src, int dest);
 void      mono_add_ins_to_end               (MonoBasicBlock *bb, MonoInst *inst);
+gpointer  mono_create_ftnptr                (MonoDomain *domain, gpointer addr);
 
 int               mono_find_method_opcode      (MonoMethod *method);
 MonoJitICallInfo *mono_find_jit_icall_by_name  (const char *name);