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