Author: zoltan
Date: 2007-10-15 17:17:24 -0400 (Mon, 15 Oct 2007)
New Revision: 87535

Modified:
   trunk/mono/mono/mini/ChangeLog
   trunk/mono/mono/mini/mini-sparc.c
   trunk/mono/mono/mini/mini-sparc.h
Log:
2007-10-15  Zoltan Varga  <[EMAIL PROTECTED]>

        * mini-sparc.h mini-sparc.c: Add support for the common vtable 
trampoline.


Modified: trunk/mono/mono/mini/ChangeLog
===================================================================
--- trunk/mono/mono/mini/ChangeLog      2007-10-15 21:00:01 UTC (rev 87534)
+++ trunk/mono/mono/mini/ChangeLog      2007-10-15 21:17:24 UTC (rev 87535)
@@ -1,4 +1,7 @@
+2007-10-15  Zoltan Varga  <[EMAIL PROTECTED]>
 
+       * mini-sparc.h mini-sparc.c: Add support for the common vtable 
trampoline.
+
 Mon Oct 15 11:18:52 CEST 2007 Paolo Molaro <[EMAIL PROTECTED]>
 
        * mini-ppc.c, mini-ppc.h: ppc support for the common vtable

Modified: trunk/mono/mono/mini/mini-sparc.c
===================================================================
--- trunk/mono/mono/mini/mini-sparc.c   2007-10-15 21:00:01 UTC (rev 87534)
+++ trunk/mono/mono/mini/mini-sparc.c   2007-10-15 21:17:24 UTC (rev 87535)
@@ -2161,12 +2161,12 @@
 }
 
 /*
- * mono_arch_get_vcall_slot_addr:
+ * mono_arch_get_vcall_slot:
  *
  *  Determine the vtable slot used by a virtual call.
  */
-gpointer*
-mono_arch_get_vcall_slot_addr (guint8 *code8, gpointer *regs)
+gpointer
+mono_arch_get_vcall_slot (guint8 *code8, gpointer *regs, int *displacement)
 {
        guint32 *code = (guint32*)(gpointer)code8;
        guint32 ins = code [0];
@@ -2174,6 +2174,8 @@
 
        mono_sparc_flushw ();
 
+       *displacement = 0;
+
        if (!mono_sparc_is_virtual_call (code))
                return NULL;
 
@@ -2190,7 +2192,9 @@
 
                        base_val = regs [base];
 
-                       return (gpointer)((guint8*)base_val + disp);
+                       *displacement = disp;
+
+                       return (gpointer)base_val;
                }
                else if ((sparc_inst_op (prev_ins) == 0x3) && (sparc_inst_i 
(prev_ins) == 0) && (sparc_inst_op3 (prev_ins) == 0)) {
                        /* set r1, ICONST; ld [r1 + r2], r2; call r2 */
@@ -2222,7 +2226,9 @@
 
                        base_val = regs [base];
 
-                       return (gpointer)((guint8*)base_val + disp);
+                       *displacement = disp;
+
+                       return (gpointer)base_val;
                } else
                        g_assert_not_reached ();
        }
@@ -2232,6 +2238,17 @@
        return NULL;
 }
 
+gpointer*
+mono_arch_get_vcall_slot_addr (guint8 *code, gpointer *regs)
+{
+       gpointer vt;
+       int displacement;
+       vt = mono_arch_get_vcall_slot (code, regs, &displacement);
+       if (!vt)
+               return NULL;
+       return (gpointer*)((char*)vt + displacement);
+}
+
 #define CMP_SIZE 3
 #define BR_SMALL_SIZE 2
 #define BR_LARGE_SIZE 2

Modified: trunk/mono/mono/mini/mini-sparc.h
===================================================================
--- trunk/mono/mono/mini/mini-sparc.h   2007-10-15 21:00:01 UTC (rev 87534)
+++ trunk/mono/mono/mini/mini-sparc.h   2007-10-15 21:17:24 UTC (rev 87535)
@@ -126,6 +126,7 @@
 #define MONO_ARCH_HAVE_CREATE_SPECIFIC_TRAMPOLINE 1
 #define MONO_ARCH_HAVE_IMT 1
 #define MONO_ARCH_IMT_REG sparc_g1
+#define MONO_ARCH_COMMON_VTABLE_TRAMPOLINE 1
 
 #ifdef SPARCV9
 #define MONO_ARCH_NO_EMULATE_LONG_SHIFT_OPS

_______________________________________________
Mono-patches maillist  -  [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches

Reply via email to