2007-12-07 Zoltan Varga <vargaz@gmail.com>
authorZoltan Varga <vargaz@gmail.com>
Fri, 7 Dec 2007 14:53:13 +0000 (14:53 -0000)
committerZoltan Varga <vargaz@gmail.com>
Fri, 7 Dec 2007 14:53:13 +0000 (14:53 -0000)
* mini-trampolines.c (mono_get_trampoline_func): New helper function.

* tramp-<ARCH>.c: Use the new helper function.

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

mono/mini/ChangeLog
mono/mini/mini-trampolines.c
mono/mini/mini.h
mono/mini/tramp-amd64.c
mono/mini/tramp-arm.c
mono/mini/tramp-ia64.c
mono/mini/tramp-sparc.c
mono/mini/tramp-x86.c

index c80a50daa1913e39dba7112eb1df3587f4b9e34f..8c650ef6e5be8af74103a3ba6691d315bc40f47e 100644 (file)
@@ -1,3 +1,9 @@
+2007-12-07  Zoltan Varga  <vargaz@gmail.com>
+
+       * mini-trampolines.c (mono_get_trampoline_func): New helper function.
+
+       * tramp-<ARCH>.c: Use the new helper function.
+
 2007-12-07  Mark Probst  <mark.probst@gmail.com>
 
        * inssel.brg: Added a pattern for the OP_TRAMPCALL_VTABLE
index 53a2b0f2dab90c12531394139c67d687598a8e9c..b9c93fb412ef4282d77b48b3746a4f508db97420 100644 (file)
@@ -383,4 +383,37 @@ mono_delegate_trampoline (gssize *regs, guint8 *code, MonoClass *klass, guint8*
 
 #endif
 
+/*
+ * mono_get_trampoline_func:
+ *
+ *   Return the C function which needs to be called by the generic trampoline of type
+ * TRAMP_TYPE.
+ */
+gconstpointer
+mono_get_trampoline_func (MonoTrampolineType tramp_type)
+{
+       switch (tramp_type) {
+       case MONO_TRAMPOLINE_GENERIC:
+       case MONO_TRAMPOLINE_JUMP:
+               return mono_magic_trampoline;
+       case MONO_TRAMPOLINE_CLASS_INIT:
+               return mono_class_init_trampoline;
+       case MONO_TRAMPOLINE_GENERIC_CLASS_INIT:
+               return mono_generic_class_init_trampoline;
+#ifdef MONO_ARCH_AOT_SUPPORTED
+       case MONO_TRAMPOLINE_AOT:
+               return mono_aot_trampoline;
+       case MONO_TRAMPOLINE_AOT_PLT:
+               return mono_aot_plt_trampoline;
+#endif
+#ifdef MONO_ARCH_HAVE_CREATE_DELEGATE_TRAMPOLINE
+       case MONO_TRAMPOLINE_DELEGATE:
+               return mono_delegate_trampoline;
+#endif
+       default:
+               g_assert_not_reached ();
+               return NULL;
+       }
+}
+
 
index f33378009180a9cb6fa802d607fcc5d62f59ff3a..a10f58dfd364f4cb8c38dd83392ac46e28915e3b 100644 (file)
@@ -965,6 +965,7 @@ gpointer          mono_aot_plt_trampoline (gssize *regs, guint8 *code, guint8 *t
                                                                                   guint8* tramp) MONO_INTERNAL;
 void              mono_class_init_trampoline (gssize *regs, guint8 *code, MonoVTable *vtable, guint8 *tramp) MONO_INTERNAL;
 void              mono_generic_class_init_trampoline (gssize *regs, guint8 *code, gpointer dummy, guint8 *tramp) MONO_INTERNAL;
+gconstpointer     mono_get_trampoline_func (MonoTrampolineType tramp_type);
 gpointer          mini_get_vtable_trampoline (void) MONO_INTERNAL;
 gpointer          mono_debugger_create_notification_function (void) MONO_INTERNAL;
 
index 94d5f0b15e34b8eb4445b382efe33cd3f8898458..acc21fee792faa0864e9d5e24717d033b4ae8c5d 100644 (file)
@@ -314,19 +314,7 @@ mono_arch_create_trampoline_code (MonoTrampolineType tramp_type)
        else
                amd64_mov_reg_membase (code, AMD64_ARG_REG4, AMD64_RBP, tramp_offset, 8);
 
-       if (tramp_type == MONO_TRAMPOLINE_CLASS_INIT)
-               tramp = (guint8*)mono_class_init_trampoline;
-       else if (tramp_type == MONO_TRAMPOLINE_GENERIC_CLASS_INIT)
-               tramp = (guint8*)mono_generic_class_init_trampoline;
-       else if (tramp_type == MONO_TRAMPOLINE_AOT)
-               tramp = (guint8*)mono_aot_trampoline;
-       else if (tramp_type == MONO_TRAMPOLINE_AOT_PLT)
-               tramp = (guint8*)mono_aot_plt_trampoline;
-       else if (tramp_type == MONO_TRAMPOLINE_DELEGATE)
-               tramp = (guint8*)mono_delegate_trampoline;
-       else
-               tramp = (guint8*)mono_magic_trampoline;
-
+       tramp = mono_get_trampoline_func (tramp_type);
        amd64_mov_reg_imm (code, AMD64_RAX, tramp);
        amd64_call_reg (code, AMD64_RAX);
 
index 7fcb71e32b688dbfeccf7f7b98336a00a6acf071..55881a28850c8192f04e06e60af5ea0036d6db3d 100644 (file)
@@ -259,16 +259,7 @@ mono_arch_create_trampoline_code (MonoTrampolineType tramp_type)
 
        constants = (gpointer*)buf;
        constants [0] = mono_get_lmf_addr;
-       if (tramp_type == MONO_TRAMPOLINE_CLASS_INIT)
-               constants [1] = mono_class_init_trampoline;
-       else if (tramp_type == MONO_TRAMPOLINE_AOT)
-               constants [1] = mono_aot_trampoline;
-       else if (tramp_type == MONO_TRAMPOLINE_AOT_PLT)
-               constants [1] = mono_aot_plt_trampoline;
-       else if (tramp_type == MONO_TRAMPOLINE_DELEGATE)
-               constants [1] = mono_delegate_trampoline;
-       else
-               constants [1] = mono_magic_trampoline;
+       constants [1] = mono_get_trampoline_func (tramp_type);
 
        /* backpatch by emitting the missing instructions skipped above */
        ARM_LDR_IMM (load_get_lmf_addr, ARMREG_R0, ARMREG_PC, (buf - load_get_lmf_addr - 8));
index 0b750e023544ca960bf7f15dc20a00da63bf440a..87c1a10e8a67f1d9614f800c42b74e06c2d80732 100644 (file)
@@ -225,8 +225,6 @@ mono_arch_create_trampoline_code (MonoTrampolineType tramp_type)
 
        ia64_codegen_init (code, buf);
 
-       /* FIXME: Save/restore lmf */
-
        /* Stacked Registers */
        in0 = 32;
        local0 = in0 + 8;
@@ -317,16 +315,7 @@ mono_arch_create_trampoline_code (MonoTrampolineType tramp_type)
        /* FIXME: */
        ia64_mov (code, o3, 0);
 
-       if (tramp_type == MONO_TRAMPOLINE_CLASS_INIT)
-               tramp = (guint8*)mono_class_init_trampoline;
-       else if (tramp_type == MONO_TRAMPOLINE_AOT)
-               tramp = (guint8*)mono_aot_trampoline;
-       /*
-       else if (tramp_type == MONO_TRAMPOLINE_DELEGATE)
-               tramp = (guint8*)mono_delegate_trampoline;
-       */
-       else
-               tramp = (guint8*)mono_magic_trampoline;
+       tramp = mono_get_trampoline_func (tramp_type);
 
        /* Call the trampoline using an indirect call */
        ia64_movl (code, l0, tramp);
index b5c3784bfb5396f23dd33e8f0ae475f42744835d..ac205fe9018c9473b675bde2836dedaf0cdb98b8 100644 (file)
@@ -163,12 +163,7 @@ mono_arch_create_trampoline_code (MonoTrampolineType tramp_type)
                }
        }
 
-       if (tramp_type == MONO_TRAMPOLINE_CLASS_INIT)
-               tramp_addr = &mono_class_init_trampoline;
-       else if (tramp_type == MONO_TRAMPOLINE_AOT)
-               tramp_addr = mono_aot_trampoline;
-       else
-               tramp_addr = &mono_magic_trampoline;
+       tramp_addr = mono_get_trampoline_func (tramp_type);
        sparc_ldi_imm (code, sparc_sp, MONO_SPARC_STACK_BIAS + 200, sparc_o2);
        /* pass address of register table as third argument */
        sparc_add_imm (code, FALSE, sparc_sp, regs_offset, sparc_o0);
index 0dac62738f732db6e700c9a52bc0618c2abc661a..de6d8511a4387bfe40da5924598369fa70e96352 100644 (file)
@@ -181,7 +181,7 @@ mono_arch_nullify_plt_entry (guint8 *code)
 guchar*
 mono_arch_create_trampoline_code (MonoTrampolineType tramp_type)
 {
-       guint8 *buf, *code;
+       guint8 *buf, *code, *tramp;
        int pushed_args;
 
        code = buf = mono_global_codeman_reserve (256);
@@ -306,18 +306,8 @@ mono_arch_create_trampoline_code (MonoTrampolineType tramp_type)
        x86_breakpoint (buf);*/
 #endif
 
-       if (tramp_type == MONO_TRAMPOLINE_CLASS_INIT)
-               x86_call_code (buf, mono_class_init_trampoline);
-       else if (tramp_type == MONO_TRAMPOLINE_GENERIC_CLASS_INIT)
-               x86_call_code (buf, mono_generic_class_init_trampoline);
-       else if (tramp_type == MONO_TRAMPOLINE_AOT)
-               x86_call_code (buf, mono_aot_trampoline);
-       else if (tramp_type == MONO_TRAMPOLINE_AOT_PLT)
-               x86_call_code (buf, mono_aot_plt_trampoline);
-       else if (tramp_type == MONO_TRAMPOLINE_DELEGATE)
-               x86_call_code (buf, mono_delegate_trampoline);
-       else
-               x86_call_code (buf, mono_magic_trampoline);
+       tramp = mono_get_trampoline_func (tramp_type);
+       x86_call_code (tramp);
 
        x86_alu_reg_imm (buf, X86_ADD, X86_ESP, 4*4);