2005-08-21 Zoltan Varga <vargaz@freemail.hu>
authorZoltan Varga <vargaz@gmail.com>
Sun, 21 Aug 2005 17:44:39 +0000 (17:44 -0000)
committerZoltan Varga <vargaz@gmail.com>
Sun, 21 Aug 2005 17:44:39 +0000 (17:44 -0000)
* mini.h mini-trampolines.c: Pass the trampoline argument to
mono_arch_patch_delegate_trampoline.

* mini-ia64.h mini-ia64.c tramp-ia64.c: Add support for delegate trampolines.

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

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

index 549ac5d677e429f28db860db89d9ac8c578b1885..ff9b19f682a80f6e4eebd7398270a55080489d01 100644 (file)
@@ -1,5 +1,10 @@
 2005-08-21  Zoltan Varga  <vargaz@freemail.hu>
 
+       * mini.h mini-trampolines.c: Pass the trampoline argument to 
+       mono_arch_patch_delegate_trampoline.
+
+       * mini-ia64.h mini-ia64.c tramp-ia64.c: Add support for delegate trampolines.
+
        * mini-trampolines.c: Fix build.
 
        * mini-amd64.h: Add delegate trampolines.
index bd6c1ff975c82f1a9c47b6b5906b800b94e534cf..c0b605b1f613396d24a5e7ee4eee28c90023be4c 100644 (file)
@@ -2733,10 +2733,14 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
                        call = (MonoCallInst*)ins;
 
                        /* Indirect call */
-                       ia64_mov (code, GP_SCRATCH_REG, ins->sreg1);
-                       ia64_ld8_inc_imm (code, GP_SCRATCH_REG2, GP_SCRATCH_REG, 8);
+                       /* 
+                        * mono_arch_patch_delegate_trampoline will patch this, this is why R8 is 
+                        * used.
+                        */
+                       ia64_mov (code, IA64_R8, ins->sreg1);
+                       ia64_ld8_inc_imm (code, GP_SCRATCH_REG2, IA64_R8, 8);
                        ia64_mov_to_br (code, IA64_B6, GP_SCRATCH_REG2);
-                       ia64_ld8 (code, IA64_GP, GP_SCRATCH_REG);
+                       ia64_ld8 (code, IA64_GP, IA64_R8);
                        ia64_br_call_reg (code, IA64_B0, IA64_B6);
 
                        code = emit_move_return_value (cfg, ins, code);
index fd7ea654a0ad39c1d520e6c96dc38eba6a82f51f..f2d4e9a3c0fca42dd45ebaa010c667129cda8c63 100644 (file)
@@ -170,6 +170,7 @@ mono_ia64_context_get_fp (MonoContext *ctx)
 #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
 
index 8b8c35db643a722ca45b33f0fcfff819da05e6df..45dff5640a3224cb0656d5453cfd6c55f8073372 100644 (file)
@@ -145,12 +145,11 @@ gpointer
 mono_delegate_trampoline (gssize *regs, guint8 *code, MonoMethod *m, guint8* tramp)
 {
        gpointer addr;
-       gpointer *vtable_slot;
 
        addr = mono_compile_method (m);
        g_assert (addr);
 
-       mono_arch_patch_delegate_trampoline (code, regs, addr);
+       mono_arch_patch_delegate_trampoline (code, tramp, regs, addr);
 
        return addr;
 }
index bd178878d2411762f7ab597d10ae45aa3985305e..d270a684bfcc268ab9093d65cc30b0afd1752d9b 100644 (file)
@@ -917,7 +917,7 @@ void     mono_arch_register_lowlevel_calls      (void);
 gpointer mono_arch_get_unbox_trampoline         (MonoMethod *m, gpointer addr);
 void     mono_arch_patch_callsite               (guint8 *code, guint8 *addr);
 void     mono_arch_nullify_class_init_trampoline(guint8 *code, gssize *regs);
-void     mono_arch_patch_delegate_trampoline    (guint8 *code, gssize *regs, guint8 *addr);
+void     mono_arch_patch_delegate_trampoline    (guint8 *code, guint8 *tramp, gssize *regs, guint8 *addr);
 gpointer mono_arch_create_specific_trampoline   (gpointer arg1, MonoTrampolineType tramp_type, MonoDomain *domain, guint32 *code_len);
 
 /* Exception handling */
index 0fe9d9821bc4f351a860588eb7feb6eab20ac68a..ec515fa81e9e2145b4acb8fb9b87c04f0c55e9b5 100644 (file)
@@ -138,7 +138,7 @@ mono_arch_nullify_class_init_trampoline (guint8 *code, gssize *regs)
 }
 
 void
-mono_arch_patch_delegate_trampoline (guint8 *code, gssize *regs, guint8 *addr)
+mono_arch_patch_delegate_trampoline (guint8 *code, guint8 *tramp, gssize *regs, guint8 *addr)
 {
        guint8 rex = 0;
        guint32 reg;
index bc36ec7515357ba176d5cd7bed2c05550d3910df..35303d6942ca11caf0bc323cbf180a10b067938d 100644 (file)
@@ -158,6 +158,24 @@ mono_arch_nullify_class_init_trampoline (guint8 *code, gssize *regs)
        mono_arch_flush_icache (callsite_begin, code - callsite_begin);
 }
 
+void
+mono_arch_patch_delegate_trampoline (guint8 *code, guint8 *tramp, gssize *regs, guint8 *addr)
+{
+       /* 
+        * This is called by the code generated by OP_CALL_REG:
+        * ld8 r30=[r8],8
+        * nop.i 0x0;;
+        * mov.sptk b6=r30
+        * ld8 r1=[r8]
+        * br.call.sptk.few b0=b6
+        */
+
+       /* We patch the function descriptor instead of delegate->method_ptr */
+       //g_assert (((gpointer*)(regs [8] - 8))[0] == tramp);
+       ((gpointer*)(regs [8] - 8))[0] = mono_get_addr_from_ftnptr (addr);
+       ((gpointer*)(regs [8] - 8))[1] = NULL;
+}
+
 guchar*
 mono_arch_create_trampoline_code (MonoTrampolineType tramp_type)
 {
@@ -287,6 +305,8 @@ mono_arch_create_trampoline_code (MonoTrampolineType tramp_type)
                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;