Revert r137822
authorZoltan Varga <vargaz@gmail.com>
Mon, 13 Jul 2009 22:19:45 +0000 (22:19 -0000)
committerZoltan Varga <vargaz@gmail.com>
Mon, 13 Jul 2009 22:19:45 +0000 (22:19 -0000)
svn path=/trunk/mono/; revision=137827

39 files changed:
mono/mini/CMakeLists.txt
mono/mini/ChangeLog
mono/mini/Info.plist [new file with mode: 0644]
mono/mini/Makefile.am
mono/mini/aot-compiler.c
mono/mini/aot-runtime.c
mono/mini/basic-simd.cs
mono/mini/driver.c
mono/mini/generics.cs
mono/mini/mdb-debug-info32-darwin.s [new file with mode: 0644]
mono/mini/method-to-ir.c
mono/mini/mini-alpha.c
mono/mini/mini-amd64.c
mono/mini/mini-arm.c
mono/mini/mini-exceptions.c
mono/mini/mini-hppa.c
mono/mini/mini-ia64.c
mono/mini/mini-mips.c
mono/mini/mini-ppc.c
mono/mini/mini-ppc.h
mono/mini/mini-sparc.c
mono/mini/mini-sparc.h
mono/mini/mini-trampolines.c
mono/mini/mini-x86.c
mono/mini/mini.c
mono/mini/mini.h
mono/mini/tramp-alpha.c
mono/mini/tramp-amd64.c
mono/mini/tramp-arm.c
mono/mini/tramp-hppa.c
mono/mini/tramp-ia64.c
mono/mini/tramp-mips.c
mono/mini/tramp-ppc.c
mono/mini/tramp-s390.c
mono/mini/tramp-s390x.c
mono/mini/tramp-sparc.c
mono/mini/tramp-x86.c
mono/mini/unwind.c
mono/mini/unwind.h

index dd34cc91e201fc7c1b99707ae157184198ea69b1..cdd8c486c4982df3c66301db71706b71d87d0963 100644 (file)
@@ -356,6 +356,19 @@ add_library(libmono-static STATIC ${libmono_la_SOURCES} ${CMAKE_CURRENT_BINARY_D
 target_link_libraries(libmono-static monoruntime-static monoutils-static monogc-static wapi-static ${GLIB2_LIBRARIES} ${LIBS})
 set_target_properties(libmono-static PROPERTIES OUTPUT_NAME "mono-static")
 
+# Since cmake has no support for convenience libraries, we have to link the
+# final libmono.a ourselves, similarly to how libtool does it
+add_custom_target(libmono.a
+  COMMAND rm -rf .libs/tmp libmono.a
+  COMMAND mkdir -p .libs/tmp/{1,2,3,4,5}
+  COMMAND cd .libs/tmp/1 && ar x ../../../../metadata/libmonoruntime-static.a
+  COMMAND cd .libs/tmp/2 && ar x ../../../../utils/libmonoutils-static.a
+  COMMAND cd .libs/tmp/3 && ar x ../../../../io-layer/libwapi-static.a
+  COMMAND cd .libs/tmp/3 && ar x ../../../../mini/libmono-static.a
+  COMMAND cd .libs/tmp/4 && ar x ../../../../../libgc/libmonogc-static.a
+  COMMAND ar r libmono.a `find .libs/tmp/ -name '*.o'`
+)
+
 # FIXME: cmake has no support for convenience libraries, so we would end up 
 # creating a lot of shared libraries linking to each other
 #add_library(libmono SHARED ${libmono_la_SOURCES} ${CMAKE_CURRENT_BINARY_DIR}/${arch_built})
@@ -412,6 +425,15 @@ add_executable(mono main.c ${CMAKE_CURRENT_BINARY_DIR}/buildver.h)
 add_dependencies(mono libmono-static)
 target_link_libraries(mono libmono-static ${GLIB2_LIBRARIES})
 
+install(
+  TARGETS mono
+  RUNTIME DESTINATION bin)
+
+# FIXME: Can't specify a dependency on libmono.a, and we don't want to build
+# libmono.a until needed
+install(
+  FILES libmono.a DESTINATION lib)
+
 # Test file targets
 
 foreach(test ${test_sources})
index 964dd6d93bbb51ec990145a1855947cbf2538352..0435c3817d08aa579003395dfcd25722518dcf1d 100644 (file)
@@ -1,6 +1,91 @@
+
+Mon Jul 13 17:58:50 CEST 2009 Paolo Molaro <lupus@ximian.com>
+
+       * mini-ppc.c: fixed bug introduced by Steven's TLS changes.
+
+2009-07-13  Mark Probst  <mark.probst@gmail.com>
+
+       * mini.c: Register function for getting the IP from a signal
+       context with metadata.
+
 2009-07-13  Zoltan Varga  <vargaz@gmail.com>
 
-       * basic-simd.cs: Add a test for #521662.
+       * method-to-ir.c (mono_method_to_ir): When calling a gshared method,
+       call a generic class init trampoline if needed. Fixes #519336.
+
+       * generics.cs: Add a test.
+       
+2009-07-09  Mark Probst  <mark.probst@gmail.com>
+
+       * method-to-ir.c: When doing a call which might be remote from
+       shared generic code to other shared code with open type arguments,
+       get the remoting invoke wrapper from the RGCTX and do an indirect
+       call to it.
+
+2009-07-03  Zoltan Varga  <vargaz@gmail.com>
+
+       * mini-trampolines.c (get_unbox_trampoline): Add an rgctx trampoline
+       after the unbox trampoline in the full-aot case.
+
+2009-07-02  jonas echterhoff <jonas@unity3d.com>
+       
+       * mini.c: Move initialization of jit_mutex before debugger initialization
+       
+       to avoid crashes.
+       
+       
+       * Info.plist: added Info.plist and link flag to enable the mono executable
+       to access other processes. Requires codesigning of the executable to work.
+       
+       * mdb-debug-info32-darwin.s: The same as mdb-debug-info32.s, changed to 
+       
+       compile on OS X.
+       
+
+2009-06-30  Zoltan Varga  <vargaz@gmail.com>
+
+       * driver.c (mini_regression): Handle loading errors. Fixes #508869.
+
+2009-06-29  Zoltan Varga  <vargaz@gmail.com>
+
+       * mini-exceptions.c (get_generic_context_from_stack_frame): Fix the case
+       when the generic instance is an instantiation of a subclass of the
+       methods class. Fixes #517166.
+
+2009-06-26  Zoltan Varga  <vargaz@gmail.com>
+
+       * mini-amd64.c (mono_arch_emit_prolog): Fix thread attaching in AOTed
+       code.
+
+       * mini.c (mono_jit_thread_attach): Allow domain to be NULL for calls from
+       AOTed code.
+
+       * CMakeLists.txt: Add minimal support for installation.
+
+2009-06-25  Zoltan Varga  <vargaz@gmail.com>
+
+       * aot-compiler.c (emit_and_reloc_code): Factor out the code to
+       determine whenever a method is directly callable to a separate function.
+
+       * mini-<ARCH>.c tramp-<ARCH>.c: Remove needless casts and add new
+       needed ones as a result of the previous change.
+
+       * mini-<ARCH>.c tramp-<ARCH>.c: Use mgreg_t* as the
+       type of register arrays.
+
+       * mini-trampolines.c tramp-<ARCH>.c aot-runtime.c: Use mgreg_t* as the
+       type of register arrays.
+
+2009-06-24  Jerry Maine  <crashfourit@gmail.com>
+       
+       Contributed under the terms of the MIT/X11 license by
+       Jerry Maine <crashfourit@gail.com>.
+
+       * mini-amd64.c: Added code to convert simd IR to native amd64 sse.
+
+2009-06-24  Zoltan Varga  <vargaz@gmail.com>
+
+       * aot-compiler.c (emit_plt): Define debug labels for most plt entries.
 
 2009-06-24  Neale Ferguson <neale@sinenomine.net>
 
diff --git a/mono/mini/Info.plist b/mono/mini/Info.plist
new file mode 100644 (file)
index 0000000..4ae22bb
--- /dev/null
@@ -0,0 +1,16 @@
+<plist version="1.0">
+<dict>
+    <key>CFBundleDevelopmentRegion</key>
+    <string>English</string>
+    <key>CFBundleIdentifier</key>
+    <string>com.novell.mono</string>
+    <key>CFBundleInfoDictionaryVersion</key>
+    <string>6.0</string>
+    <key>CFBundleName</key>
+    <string>mono</string>
+    <key>CFBundleVersion</key>
+    <string>0.3</string>
+       <key>SecTaskAccess</key>
+       <string>allowed</string>
+</dict>
+</plist>
index fe31efd0d49ef4a3320a5cb37989715d987833d6..1a38defb97277bb97c43e84de06f3d9193079fb2 100644 (file)
@@ -117,7 +117,7 @@ mono_LDADD = \
        $(MONO_DTRACE_OBJECT)
 
 mono_LDFLAGS = \
-       $(static_flags) -export-dynamic $(monobinldflags)
+       $(static_flags) -export-dynamic $(monobinldflags) $(monobin_platform_ldflags)
 
 if DTRACE_G_REQUIRED
 
@@ -304,6 +304,9 @@ test_sources =                      \
        basic-simd.cs
 
 if MONO_DEBUGGER_SUPPORTED
+if PLATFORM_DARWIN
+mono_debugger_arch_sources = mdb-debug-info32-darwin.s
+else
 if AMD64
 mono_debugger_arch_sources = mdb-debug-info64.s
 else
@@ -311,6 +314,7 @@ if X86
 mono_debugger_arch_sources = mdb-debug-info32.s
 endif
 endif
+endif
 mono_debugger_sources = debug-debugger.c debug-debugger.h $(mono_debugger_arch_sources)
 else
 mono_debugger_sources =
@@ -401,14 +405,17 @@ endif
 
 if PLATFORM_WIN32
 os_sources = $(windows_sources)
+monobin_platform_ldflags=
 endif
 
 if PLATFORM_SIGPOSIX
 os_sources = $(posix_sources)
+monobin_platform_ldflags=
 endif
 
 if PLATFORM_DARWIN
 os_sources = $(darwin_sources) $(posix_sources)
+monobin_platform_ldflags=-sectcreate __TEXT __info_plist $(top_srcdir)/mono/mini/Info.plist
 endif
 
 libmono_la_SOURCES = $(common_sources) $(llvm_sources) $(arch_sources) $(os_sources)
index 49ae040dcaf60d03783ab10308d1e11cf242a1ca..6adf8659960501b2515fbe1a2b8cbd2ddead02a3 100644 (file)
@@ -2146,6 +2146,34 @@ add_generic_instances (MonoAotCompile *acfg)
        }
 }
 
+/*
+ * is_direct_callable:
+ *
+ *   Return whenever the method identified by JI is directly callable without 
+ * going through the PLT.
+ */
+static gboolean
+is_direct_callable (MonoAotCompile *acfg, MonoMethod *method, MonoJumpInfo *patch_info)
+{
+       if ((patch_info->type == MONO_PATCH_INFO_METHOD) && (patch_info->data.method->klass->image == acfg->image)) {
+               MonoCompile *callee_cfg = g_hash_table_lookup (acfg->method_to_cfg, patch_info->data.method);
+               if (callee_cfg) {
+                       gboolean direct_callable = TRUE;
+
+                       if (direct_callable && !(!callee_cfg->has_got_slots && (callee_cfg->method->klass->flags & TYPE_ATTRIBUTE_BEFORE_FIELD_INIT)))
+                               direct_callable = FALSE;
+                       if ((callee_cfg->method->iflags & METHOD_IMPL_ATTRIBUTE_SYNCHRONIZED) && (!method || method->wrapper_type != MONO_WRAPPER_SYNCHRONIZED))
+                               // FIXME: Maybe call the wrapper directly ?
+                               direct_callable = FALSE;
+
+                       if (direct_callable)
+                               return TRUE;
+               }
+       }
+
+       return FALSE;
+}
+
 /*
  * emit_and_reloc_code:
  *
@@ -2210,23 +2238,14 @@ emit_and_reloc_code (MonoAotCompile *acfg, MonoMethod *method, guint8 *code, gui
                                 * the same assembly and requires no initialization.
                                 */
                                direct_call = FALSE;
-                               if (!got_only && (patch_info->type == MONO_PATCH_INFO_METHOD) && (patch_info->data.method->klass->image == method->klass->image)) {
-                                       MonoCompile *callee_cfg = g_hash_table_lookup (acfg->method_to_cfg, patch_info->data.method);
-                                       if (callee_cfg) {
-                                               gboolean direct_callable = TRUE;
-
-                                               if (direct_callable && !(!callee_cfg->has_got_slots && (callee_cfg->method->klass->flags & TYPE_ATTRIBUTE_BEFORE_FIELD_INIT)))
-                                                       direct_callable = FALSE;
-                                               if ((callee_cfg->method->iflags & METHOD_IMPL_ATTRIBUTE_SYNCHRONIZED) && method->wrapper_type != MONO_WRAPPER_SYNCHRONIZED)
-                                                       // FIXME: Maybe call the wrapper directly ?
-                                                       direct_callable = FALSE;
-                                               if (direct_callable) {
-                                                       //printf ("DIRECT: %s %s\n", method ? mono_method_full_name (method, TRUE) : "", mono_method_full_name (callee_cfg->method, TRUE));
-                                                       direct_call = TRUE;
-                                                       sprintf (direct_call_target, "%sm_%x", acfg->temp_prefix, get_method_index (acfg, callee_cfg->orig_method));
-                                                       patch_info->type = MONO_PATCH_INFO_NONE;
-                                                       acfg->stats.direct_calls ++;
-                                               }
+                               if ((patch_info->type == MONO_PATCH_INFO_METHOD) && (patch_info->data.method->klass->image == acfg->image)) {
+                                       if (!got_only && is_direct_callable (acfg, method, patch_info)) {
+                                               MonoCompile *callee_cfg = g_hash_table_lookup (acfg->method_to_cfg, patch_info->data.method);
+                                               //printf ("DIRECT: %s %s\n", method ? mono_method_full_name (method, TRUE) : "", mono_method_full_name (callee_cfg->method, TRUE));
+                                               direct_call = TRUE;
+                                               sprintf (direct_call_target, "%sm_%x", acfg->temp_prefix, get_method_index (acfg, callee_cfg->orig_method));
+                                               patch_info->type = MONO_PATCH_INFO_NONE;
+                                               acfg->stats.direct_calls ++;
                                        }
 
                                        acfg->stats.all_calls ++;
@@ -2283,6 +2302,21 @@ emit_and_reloc_code (MonoAotCompile *acfg, MonoMethod *method, guint8 *code, gui
        }
 }
 
+/*
+ * sanitize_symbol:
+ *
+ *   Modify SYMBOL so it only includes characters permissible in symbols.
+ */
+static void
+sanitize_symbol (char *symbol)
+{
+       int i, len = strlen (symbol);
+
+       for (i = 0; i < len; ++i)
+               if (!isalnum (symbol [i]) && (symbol [i] != '_'))
+                       symbol [i] = '_';
+}
+
 static char*
 get_debug_sym (MonoMethod *method, const char *prefix, GHashTable *cache)
 {
@@ -2896,13 +2930,45 @@ emit_plt (MonoAotCompile *acfg)
                emit_label (acfg, label);
 
                if (acfg->aot_opts.write_symbols) {
-                       MonoJumpInfo *patch_info = g_hash_table_lookup (acfg->plt_offset_to_patch, GUINT_TO_POINTER (i));
+                       MonoJumpInfo *ji = g_hash_table_lookup (acfg->plt_offset_to_patch, GUINT_TO_POINTER (i));
+                       char *debug_sym = NULL;
 
-                       if (patch_info && patch_info->type == MONO_PATCH_INFO_METHOD) {
-                               char *debug_sym = get_debug_sym (patch_info->data.method, "plt_", cache);
+                       if (ji) {
+                               switch (ji->type) {
+                               case MONO_PATCH_INFO_METHOD:
+                                       debug_sym = get_debug_sym (ji->data.method, "plt_", cache);
+                                       break;
+                               case MONO_PATCH_INFO_INTERNAL_METHOD:
+                                       debug_sym = g_strdup_printf ("plt__jit_icall_%s", ji->data.name);
+                                       break;
+                               case MONO_PATCH_INFO_CLASS_INIT:
+                                       debug_sym = g_strdup_printf ("plt__class_init_%s", mono_type_get_name (&ji->data.klass->byval_arg));
+                                       sanitize_symbol (debug_sym);
+                                       break;
+                               case MONO_PATCH_INFO_RGCTX_FETCH:
+                                       debug_sym = g_strdup_printf ("plt__rgctx_fetch_%d", acfg->label_generator ++);
+                                       break;
+                               case MONO_PATCH_INFO_ICALL_ADDR: {
+                                       char *s = get_debug_sym (ji->data.method, "", cache);
+                                       
+                                       debug_sym = g_strdup_printf ("plt__icall_native_%s", s);
+                                       g_free (s);
+                                       break;
+                               }
+                               case MONO_PATCH_INFO_JIT_ICALL_ADDR:
+                                       debug_sym = g_strdup_printf ("plt__jit_icall_native_%s", ji->data.name);
+                                       break;
+                               case MONO_PATCH_INFO_GENERIC_CLASS_INIT:
+                                       debug_sym = g_strdup_printf ("plt__generic_class_init");
+                                       break;
+                               default:
+                                       break;
+                               }
 
-                               emit_local_symbol (acfg, debug_sym, NULL, TRUE);
-                               emit_label (acfg, debug_sym);
+                               if (debug_sym) {
+                                       emit_local_symbol (acfg, debug_sym, NULL, TRUE);
+                                       emit_label (acfg, debug_sym);
+                               }
                        }
                }
 
index 2e74244f70d2ca10ddea8b48d7fcf88f83a07201..77342319bb9977a25a6d9a3c4b957cca7646b6ab 100644 (file)
@@ -2528,7 +2528,7 @@ mono_aot_get_plt_entry (guint8 *code)
  *   Return the PLT info offset belonging to the plt entry called by CODE.
  */
 guint32
-mono_aot_get_plt_info_offset (gssize *regs, guint8 *code)
+mono_aot_get_plt_info_offset (mgreg_t *regs, guint8 *code)
 {
        guint8 *plt_entry = mono_aot_get_plt_entry (code);
 
@@ -2952,7 +2952,7 @@ mono_aot_get_method_from_vt_slot (MonoDomain *domain, MonoVTable *vtable, int sl
 }
 
 guint32
-mono_aot_get_plt_info_offset (gssize *regs, guint8 *code)
+mono_aot_get_plt_info_offset (mgreg_t *regs, guint8 *code)
 {
        g_assert_not_reached ();
 
index 803a0e0e22c29bf25be65674db53c4b0cc956c49..bed394fa7a3a0cf81a0b6cc37d6dba44c56fd9c0 100644 (file)
@@ -2905,15 +2905,6 @@ public class SimdTests {
                return 0;
        }
 
-       public static int test_0_sse41_vector8s_min () {
-               Vector8s v = new Vector8s(2);
-               Vector8s v2 = new Vector8s(1);
-               v = v.Min(v2);
-               if (v.V0 != 1 || v.V1 != 1 || v.V2 != 1 || v.V3 != 1 || v.V4 != 1 || v.V5 != 1 || v.V6 != 1 || v.V7 != 1)
-                       return 1;
-               return 0;
-       }
-
        public static int Main () {
                return TestDriver.RunTests (typeof (SimdTests));
        }
index edc67ed35f4afd42a36e3d28651e37f28d75e1f4..a3383aa699fd1dd43b2feef7d4cb26987576d61b 100644 (file)
@@ -368,7 +368,9 @@ mini_regression (MonoImage *image, int verbose, int *total_run)
 
        /* load the metadata */
        for (i = 0; i < mono_image_get_table_rows (image, MONO_TABLE_METHOD); ++i) {
-                       method = mono_get_method (image, MONO_TOKEN_METHOD_DEF | (i + 1), NULL);
+               method = mono_get_method (image, MONO_TOKEN_METHOD_DEF | (i + 1), NULL);
+               if (!method)
+                       continue;
                mono_class_init (method->klass);
 
                if (!strncmp (method->name, "test_", 5) && mini_stats_fd) {
@@ -402,7 +404,9 @@ mini_regression (MonoImage *image, int verbose, int *total_run)
                if (mini_stats_fd)
                        fprintf (mini_stats_fd, "[");
                for (i = 0; i < mono_image_get_table_rows (image, MONO_TABLE_METHOD); ++i) {
-                       method = mono_get_method (image, MONO_TOKEN_METHOD_DEF | (i + 1), NULL);
+                       method = mono_get_method (image, MONO_TOKEN_METHOD_DEF | (i + 1), NULL);
+                       if (!method)
+                               continue;
                        if (strncmp (method->name, "test_", 5) == 0) {
                                expected = atoi (method->name + 5);
                                run++;
index d83b7640c01a9c2ffe8fa4a0e5fd333cd3edf3fc..dab0f785e374bfa007194e4dba90bf1195afc3f7 100644 (file)
@@ -444,6 +444,31 @@ class Tests {
                return idx;
        }
 
+       static int cctor_count = 0;
+
+    public abstract class Beta<TChanged> 
+    {          
+        static Beta()
+        {
+                       cctor_count ++;
+        }
+    }   
+    
+    public class Gamma<T> : Beta<T> 
+    {   
+        static Gamma()
+        {
+        }
+    }
+
+       // #519336    
+       public static int test_2_generic_class_init_gshared_ctor () {
+               new Gamma<object>();
+               new Gamma<string>();
+
+               return cctor_count;
+       }
+
        public static void VirtualInterfaceCallFromGenericMethod <T> (IFoo f) {
                f.Bar <T> ();
        }
diff --git a/mono/mini/mdb-debug-info32-darwin.s b/mono/mini/mdb-debug-info32-darwin.s
new file mode 100644 (file)
index 0000000..d7cb2cb
--- /dev/null
@@ -0,0 +1,13 @@
+.text
+.globl         _MONO_DEBUGGER__debugger_info
+.globl         _MONO_DEBUGGER__notification_function   
+_MONO_DEBUGGER__notification_function:
+               int3
+               ret
+.section       .mdb_debug_info, "aw"
+.globl         _MONO_DEBUGGER__debugger_info_ptr
+.globl         _MONO_DEBUGGER__using_debugger
+_MONO_DEBUGGER__debugger_info_ptr:
+               .long   _MONO_DEBUGGER__debugger_info
+_MONO_DEBUGGER__using_debugger:
+               .quad   0
index 4c9ad867f54dcccd91f95cc1badfd6d973408cae..3a83525de2420e1e01efb859da51e05663b66c06 100644 (file)
@@ -2232,12 +2232,17 @@ mono_emit_rgctx_calli (MonoCompile *cfg, MonoMethodSignature *sig, MonoInst **ar
 #endif
 }
 
+static MonoInst*
+emit_get_rgctx_method (MonoCompile *cfg, int context_used, MonoMethod *cmethod, int rgctx_type);
+
 static MonoInst*
 mono_emit_method_call_full (MonoCompile *cfg, MonoMethod *method, MonoMethodSignature *sig,
                                                        MonoInst **args, MonoInst *this, MonoInst *imt_arg)
 {
+       gboolean might_be_remote;
        gboolean virtual = this != NULL;
        gboolean enable_for_aot = TRUE;
+       int context_used;
        MonoCallInst *call;
 
        if (method->string_ctor) {
@@ -2249,15 +2254,27 @@ mono_emit_method_call_full (MonoCompile *cfg, MonoMethod *method, MonoMethodSign
                sig = ctor_sig;
        }
 
+       might_be_remote = this && sig->hasthis &&
+               (method->klass->marshalbyref || method->klass == mono_defaults.object_class) &&
+               !(method->flags & METHOD_ATTRIBUTE_VIRTUAL) && !MONO_CHECK_THIS (this);
+
+       context_used = mono_method_check_context_used (method);
+       if (might_be_remote && context_used) {
+               MonoInst *addr;
+
+               g_assert (cfg->generic_sharing_context);
+
+               addr = emit_get_rgctx_method (cfg, context_used, method, MONO_RGCTX_INFO_REMOTING_INVOKE_WITH_CHECK);
+
+               return mono_emit_calli (cfg, sig, args, addr);
+       }
+
        call = mono_emit_call_args (cfg, sig, args, FALSE, virtual, FALSE);
 
-       if (this && sig->hasthis && 
-           (method->klass->marshalbyref || method->klass == mono_defaults.object_class) && 
-           !(method->flags & METHOD_ATTRIBUTE_VIRTUAL) && !MONO_CHECK_THIS (this)) {
+       if (might_be_remote)
                call->method = mono_marshal_get_remoting_invoke_with_check (method);
-       } else {
+       else
                call->method = method;
-       }
        call->inst.flags |= MONO_INST_HAS_METHOD;
        call->inst.inst_left = this;
 
@@ -2690,6 +2707,36 @@ emit_get_rgctx_field (MonoCompile *cfg, int context_used,
        return emit_rgctx_fetch (cfg, rgctx, entry);
 }
 
+static void
+emit_generic_class_init (MonoCompile *cfg, MonoClass *klass)
+{
+       MonoInst *vtable_arg;
+       MonoCallInst *call;
+       int context_used = 0;
+
+       if (cfg->generic_sharing_context)
+               context_used = mono_class_check_context_used (klass);
+
+       if (context_used) {
+               vtable_arg = emit_get_rgctx_klass (cfg, context_used,
+                                                                                  klass, MONO_RGCTX_INFO_VTABLE);
+       } else {
+               MonoVTable *vtable = mono_class_vtable (cfg->domain, klass);
+
+               if (!vtable)
+                       return;
+               EMIT_NEW_VTABLECONST (cfg, vtable_arg, vtable);
+       }
+
+       call = (MonoCallInst*)mono_emit_abs_call (cfg, MONO_PATCH_INFO_GENERIC_CLASS_INIT, NULL, helper_sig_generic_class_init_trampoline, &vtable_arg);
+#ifdef MONO_ARCH_VTABLE_REG
+       mono_call_inst_add_outarg_reg (cfg, call, vtable_arg->dreg, MONO_ARCH_VTABLE_REG, FALSE);
+       cfg->uses_vtable_reg = TRUE;
+#else
+       NOT_IMPLEMENTED;
+#endif
+}
+
 static void
 mini_emit_check_array_type (MonoCompile *cfg, MonoInst *obj, MonoClass *array_class)
 {
@@ -6191,6 +6238,13 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b
                        if (*ip != CEE_CALLI && check_call_signature (cfg, fsig, sp))
                                UNVERIFIED;
 
+                       /* 
+                        * If the callee is a shared method, then its static cctor
+                        * might not get called after the call was patched.
+                        */
+                       if (cfg->generic_sharing_context && cmethod && cmethod->klass != method->klass && cmethod->klass->generic_class && mono_method_is_generic_sharable_impl (cmethod, TRUE) && mono_class_needs_cctor_run (cmethod->klass, method)) {
+                               emit_generic_class_init (cfg, cmethod->klass);
+                       }
 
                        if (cmethod && ((cmethod->flags & METHOD_ATTRIBUTE_STATIC) || cmethod->klass->valuetype) &&
                                        (cmethod->klass->generic_class || cmethod->klass->generic_container)) {
@@ -7547,8 +7601,6 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b
                                        INLINE_FAILURE;
                                        ins = mono_emit_rgctx_method_call_full (cfg, cmethod, fsig, sp,
                                                                                                                        callvirt_this_arg, NULL, vtable_arg);
-                                       if (mono_method_is_generic_sharable_impl (cmethod, TRUE) && ((MonoCallInst*)ins)->method->wrapper_type == MONO_WRAPPER_REMOTING_INVOKE_WITH_CHECK)
-                                               GENERIC_SHARING_FAILURE (*ip);
                                }
                        }
 
index 2d5507660d24987c22440b6a9d795cd06bb5b6c5..c696fb6839344495f07dd8557535ca54e90e9465 100644 (file)
@@ -5806,7 +5806,7 @@ mono_arch_print_tree (MonoInst *tree, int arity)
 */
 
 gpointer*
-mono_arch_get_vcall_slot_addr (guint8* code, gpointer *regs)
+mono_arch_get_vcall_slot_addr (guint8* code, mgreg_t *regs)
 {
   unsigned int *pc = (unsigned int *)code;
   guint32 reg, disp;
@@ -5858,7 +5858,7 @@ mono_arch_get_vcall_slot_addr (guint8* code, gpointer *regs)
 }
 
 gpointer
-mono_arch_get_this_arg_from_call (MonoGenericSharingContext *gsctx, MonoMethodSignature *sig, gssize *regs, guint8 *code)
+mono_arch_get_this_arg_from_call (MonoGenericSharingContext *gsctx, MonoMethodSignature *sig, mgreg_t *regs, guint8 *code)
 {
   unsigned int *pc = (unsigned int *)code;
 
index b083dbf2f0632bb4a7e5c325ae95c227a8ddcca0..d51ecaf37898b9f03c6abced860ce6032da4a520 100644 (file)
@@ -916,6 +916,36 @@ mono_arch_cpu_optimizazions (guint32 *exclude_mask)
        return opts;
 }
 
+/*
+ * This function test for all SSE functions supported.
+ *
+ * Returns a bitmask corresponding to all supported versions.
+ * 
+ * TODO detect other versions like SSE4a.
+ */
+guint32
+mono_arch_cpu_enumerate_simd_versions (void)
+{
+       int eax, ebx, ecx, edx;
+       guint32 sse_opts = 0;
+
+       if (cpuid (1, &eax, &ebx, &ecx, &edx)) {
+               if (edx & (1 << 25))
+                       sse_opts |= 1 << SIMD_VERSION_SSE1;
+               if (edx & (1 << 26))
+                       sse_opts |= 1 << SIMD_VERSION_SSE2;
+               if (ecx & (1 << 0))
+                       sse_opts |= 1 << SIMD_VERSION_SSE3;
+               if (ecx & (1 << 9))
+                       sse_opts |= 1 << SIMD_VERSION_SSSE3;
+               if (ecx & (1 << 19))
+                       sse_opts |= 1 << SIMD_VERSION_SSE41;
+               if (ecx & (1 << 20))
+                       sse_opts |= 1 << SIMD_VERSION_SSE42;
+       }
+       return sse_opts;        
+}
+
 GList *
 mono_arch_get_allocatable_int_vars (MonoCompile *cfg)
 {
@@ -4451,6 +4481,158 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
                                amd64_mov_reg_reg (code, ins->dreg, AMD64_RAX, size);
                        break;
                }
+#ifdef MONO_ARCH_SIMD_INTRINSICS
+               case OP_ADDPS:
+                       amd64_sse_addps_reg_reg (code, ins->sreg1, ins->sreg2);
+                       break;
+               case OP_DIVPS:
+                       amd64_sse_divps_reg_reg (code, ins->sreg1, ins->sreg2);
+                       break;
+               case OP_MULPS:
+                       amd64_sse_mulps_reg_reg (code, ins->sreg1, ins->sreg2);
+                       break;
+               case OP_SUBPS:
+                       amd64_sse_subps_reg_reg (code, ins->sreg1, ins->sreg2);
+                       break;
+               case OP_MAXPS:
+                       amd64_sse_maxps_reg_reg (code, ins->sreg1, ins->sreg2);
+                       break;
+               case OP_MINPS:
+                       amd64_sse_minps_reg_reg (code, ins->sreg1, ins->sreg2);
+                       break;
+               case OP_COMPPS:
+                       g_assert (ins->inst_c0 >= 0 && ins->inst_c0 <= 7);
+                       amd64_sse_cmpps_reg_reg_imm (code, ins->sreg1, ins->sreg2, ins->inst_c0);
+                       break;
+               case OP_ANDPS:
+                       amd64_sse_andps_reg_reg (code, ins->sreg1, ins->sreg2);
+                       break;
+               case OP_ANDNPS:
+                       amd64_sse_andnps_reg_reg (code, ins->sreg1, ins->sreg2);
+                       break;
+               case OP_ORPS:
+                       amd64_sse_orps_reg_reg (code, ins->sreg1, ins->sreg2);
+                       break;
+               case OP_XORPS:
+                       amd64_sse_xorps_reg_reg (code, ins->sreg1, ins->sreg2);
+                       break;
+               case OP_SQRTPS:
+                       amd64_sse_sqrtps_reg_reg (code, ins->dreg, ins->sreg1);
+                       break;
+               case OP_RSQRTPS:
+                       amd64_sse_rsqrtps_reg_reg (code, ins->dreg, ins->sreg1);
+                       break;
+               case OP_RCPPS:
+                       amd64_sse_rcpps_reg_reg (code, ins->dreg, ins->sreg1);
+                       break;
+               case OP_ADDSUBPS:
+                       amd64_sse_addsubps_reg_reg (code, ins->sreg1, ins->sreg2);
+                       break;
+               case OP_HADDPS:
+                       amd64_sse_haddps_reg_reg (code, ins->sreg1, ins->sreg2);
+                       break;
+               case OP_HSUBPS:
+                       amd64_sse_hsubps_reg_reg (code, ins->sreg1, ins->sreg2);
+                       break;
+               case OP_DUPPS_HIGH:
+                       amd64_sse_movshdup_reg_reg (code, ins->dreg, ins->sreg1);
+                       break;
+               case OP_DUPPS_LOW:
+                       amd64_sse_movsldup_reg_reg (code, ins->dreg, ins->sreg1);
+                       break;
+
+               case OP_PSHUFLEW_HIGH:
+                       g_assert (ins->inst_c0 >= 0 && ins->inst_c0 <= 0xFF);
+                       amd64_sse_pshufhw_reg_reg_imm (code, ins->dreg, ins->sreg1, ins->inst_c0);
+                       break;
+               case OP_PSHUFLEW_LOW:
+                       g_assert (ins->inst_c0 >= 0 && ins->inst_c0 <= 0xFF);
+                       amd64_sse_pshuflw_reg_reg_imm (code, ins->dreg, ins->sreg1, ins->inst_c0);
+                       break;
+               case OP_PSHUFLED:
+                       g_assert (ins->inst_c0 >= 0 && ins->inst_c0 <= 0xFF);
+                       amd64_sse_pshufd_reg_reg_imm (code, ins->dreg, ins->sreg1, ins->inst_c0);
+                       break;
+
+               case OP_ADDPD:
+                       amd64_sse_addpd_reg_reg (code, ins->sreg1, ins->sreg2);
+                       break;
+               case OP_DIVPD:
+                       amd64_sse_divpd_reg_reg (code, ins->sreg1, ins->sreg2);
+                       break;
+               case OP_MULPD:
+                       amd64_sse_mulpd_reg_reg (code, ins->sreg1, ins->sreg2);
+                       break;
+               case OP_SUBPD:
+                       amd64_sse_subpd_reg_reg (code, ins->sreg1, ins->sreg2);
+                       break;
+               case OP_MAXPD:
+                       amd64_sse_maxpd_reg_reg (code, ins->sreg1, ins->sreg2);
+                       break;
+               case OP_MINPD:
+                       amd64_sse_minpd_reg_reg (code, ins->sreg1, ins->sreg2);
+                       break;
+               case OP_COMPPD:
+                       g_assert (ins->inst_c0 >= 0 && ins->inst_c0 <= 7);
+                       amd64_sse_cmppd_reg_reg_imm (code, ins->sreg1, ins->sreg2, ins->inst_c0);
+                       break;
+               case OP_ANDPD:
+                       amd64_sse_andpd_reg_reg (code, ins->sreg1, ins->sreg2);
+                       break;
+               case OP_ANDNPD:
+                       amd64_sse_andnpd_reg_reg (code, ins->sreg1, ins->sreg2);
+                       break;
+               case OP_ORPD:
+                       amd64_sse_orpd_reg_reg (code, ins->sreg1, ins->sreg2);
+                       break;
+               case OP_XORPD:
+                       amd64_sse_xorpd_reg_reg (code, ins->sreg1, ins->sreg2);
+                       break;
+               /* TODO: This op is in the AMD64 manual but has not been implemented.
+               case OP_SQRTPD:
+                       amd64_sse_sqrtpd_reg_reg (code, ins->dreg, ins->sreg1);
+                       break;
+               */
+               case OP_ADDSUBPD:
+                       amd64_sse_addsubpd_reg_reg (code, ins->sreg1, ins->sreg2);
+                       break;
+               case OP_HADDPD:
+                       amd64_sse_haddpd_reg_reg (code, ins->sreg1, ins->sreg2);
+                       break;
+               case OP_HSUBPD:
+                       amd64_sse_hsubpd_reg_reg (code, ins->sreg1, ins->sreg2);
+                       break;
+               case OP_DUPPD:
+                       amd64_sse_movddup_reg_reg (code, ins->dreg, ins->sreg1);
+                       break;
+
+               case OP_EXTRACT_MASK:
+                       amd64_sse_pmovmskb_reg_reg (code, ins->dreg, ins->sreg1);
+                       break;
+
+               case OP_PAND:
+                       amd64_sse_pand_reg_reg (code, ins->sreg1, ins->sreg2);
+                       break;
+               case OP_POR:
+                       amd64_sse_por_reg_reg (code, ins->sreg1, ins->sreg2);
+                       break;
+               case OP_PXOR:
+                       amd64_sse_pxor_reg_reg (code, ins->sreg1, ins->sreg2);
+                       break;
+
+               case OP_PADDB:
+                       amd64_sse_paddb_reg_reg (code, ins->sreg1, ins->sreg2);
+                       break;
+               case OP_PADDW:
+                       amd64_sse_paddw_reg_reg (code, ins->sreg1, ins->sreg2);
+                       break;
+               case OP_PADDD:
+                       amd64_sse_paddd_reg_reg (code, ins->sreg1, ins->sreg2);
+                       break;
+               case OP_PADDQ:
+                       amd64_sse_paddq_reg_reg (code, ins->sreg1, ins->sreg2);
+                       break;
+#endif
                case OP_LIVERANGE_START: {
                        if (cfg->verbose_level > 1)
                                printf ("R%d START=0x%x\n", MONO_VARINFO (cfg, ins->inst_c0)->vreg, (int)(code - cfg->native_code));
@@ -4973,10 +5155,15 @@ mono_arch_emit_prolog (MonoCompile *cfg)
                        guint8 *buf, *no_domain_branch;
 
                        code = mono_amd64_emit_tls_get (code, AMD64_RAX, appdomain_tls_offset);
-                       if ((domain >> 32) == 0)
-                               amd64_mov_reg_imm_size (code, AMD64_ARG_REG1, domain, 4);
-                       else
-                               amd64_mov_reg_imm_size (code, AMD64_ARG_REG1, domain, 8);
+                       if (cfg->compile_aot) {
+                               /* AOT code is only used in the root domain */
+                               amd64_mov_reg_imm (code, AMD64_ARG_REG1, 0);
+                       } else {
+                               if ((domain >> 32) == 0)
+                                       amd64_mov_reg_imm_size (code, AMD64_ARG_REG1, domain, 4);
+                               else
+                                       amd64_mov_reg_imm_size (code, AMD64_ARG_REG1, domain, 8);
+                       }
                        amd64_alu_reg_reg (code, X86_CMP, AMD64_RAX, AMD64_ARG_REG1);
                        no_domain_branch = code;
                        x86_branch8 (code, X86_CC_NE, 0, 0);
@@ -4995,10 +5182,15 @@ mono_arch_emit_prolog (MonoCompile *cfg)
 #endif
                } else {
                        g_assert (!cfg->compile_aot);
-                       if ((domain >> 32) == 0)
-                               amd64_mov_reg_imm_size (code, AMD64_ARG_REG1, domain, 4);
-                       else
-                               amd64_mov_reg_imm_size (code, AMD64_ARG_REG1, domain, 8);
+                       if (cfg->compile_aot) {
+                               /* AOT code is only used in the root domain */
+                               amd64_mov_reg_imm (code, AMD64_ARG_REG1, 0);
+                       } else {
+                               if ((domain >> 32) == 0)
+                                       amd64_mov_reg_imm_size (code, AMD64_ARG_REG1, domain, 4);
+                               else
+                                       amd64_mov_reg_imm_size (code, AMD64_ARG_REG1, domain, 8);
+                       }
                        code = emit_call (cfg, code, MONO_PATCH_INFO_INTERNAL_METHOD,
                                          (gpointer)"mono_jit_thread_attach", TRUE);
                }
@@ -5007,8 +5199,8 @@ mono_arch_emit_prolog (MonoCompile *cfg)
        if (method->save_lmf) {
                if ((lmf_tls_offset != -1) && !optimize_for_xen) {
                        /*
-                        * Optimized version which uses the mono_lmf TLS variable instead of indirection
-                        * through the mono_lmf_addr TLS variable.
+                        * Optimized version which uses the mono_lmf TLS variable instead of 
+                        * indirection through the mono_lmf_addr TLS variable.
                         */
                        /* %rax = previous_lmf */
                        x86_prefix (code, X86_FS_PREFIX);
@@ -5747,7 +5939,7 @@ mono_breakpoint_clean_code (guint8 *method_start, guint8 *code, int offset, guin
 }
 
 gpointer
-mono_arch_get_vcall_slot (guint8 *code, gpointer *regs, int *displacement)
+mono_arch_get_vcall_slot (guint8 *code, mgreg_t *regs, int *displacement)
 {
        guint8 buf [10];
        guint32 reg;
@@ -5828,7 +6020,7 @@ mono_arch_get_vcall_slot (guint8 *code, gpointer *regs, int *displacement)
        g_assert (reg != AMD64_R11);
 
        *displacement = disp;
-       return regs [reg];
+       return (gpointer)regs [reg];
 }
 
 int
@@ -5853,7 +6045,7 @@ mono_arch_get_this_arg_reg (MonoMethodSignature *sig, MonoGenericSharingContext
 }
 
 gpointer
-mono_arch_get_this_arg_from_call (MonoGenericSharingContext *gsctx, MonoMethodSignature *sig, gssize *regs, guint8 *code)
+mono_arch_get_this_arg_from_call (MonoGenericSharingContext *gsctx, MonoMethodSignature *sig, mgreg_t *regs, guint8 *code)
 {
        return (gpointer)regs [mono_arch_get_this_arg_reg (sig, gsctx, code)];
 }
@@ -6205,20 +6397,20 @@ mono_arch_build_imt_thunk (MonoVTable *vtable, MonoDomain *domain, MonoIMTCheckI
 }
 
 MonoMethod*
-mono_arch_find_imt_method (gpointer *regs, guint8 *code)
+mono_arch_find_imt_method (mgreg_t *regs, guint8 *code)
 {
-       return regs [MONO_ARCH_IMT_REG];
+       return (MonoMethod*)regs [MONO_ARCH_IMT_REG];
 }
 
 MonoObject*
-mono_arch_find_this_argument (gpointer *regs, MonoMethod *method, MonoGenericSharingContext *gsctx)
+mono_arch_find_this_argument (mgreg_t *regs, MonoMethod *method, MonoGenericSharingContext *gsctx)
 {
-       return mono_arch_get_this_arg_from_call (gsctx, mono_method_signature (method), (gssize*)regs, NULL);
+       return mono_arch_get_this_arg_from_call (gsctx, mono_method_signature (method), regs, NULL);
 }
 #endif
 
 MonoVTable*
-mono_arch_find_static_call_vtable (gpointer *regs, guint8 *code)
+mono_arch_find_static_call_vtable (mgreg_t *regs, guint8 *code)
 {
        return (MonoVTable*) regs [MONO_ARCH_RGCTX_REG];
 }
index 2cb0665ae2aebfafcd968008ef478fbe165a6caa..5e3654f86c2c6ca87217531b23371a43fab9f112 100644 (file)
@@ -264,7 +264,7 @@ mono_arch_get_argument_info (MonoMethodSignature *csig, int param_count, MonoJit
 }
 
 static gpointer
-decode_vcall_slot_from_ldr (guint32 ldr, gpointer *regs, int *displacement)
+decode_vcall_slot_from_ldr (guint32 ldr, mgreg_t *regs, int *displacement)
 {
        char *o = NULL;
        int reg, offset = 0;
@@ -280,7 +280,7 @@ decode_vcall_slot_from_ldr (guint32 ldr, gpointer *regs, int *displacement)
 }
 
 gpointer
-mono_arch_get_vcall_slot (guint8 *code_ptr, gpointer *regs, int *displacement)
+mono_arch_get_vcall_slot (guint8 *code_ptr, mgreg_t *regs, int *displacement)
 {
        guint32* code = (guint32*)code_ptr;
 
@@ -466,7 +466,7 @@ mono_arch_get_delegate_invoke_impl (MonoMethodSignature *sig, gboolean has_targe
 }
 
 gpointer
-mono_arch_get_this_arg_from_call (MonoGenericSharingContext *gsctx, MonoMethodSignature *sig, gssize *regs, guint8 *code)
+mono_arch_get_this_arg_from_call (MonoGenericSharingContext *gsctx, MonoMethodSignature *sig, mgreg_t *regs, guint8 *code)
 {
        /* FIXME: handle returning a struct */
        if (MONO_TYPE_ISSTRUCT (sig->ret))
@@ -4350,7 +4350,7 @@ mono_arch_emit_imt_argument (MonoCompile *cfg, MonoCallInst *call, MonoInst *imt
 }
 
 MonoMethod*
-mono_arch_find_imt_method (gpointer *regs, guint8 *code)
+mono_arch_find_imt_method (mgreg_t *regs, guint8 *code)
 {
        guint32 *code_ptr = (guint32*)code;
        code_ptr -= 2;
@@ -4367,13 +4367,13 @@ mono_arch_find_imt_method (gpointer *regs, guint8 *code)
 }
 
 MonoObject*
-mono_arch_find_this_argument (gpointer *regs, MonoMethod *method, MonoGenericSharingContext *gsctx)
+mono_arch_find_this_argument (mgreg_t *regs, MonoMethod *method, MonoGenericSharingContext *gsctx)
 {
-       return mono_arch_get_this_arg_from_call (gsctx, mono_method_signature (method), (gssize*)regs, NULL);
+       return mono_arch_get_this_arg_from_call (gsctx, mono_method_signature (method), regs, NULL);
 }
 
 MonoVTable*
-mono_arch_find_static_call_vtable (gpointer *regs, guint8 *code)
+mono_arch_find_static_call_vtable (mgreg_t *regs, guint8 *code)
 {
        return (MonoVTable*) regs [MONO_ARCH_RGCTX_REG];
 }
index 852aa4161925c6e74ce238b7a1926f2d94ee6d6f..365097d734fbf51d6d944f4a1f83c5e38a904de2 100644 (file)
@@ -307,15 +307,21 @@ get_generic_context_from_stack_frame (MonoJitInfo *ji, gpointer generic_info)
                class = generic_info;
        }
 
-       if (class->generic_class || class->generic_container)
-               context.class_inst = mini_class_get_context (class)->class_inst;
-
        g_assert (!ji->method->klass->generic_container);
        if (ji->method->klass->generic_class)
                method_container_class = ji->method->klass->generic_class->container_class;
        else
                method_container_class = ji->method->klass;
 
+       /* class might refer to a subclass of ji->method's class */
+       while (class->generic_class && class->generic_class->container_class != method_container_class) {
+               class = class->parent;
+               g_assert (class);
+       }
+
+       if (class->generic_class || class->generic_container)
+               context.class_inst = mini_class_get_context (class)->class_inst;
+
        if (class->generic_class)
                g_assert (mono_class_has_parent_and_ignore_generics (class->generic_class->container_class, method_container_class));
        else
@@ -329,7 +335,7 @@ get_method_from_stack_frame (MonoJitInfo *ji, gpointer generic_info)
 {
        MonoGenericContext context;
        MonoMethod *method;
-
+       
        if (!ji->has_generic_jit_info || !mono_jit_info_get_generic_jit_info (ji)->has_this)
                return ji->method;
        context = get_generic_context_from_stack_frame (ji, generic_info);
@@ -1369,7 +1375,7 @@ restore_stack_protection (void)
 }
 
 gpointer
-mono_altstack_restore_prot (gssize *regs, guint8 *code, gpointer *tramp_data, guint8* tramp)
+mono_altstack_restore_prot (mgreg_t *regs, guint8 *code, gpointer *tramp_data, guint8* tramp)
 {
        void (*func)(void) = (gpointer)tramp_data;
        func ();
index f5f1afecc1fc209da40519260b15085d31e05d7b..e881352ad68b30d6833f144de6c784c99856f61f 100644 (file)
@@ -1112,7 +1112,7 @@ emit_memcpy (guint32 *code, int doff, int dreg, int soff, int sreg, int size)
  *  Determine the vtable slot used by a virtual call.
  */
 gpointer*
-mono_arch_get_vcall_slot_addr (guint8 *code8, gpointer *regs)
+mono_arch_get_vcall_slot_addr (guint8 *code8, mgreg_t *regs)
 {
        guint32 *code = (guint32*)((unsigned long)code8 & ~3);
 
index 8b29baa2d609ba68c5bf3921100ff62f67aba24a..c44af5c899bbd5756f67215ca88601901b26cbcb 100644 (file)
@@ -4500,7 +4500,7 @@ mono_arch_get_patch_offset (guint8 *code)
 }
 
 gpointer
-mono_arch_get_vcall_slot (guint8* code, gpointer *regs, int *displacement)
+mono_arch_get_vcall_slot (guint8* code, mgreg_t *regs, int *displacement)
 {
        guint8 *bundle2 = code - 48;
        guint8 *bundle3 = code - 32;
@@ -4558,7 +4558,7 @@ mono_arch_get_vcall_slot (guint8* code, gpointer *regs, int *displacement)
 }
 
 gpointer*
-mono_arch_get_delegate_method_ptr_addr (guint8* code, gpointer *regs)
+mono_arch_get_delegate_method_ptr_addr (guint8* code, mgreg_t *regs)
 {
        NOT_IMPLEMENTED;
 
@@ -4659,7 +4659,7 @@ mono_arch_build_imt_thunk (MonoVTable *vtable, MonoDomain *domain, MonoIMTCheckI
 }
 
 MonoMethod*
-mono_arch_find_imt_method (gpointer *regs, guint8 *code)
+mono_arch_find_imt_method (mgreg_t *regs, guint8 *code)
 {
        return regs [IA64_R9];
 }
@@ -4672,15 +4672,15 @@ mono_arch_emit_imt_argument (MonoCompile *cfg, MonoCallInst *call, MonoInst *imt
 #endif
 
 gpointer
-mono_arch_get_this_arg_from_call (MonoGenericSharingContext *gsctx, MonoMethodSignature *sig, gssize *regs, guint8 *code)
+mono_arch_get_this_arg_from_call (MonoGenericSharingContext *gsctx, MonoMethodSignature *sig, mgreg_t *regs, guint8 *code)
 {
        return (gpointer)regs [IA64_R10];
 }
 
 MonoObject*
-mono_arch_find_this_argument (gpointer *regs, MonoMethod *method, MonoGenericSharingContext *gsctx)
+mono_arch_find_this_argument (mgreg_t *regs, MonoMethod *method, MonoGenericSharingContext *gsctx)
 {
-       return mono_arch_get_this_arg_from_call (gsctx, mono_method_signature (method), (gssize*)regs, NULL);
+       return mono_arch_get_this_arg_from_call (gsctx, mono_method_signature (method), regs, NULL);
 }
 
 gpointer
index ff3098331e8042e019dc99ad69720cfe5a7de8f6..5a9a010f3dedc35b71dab55f2d4964a0acaae0a7 100644 (file)
@@ -508,7 +508,7 @@ mono_arch_get_argument_info (MonoMethodSignature *csig, int param_count, MonoJit
 
 
 gpointer
-mono_arch_get_this_arg_from_call (MonoGenericSharingContext *gsctx, MonoMethodSignature *sig, gssize *regs, guint8 *code)
+mono_arch_get_this_arg_from_call (MonoGenericSharingContext *gsctx, MonoMethodSignature *sig, mgreg_t *regs, guint8 *code)
 {
        /* FIXME: handle returning a struct */
        if (MONO_TYPE_ISSTRUCT (sig->ret))
@@ -5565,20 +5565,20 @@ mono_arch_build_imt_thunk (MonoVTable *vtable, MonoDomain *domain, MonoIMTCheckI
 }
 
 MonoMethod*
-mono_arch_find_imt_method (gpointer *regs, guint8 *code)
+mono_arch_find_imt_method (mgreg_t *regs, guint8 *code)
 {
        return (MonoMethod*) regs [MONO_ARCH_IMT_REG];
 }
 
 MonoObject*
-mono_arch_find_this_argument (gpointer *regs, MonoMethod *method, MonoGenericSharingContext *gsctx)
+mono_arch_find_this_argument (mgreg_t *regs, MonoMethod *method, MonoGenericSharingContext *gsctx)
 {
-       return mono_arch_get_this_arg_from_call (gsctx, mono_method_signature (method), (gssize*)regs, NULL);
+       return mono_arch_get_this_arg_from_call (gsctx, mono_method_signature (method), regs, NULL);
 }
 #endif
 
 MonoVTable*
-mono_arch_find_static_call_vtable (gpointer *regs, guint8 *code)
+mono_arch_find_static_call_vtable (mgreg_t *regs, guint8 *code)
 {
        NOT_IMPLEMENTED;
        return (MonoVTable*) regs [MONO_ARCH_RGCTX_REG];
index 9046264172f0eb7b668297b608db77fcf084fc96..960f81d4e6ec2e5800cef50391bd43afd66465ee 100644 (file)
@@ -322,7 +322,7 @@ mono_ppc_is_direct_call_sequence (guint32 *code)
 }
 
 gpointer
-mono_arch_get_vcall_slot (guint8 *code_ptr, gpointer *regs, int *displacement)
+mono_arch_get_vcall_slot (guint8 *code_ptr, mgreg_t *regs, int *displacement)
 {
        char *o = NULL;
        int reg, offset = 0;
@@ -504,7 +504,7 @@ mono_arch_get_delegate_invoke_impl (MonoMethodSignature *sig, gboolean has_targe
 }
 
 gpointer
-mono_arch_get_this_arg_from_call (MonoGenericSharingContext *gsctx, MonoMethodSignature *sig, gssize *regs, guint8 *code)
+mono_arch_get_this_arg_from_call (MonoGenericSharingContext *gsctx, MonoMethodSignature *sig, mgreg_t *regs, guint8 *code)
 {
        /* FIXME: handle returning a struct */
        if (MONO_TYPE_ISSTRUCT (sig->ret))
@@ -5268,8 +5268,6 @@ setup_tls_access (void)
                conf_size = confstr ( _CS_GNU_LIBPTHREAD_VERSION, confbuf, sizeof(confbuf));
                if ((conf_size > 4) && (strncmp (confbuf, "NPTL", 4) == 0))
                        tls_mode = TLS_MODE_NPTL;
-               else
-                       tls_mode = TLS_MODE_LTHREADS;
 #else
                ins = (guint32*)pthread_getspecific;
                /* uncond branch to the real method */
@@ -5344,6 +5342,10 @@ setup_tls_access (void)
                }
 #endif
        }
+       if (tls_mode == TLS_MODE_DETECT)
+               tls_mode = TLS_MODE_FAILED;
+       if (tls_mode == TLS_MODE_FAILED)
+               return;
        if ((monodomain_key == -1) && (tls_mode == TLS_MODE_NPTL)) {
                monodomain_key = mono_domain_get_tls_offset();
        }
@@ -5557,20 +5559,20 @@ mono_arch_build_imt_thunk (MonoVTable *vtable, MonoDomain *domain, MonoIMTCheckI
 }
 
 MonoMethod*
-mono_arch_find_imt_method (gpointer *regs, guint8 *code)
+mono_arch_find_imt_method (mgreg_t *regs, guint8 *code)
 {
        return (MonoMethod*) regs [MONO_ARCH_IMT_REG];
 }
 
 MonoObject*
-mono_arch_find_this_argument (gpointer *regs, MonoMethod *method, MonoGenericSharingContext *gsctx)
+mono_arch_find_this_argument (mgreg_t *regs, MonoMethod *method, MonoGenericSharingContext *gsctx)
 {
-       return mono_arch_get_this_arg_from_call (gsctx, mono_method_signature (method), (gssize*)regs, NULL);
+       return mono_arch_get_this_arg_from_call (gsctx, mono_method_signature (method), regs, NULL);
 }
 #endif
 
 MonoVTable*
-mono_arch_find_static_call_vtable (gpointer *regs, guint8 *code)
+mono_arch_find_static_call_vtable (mgreg_t *regs, guint8 *code)
 {
        return (MonoVTable*) regs [MONO_ARCH_RGCTX_REG];
 }
index 5fbaa05661f3a49279890ae51857faf08b94c7df..fb35e2a60f85f02b92a9bd822ccbbdc1dfb9e045 100644 (file)
@@ -334,6 +334,6 @@ extern void mono_ppc_emitted (guint8 *code, ssize_t length, const char *format,
 
 gboolean mono_ppc_is_direct_call_sequence (guint32 *code) MONO_INTERNAL;
 
-void mono_ppc_patch_plt_entry (guint8 *code, gpointer *got, gssize *regs, guint8 *addr) MONO_INTERNAL;
+void mono_ppc_patch_plt_entry (guint8 *code, gpointer *got, mgreg_t *regs, guint8 *addr) MONO_INTERNAL;
 
 #endif /* __MONO_MINI_PPC_H__ */
index e00d95736f55b406836bc530c501e987c4369c2d..687878c52fd57a9758413adc404818a539b843d6 100644 (file)
@@ -2248,7 +2248,7 @@ mono_sparc_is_virtual_call (guint32 *code)
  *  Determine the vtable slot used by a virtual call.
  */
 gpointer
-mono_arch_get_vcall_slot (guint8 *code8, gpointer *regs, int *displacement)
+mono_arch_get_vcall_slot (guint8 *code8, mgreg_t *regs, int *displacement)
 {
        guint32 *code = (guint32*)(gpointer)code8;
        guint32 ins = code [0];
@@ -2416,7 +2416,7 @@ mono_arch_build_imt_thunk (MonoVTable *vtable, MonoDomain *domain, MonoIMTCheckI
 }
 
 MonoMethod*
-mono_arch_find_imt_method (gpointer *regs, guint8 *code)
+mono_arch_find_imt_method (mgreg_t *regs, guint8 *code)
 {
 #ifdef SPARCV9
        g_assert_not_reached ();
@@ -2426,7 +2426,7 @@ mono_arch_find_imt_method (gpointer *regs, guint8 *code)
 }
 
 MonoObject*
-mono_arch_find_this_argument (gpointer *regs, MonoMethod *method, MonoGenericSharingContext *gsctx)
+mono_arch_find_this_argument (mgreg_t *regs, MonoMethod *method, MonoGenericSharingContext *gsctx)
 {
        mono_sparc_flushw ();
 
index 89aa41f5c8e2bc06a539b47f460b64a0d0f79f54..6d1c171bf0c67c380b50265a6b2c3d9313f6a048 100644 (file)
@@ -176,7 +176,7 @@ static void * __builtin_frame_address(int depth)
 
 gboolean mono_sparc_is_virtual_call (guint32 *code);
 
-gpointer* mono_sparc_get_vcall_slot_addr (guint32 *code, gpointer *regs);
+gpointer* mono_sparc_get_vcall_slot_addr (guint32 *code, mgreg_t *regs);
 
 void mono_sparc_flushw (void);
 
index 9010ae6ff6fb42f214960c3d050cf4ba2b31da06..a7b102f50b3c733c335ab69003239dc5c8397f9e 100644 (file)
@@ -30,12 +30,20 @@ static GHashTable *rgctx_lazy_fetch_trampoline_hash_addr = NULL;
 static CRITICAL_SECTION trampolines_mutex;
 
 static gpointer
-get_unbox_trampoline (MonoGenericSharingContext *gsctx, MonoMethod *m, gpointer addr)
+get_unbox_trampoline (MonoGenericSharingContext *gsctx, MonoMethod *m, gpointer addr, gboolean need_rgctx_tramp)
 {
-       if (mono_aot_only)
-               return mono_aot_get_unbox_trampoline (m);
-       else
+       if (mono_aot_only) {
+               if (need_rgctx_tramp)
+                       /* 
+                        * The unbox trampolines call the method directly, so need to add
+                        * an rgctx tramp before them.
+                        */
+                       return mono_create_static_rgctx_trampoline (m, mono_aot_get_unbox_trampoline (m));
+               else
+                       return mono_aot_get_unbox_trampoline (m);
+       } else {
                return mono_arch_get_unbox_trampoline (gsctx, m, addr);
+       }
 }
 
 #ifdef MONO_ARCH_HAVE_STATIC_RGCTX_TRAMPOLINE
@@ -98,7 +106,7 @@ mono_create_static_rgctx_trampoline (MonoMethod *m, gpointer addr)
 #endif
 
 gpointer*
-mono_get_vcall_slot_addr (guint8* code, gpointer *regs)
+mono_get_vcall_slot_addr (guint8* code, mgreg_t *regs)
 {
        gpointer vt;
        int displacement;
@@ -111,7 +119,7 @@ mono_get_vcall_slot_addr (guint8* code, gpointer *regs)
 #ifdef MONO_ARCH_HAVE_IMT
 
 static gpointer*
-mono_convert_imt_slot_to_vtable_slot (gpointer* slot, gpointer *regs, guint8 *code, MonoMethod *method, MonoMethod **impl_method, gboolean *need_rgctx_tramp)
+mono_convert_imt_slot_to_vtable_slot (gpointer* slot, mgreg_t *regs, guint8 *code, MonoMethod *method, MonoMethod **impl_method, gboolean *need_rgctx_tramp)
 {
        MonoGenericSharingContext *gsctx = mono_get_generic_context_from_code (code);
        MonoObject *this_argument = mono_arch_find_this_argument (regs, method, gsctx);
@@ -192,7 +200,7 @@ mono_convert_imt_slot_to_vtable_slot (gpointer* slot, gpointer *regs, guint8 *co
  *   This trampoline handles calls from JITted code.
  */
 gpointer
-mono_magic_trampoline (gssize *regs, guint8 *code, MonoMethod *m, guint8* tramp)
+mono_magic_trampoline (mgreg_t *regs, guint8 *code, MonoMethod *m, guint8* tramp)
 {
        gpointer addr;
        gpointer *vtable_slot;
@@ -205,7 +213,7 @@ mono_magic_trampoline (gssize *regs, guint8 *code, MonoMethod *m, guint8* tramp)
 
        if (m == MONO_FAKE_VTABLE_METHOD) {
                int displacement;
-               MonoVTable *vt = mono_arch_get_vcall_slot (code, (gpointer*)regs, &displacement);
+               MonoVTable *vt = mono_arch_get_vcall_slot (code, regs, &displacement);
                if (!vt) {
                        int i;
                        MonoJitInfo *ji;
@@ -229,7 +237,7 @@ mono_magic_trampoline (gssize *regs, guint8 *code, MonoMethod *m, guint8* tramp)
                        if (addr)
                                addr = mono_create_ftnptr (mono_domain_get (), addr);
                        if (addr && !vt->klass->valuetype) {
-                               vtable_slot = mono_get_vcall_slot_addr (code, (gpointer*)regs);
+                               vtable_slot = mono_get_vcall_slot_addr (code, regs);
                                if (mono_aot_is_got_entry (code, (guint8*)vtable_slot) || mono_domain_owns_vtable_slot (mono_domain_get (), vtable_slot)) {
                                        *vtable_slot = mono_get_addr_from_ftnptr (addr);
                                }
@@ -259,19 +267,19 @@ mono_magic_trampoline (gssize *regs, guint8 *code, MonoMethod *m, guint8* tramp)
                /* we get the interface method because mono_convert_imt_slot_to_vtable_slot ()
                 * needs the signature to be able to find the this argument
                 */
-               m = mono_arch_find_imt_method ((gpointer*)regs, code);
-               vtable_slot = mono_get_vcall_slot_addr (code, (gpointer*)regs);
+               m = mono_arch_find_imt_method (regs, code);
+               vtable_slot = mono_get_vcall_slot_addr (code, regs);
                g_assert (vtable_slot);
 
                gsctx = mono_get_generic_context_from_code (code);
-               this_arg = mono_arch_find_this_argument ((gpointer*)regs, m, gsctx);
+               this_arg = mono_arch_find_this_argument (regs, m, gsctx);
 
                if (this_arg->vtable->klass == mono_defaults.transparent_proxy_class) {
                        /* Use the slow path for now */
                        proxy = TRUE;
                    m = mono_object_get_virtual_method (this_arg, m);
                } else {
-                       vtable_slot = mono_convert_imt_slot_to_vtable_slot (vtable_slot, (gpointer*)regs, code, m, &impl_method, &need_rgctx_tramp);
+                       vtable_slot = mono_convert_imt_slot_to_vtable_slot (vtable_slot, regs, code, m, &impl_method, &need_rgctx_tramp);
                        /* mono_convert_imt_slot_to_vtable_slot () also gives us the method that is supposed
                         * to be called, so we compile it and go ahead as usual.
                         */
@@ -303,7 +311,7 @@ mono_magic_trampoline (gssize *regs, guint8 *code, MonoMethod *m, guint8* tramp)
                        g_assert (!m->klass->generic_container);
 
 #ifdef MONO_ARCH_HAVE_IMT
-               generic_virtual = mono_arch_find_imt_method ((gpointer*)regs, code);
+               generic_virtual = mono_arch_find_imt_method (regs, code);
 #endif
                if (generic_virtual) {
                        g_assert (generic_virtual->is_inflated);
@@ -326,7 +334,7 @@ mono_magic_trampoline (gssize *regs, guint8 *code, MonoMethod *m, guint8* tramp)
 
                if (m->is_inflated && mono_method_get_context (m)->method_inst) {
 #ifdef MONO_ARCH_RGCTX_REG
-                       MonoMethodRuntimeGenericContext *mrgctx = (MonoMethodRuntimeGenericContext*)mono_arch_find_static_call_vtable ((gpointer*)regs, code);
+                       MonoMethodRuntimeGenericContext *mrgctx = (MonoMethodRuntimeGenericContext*)mono_arch_find_static_call_vtable (regs, code);
 
                        klass = mrgctx->class_vtable->klass;
                        method_inst = mrgctx->method_inst;
@@ -335,7 +343,7 @@ mono_magic_trampoline (gssize *regs, guint8 *code, MonoMethod *m, guint8* tramp)
 #endif
                } else if ((m->flags & METHOD_ATTRIBUTE_STATIC) || m->klass->valuetype) {
 #ifdef MONO_ARCH_RGCTX_REG
-                       MonoVTable *vtable = mono_arch_find_static_call_vtable ((gpointer*)regs, code);
+                       MonoVTable *vtable = mono_arch_find_static_call_vtable (regs, code);
 
                        klass = vtable->klass;
 #else
@@ -343,11 +351,11 @@ mono_magic_trampoline (gssize *regs, guint8 *code, MonoMethod *m, guint8* tramp)
 #endif
                } else {
 #ifdef MONO_ARCH_HAVE_IMT
-                       MonoObject *this_argument = mono_arch_find_this_argument ((gpointer*)regs, m,
+                       MonoObject *this_argument = mono_arch_find_this_argument (regs, m,
                                mono_get_generic_context_from_code (code));
 
                        vt = this_argument->vtable;
-                       vtable_slot = mono_get_vcall_slot_addr (code, (gpointer*)regs);
+                       vtable_slot = mono_get_vcall_slot_addr (code, regs);
 
                        g_assert (this_argument->vtable->klass->inited);
                        //mono_class_init (this_argument->vtable->klass);
@@ -428,13 +436,13 @@ mono_magic_trampoline (gssize *regs, guint8 *code, MonoMethod *m, guint8* tramp)
 
        if (generic_virtual) {
                int displacement;
-               MonoVTable *vt = mono_arch_get_vcall_slot (code, (gpointer*)regs, &displacement);
+               MonoVTable *vt = mono_arch_get_vcall_slot (code, regs, &displacement);
 
-               vtable_slot = mono_get_vcall_slot_addr (code, (gpointer*)regs);
+               vtable_slot = mono_get_vcall_slot_addr (code, regs);
                g_assert (vtable_slot);
 
                if (vt->klass->valuetype)
-                       addr = get_unbox_trampoline (mono_get_generic_context_from_code (code), m, addr);                       
+                       addr = get_unbox_trampoline (mono_get_generic_context_from_code (code), m, addr, need_rgctx_tramp);
 
                mono_method_add_generic_virtual_invocation (mono_domain_get (), 
                                                                                                        vt, vtable_slot,
@@ -471,16 +479,16 @@ mono_magic_trampoline (gssize *regs, guint8 *code, MonoMethod *m, guint8* tramp)
                return addr;
        }
 
-       vtable_slot = mono_get_vcall_slot_addr (code, (gpointer*)regs);
+       vtable_slot = mono_get_vcall_slot_addr (code, regs);
 
        if (vtable_slot) {
                if (m->klass->valuetype)
-                       addr = get_unbox_trampoline (mono_get_generic_context_from_code (code), m, addr);
+                       addr = get_unbox_trampoline (mono_get_generic_context_from_code (code), m, addr, need_rgctx_tramp);
                g_assert (*vtable_slot);
 
                if (!proxy && (mono_aot_is_got_entry (code, (guint8*)vtable_slot) || mono_domain_owns_vtable_slot (mono_domain_get (), vtable_slot))) {
 #ifdef MONO_ARCH_HAVE_IMT
-                       vtable_slot = mono_convert_imt_slot_to_vtable_slot (vtable_slot, (gpointer*)regs, code, m, NULL, &need_rgctx_tramp);
+                       vtable_slot = mono_convert_imt_slot_to_vtable_slot (vtable_slot, regs, code, m, NULL, &need_rgctx_tramp);
 #endif
                        *vtable_slot = mono_get_addr_from_ftnptr (addr);
                }
@@ -523,7 +531,7 @@ mono_magic_trampoline (gssize *regs, guint8 *code, MonoMethod *m, guint8* tramp)
  *   This trampoline handles virtual calls when using LLVM.
  */
 static gpointer
-mono_llvm_vcall_trampoline (gssize *regs, guint8 *code, MonoMethod *m, guint8 *tramp)
+mono_llvm_vcall_trampoline (mgreg_t *regs, guint8 *code, MonoMethod *m, guint8 *tramp)
 {
        MonoObject *this;
        gpointer addr;
@@ -564,14 +572,14 @@ mono_llvm_vcall_trampoline (gssize *regs, guint8 *code, MonoMethod *m, guint8 *t
        g_assert (addr);
 
        if (m->klass->valuetype)
-               addr = get_unbox_trampoline (mono_get_generic_context_from_code (code), m, addr);
+               addr = get_unbox_trampoline (mono_get_generic_context_from_code (code), m, addr, need_rgctx_tramp);
 
        vtable_slot = &(vt->vtable [mono_method_get_vtable_slot (m)]);
        g_assert (*vtable_slot);
 
        if (!proxy && (mono_aot_is_got_entry (code, (guint8*)vtable_slot) || mono_domain_owns_vtable_slot (mono_domain_get (), vtable_slot))) {
 #ifdef MONO_ARCH_HAVE_IMT
-               vtable_slot = mono_convert_imt_slot_to_vtable_slot (vtable_slot, (gpointer*)regs, code, m, NULL, &need_rgctx_tramp);
+               vtable_slot = mono_convert_imt_slot_to_vtable_slot (vtable_slot, regs, code, m, NULL, &need_rgctx_tramp);
 #endif
                *vtable_slot = mono_get_addr_from_ftnptr (addr);
          }
@@ -583,7 +591,7 @@ mono_llvm_vcall_trampoline (gssize *regs, guint8 *code, MonoMethod *m, guint8 *t
 #endif
 
 gpointer
-mono_generic_virtual_remoting_trampoline (gssize *regs, guint8 *code, MonoMethod *m, guint8 *tramp)
+mono_generic_virtual_remoting_trampoline (mgreg_t *regs, guint8 *code, MonoMethod *m, guint8 *tramp)
 {
        MonoGenericContext context = { NULL, NULL };
        MonoMethod *imt_method, *declaring;
@@ -602,7 +610,7 @@ mono_generic_virtual_remoting_trampoline (gssize *regs, guint8 *code, MonoMethod
                g_assert (!m->klass->generic_container);
 
 #ifdef MONO_ARCH_HAVE_IMT
-       imt_method = mono_arch_find_imt_method ((gpointer*)regs, code);
+       imt_method = mono_arch_find_imt_method (regs, code);
        if (imt_method->is_inflated)
                context.method_inst = ((MonoMethodInflated*)imt_method)->context.method_inst;
 #endif
@@ -625,7 +633,7 @@ mono_generic_virtual_remoting_trampoline (gssize *regs, guint8 *code, MonoMethod
  */
 #ifdef MONO_ARCH_AOT_SUPPORTED
 gpointer
-mono_aot_trampoline (gssize *regs, guint8 *code, guint8 *token_info, 
+mono_aot_trampoline (mgreg_t *regs, guint8 *code, guint8 *token_info, 
                                         guint8* tramp)
 {
        MonoImage *image;
@@ -652,7 +660,7 @@ mono_aot_trampoline (gssize *regs, guint8 *code, guint8 *token_info,
 
        addr = mono_create_ftnptr (mono_domain_get (), addr);
 
-       vtable_slot = mono_get_vcall_slot_addr (code, (gpointer*)regs);
+       vtable_slot = mono_get_vcall_slot_addr (code, regs);
        g_assert (!vtable_slot);
 
        /* This is a normal call through a PLT entry */
@@ -673,7 +681,7 @@ mono_aot_trampoline (gssize *regs, guint8 *code, guint8 *token_info,
 #ifdef MONO_ARCH_HAVE_IMT
                if (!method)
                        method = mono_get_method (image, token, NULL);
-               vtable_slot = mono_convert_imt_slot_to_vtable_slot (vtable_slot, (gpointer*)regs, code, method, NULL, &need_rgctx_tramp);
+               vtable_slot = mono_convert_imt_slot_to_vtable_slot (vtable_slot, regs, code, method, NULL, &need_rgctx_tramp);
 #endif
                *vtable_slot = addr;
        }
@@ -687,7 +695,7 @@ mono_aot_trampoline (gssize *regs, guint8 *code, guint8 *token_info,
  *   This trampoline handles calls made from AOT code through the PLT table.
  */
 gpointer
-mono_aot_plt_trampoline (gssize *regs, guint8 *code, guint8 *aot_module, 
+mono_aot_plt_trampoline (mgreg_t *regs, guint8 *code, guint8 *aot_module, 
                                                 guint8* tramp)
 {
        guint32 plt_info_offset = mono_aot_get_plt_info_offset (regs, code);
@@ -703,7 +711,7 @@ mono_aot_plt_trampoline (gssize *regs, guint8 *code, guint8 *aot_module,
  * for the type, then patches the caller code so it is not called again.
  */
 void
-mono_class_init_trampoline (gssize *regs, guint8 *code, MonoVTable *vtable, guint8 *tramp)
+mono_class_init_trampoline (mgreg_t *regs, guint8 *code, MonoVTable *vtable, guint8 *tramp)
 {
        guint8 *plt_entry = mono_aot_get_plt_entry (code);
 
@@ -723,19 +731,20 @@ mono_class_init_trampoline (gssize *regs, guint8 *code, MonoVTable *vtable, guin
  * for the type.
  */
 void
-mono_generic_class_init_trampoline (gssize *regs, guint8 *code, MonoVTable *vtable, guint8 *tramp)
+mono_generic_class_init_trampoline (mgreg_t *regs, guint8 *code, MonoVTable *vtable, guint8 *tramp)
 {
        mono_runtime_class_init (vtable);
 }
 
 static gpointer
-mono_rgctx_lazy_fetch_trampoline (gssize *regs, guint8 *code, gpointer data, guint8 *tramp)
+mono_rgctx_lazy_fetch_trampoline (mgreg_t *regs, guint8 *code, gpointer data, guint8 *tramp)
 {
 #ifdef MONO_ARCH_VTABLE_REG
        static gboolean inited = FALSE;
        static int num_lookups = 0;
        guint32 slot = GPOINTER_TO_UINT (data);
-       gpointer arg = (gpointer)(gssize)regs [MONO_ARCH_VTABLE_REG];
+       mgreg_t *r = (mgreg_t*)regs;
+       gpointer arg = (gpointer)(gssize)r [MONO_ARCH_VTABLE_REG];
        guint32 index = MONO_RGCTX_SLOT_INDEX (slot);
        gboolean mrgctx = MONO_RGCTX_SLOT_IS_MRGCTX (slot);
 
@@ -756,13 +765,13 @@ mono_rgctx_lazy_fetch_trampoline (gssize *regs, guint8 *code, gpointer data, gui
 }
 
 void
-mono_monitor_enter_trampoline (gssize *regs, guint8 *code, MonoObject *obj, guint8 *tramp)
+mono_monitor_enter_trampoline (mgreg_t *regs, guint8 *code, MonoObject *obj, guint8 *tramp)
 {
        mono_monitor_enter (obj);
 }
 
 void
-mono_monitor_exit_trampoline (gssize *regs, guint8 *code, MonoObject *obj, guint8 *tramp)
+mono_monitor_exit_trampoline (mgreg_t *regs, guint8 *code, MonoObject *obj, guint8 *tramp)
 {
        mono_monitor_exit (obj);
 }
@@ -776,7 +785,7 @@ mono_monitor_exit_trampoline (gssize *regs, guint8 *code, MonoObject *obj, guint
  * This is called once the first time a delegate is invoked, so it must be fast.
  */
 gpointer
-mono_delegate_trampoline (gssize *regs, guint8 *code, gpointer *tramp_data, guint8* tramp)
+mono_delegate_trampoline (mgreg_t *regs, guint8 *code, gpointer *tramp_data, guint8* tramp)
 {
        MonoDomain *domain = mono_domain_get ();
        MonoDelegate *delegate;
index e8239ff80f79a0ba985129bde20dc2e29da42fde..1ee4ae4940d00ae43791bba239dc58318592eed9 100644 (file)
@@ -5113,13 +5113,13 @@ mono_arch_build_imt_thunk (MonoVTable *vtable, MonoDomain *domain, MonoIMTCheckI
 }
 
 MonoMethod*
-mono_arch_find_imt_method (gpointer *regs, guint8 *code)
+mono_arch_find_imt_method (mgreg_t *regs, guint8 *code)
 {
        return (MonoMethod*) regs [MONO_ARCH_IMT_REG];
 }
 
 MonoObject*
-mono_arch_find_this_argument (gpointer *regs, MonoMethod *method, MonoGenericSharingContext *gsctx)
+mono_arch_find_this_argument (mgreg_t *regs, MonoMethod *method, MonoGenericSharingContext *gsctx)
 {
        MonoMethodSignature *sig = mono_method_signature (method);
        CallInfo *cinfo = get_call_info (gsctx, NULL, sig, FALSE);
@@ -5142,7 +5142,7 @@ mono_arch_find_this_argument (gpointer *regs, MonoMethod *method, MonoGenericSha
 #endif
 
 MonoVTable*
-mono_arch_find_static_call_vtable (gpointer *regs, guint8 *code)
+mono_arch_find_static_call_vtable (mgreg_t *regs, guint8 *code)
 {
        return (MonoVTable*) regs [MONO_ARCH_RGCTX_REG];
 }
@@ -5322,7 +5322,7 @@ mono_breakpoint_clean_code (guint8 *method_start, guint8 *code, int offset, guin
 }
 
 gpointer
-mono_arch_get_vcall_slot (guint8 *code, gpointer *regs, int *displacement)
+mono_arch_get_vcall_slot (guint8 *code, mgreg_t *regs, int *displacement)
 {
        guint8 buf [8];
        guint8 reg = 0;
@@ -5366,12 +5366,12 @@ mono_arch_get_vcall_slot (guint8 *code, gpointer *regs, int *displacement)
                return NULL;
 
        *displacement = disp;
-       return regs [reg];
+       return (gpointer)regs [reg];
 }
 
 gpointer
 mono_arch_get_this_arg_from_call (MonoGenericSharingContext *gsctx, MonoMethodSignature *sig,
-               gssize *regs, guint8 *code)
+               mgreg_t *regs, guint8 *code)
 {
        guint32 esp = regs [X86_ESP];
        CallInfo *cinfo = NULL;
index b67cbdb71e05394b6f6f315a26fd5f0e5af0a062..8c8979a3f710eb25570cef7de488d560b1bf6ad7 100644 (file)
@@ -2172,6 +2172,13 @@ mono_get_lmf_addr (void)
 void
 mono_jit_thread_attach (MonoDomain *domain)
 {
+       if (!domain)
+               /* 
+                * Happens when called from AOTed code which is only used in the root
+                * domain.
+                */
+               domain = mono_get_root_domain ();
+
 #ifdef HAVE_KW_THREAD
        if (!mono_lmf_addr) {
                mono_thread_attach (domain);
@@ -4728,6 +4735,8 @@ mini_init (const char *filename, const char *runtime_version)
        if (!default_opt_set)
                default_opt = mono_parse_default_optimizations (NULL);
 
+       InitializeCriticalSection (&jit_mutex);
+
 #ifdef MONO_DEBUGGER_SUPPORTED
        if (mini_debug_running_inside_mdb ())
                mini_debugger_init ();
@@ -4739,8 +4748,6 @@ mini_init (const char *filename, const char *runtime_version)
        mono_runtime_set_has_tls_get (FALSE);
 #endif
 
-       InitializeCriticalSection (&jit_mutex);
-
        if (!global_codeman)
                global_codeman = mono_code_manager_new ();
        jit_icall_name_hash = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
@@ -4830,6 +4837,8 @@ mini_init (const char *filename, const char *runtime_version)
        mono_install_get_class_from_name (mono_aot_get_class_from_name);
        mono_install_jit_info_find_in_aot (mono_aot_find_jit_info);
 
+       mono_install_get_ip_from_sigctx (mono_arch_ip_from_context);
+
        if (runtime_version)
                domain = mono_init_version (filename, runtime_version);
        else
index 01dbeaa3c1fb0aa173f9234a48205d81eb4de33f..e2ca9b14188b1180de8bd7ba1b00d603eee78b62 100644 (file)
@@ -1401,7 +1401,7 @@ gpointer  mono_aot_get_method               (MonoDomain *domain,
 gpointer  mono_aot_get_method_from_token    (MonoDomain *domain, MonoImage *image, guint32 token) MONO_INTERNAL;
 gboolean  mono_aot_is_got_entry             (guint8 *code, guint8 *addr) MONO_INTERNAL;
 guint8*   mono_aot_get_plt_entry            (guint8 *code) MONO_INTERNAL;
-guint32   mono_aot_get_plt_info_offset      (gssize *regs, guint8 *code) MONO_INTERNAL;
+guint32   mono_aot_get_plt_info_offset      (mgreg_t *regs, guint8 *code) MONO_INTERNAL;
 gboolean  mono_aot_get_cached_class_info    (MonoClass *klass, MonoCachedClassInfo *res) MONO_INTERNAL;
 gboolean  mono_aot_get_class_from_name      (MonoImage *image, const char *name_space, const char *name, MonoClass **klass) MONO_INTERNAL;
 MonoJitInfo* mono_aot_find_jit_info         (MonoDomain *domain, MonoImage *image, gpointer addr) MONO_INTERNAL;
@@ -1472,20 +1472,20 @@ gpointer          mono_create_static_rgctx_trampoline (MonoMethod *m, gpointer a
 gpointer          mono_create_llvm_vcall_trampoline (MonoMethod *method) MONO_INTERNAL;
 MonoVTable*       mono_find_class_init_trampoline_by_addr (gconstpointer addr) MONO_INTERNAL;
 guint32           mono_find_rgctx_lazy_fetch_trampoline_by_addr (gconstpointer addr) MONO_INTERNAL;
-gpointer          mono_magic_trampoline (gssize *regs, guint8 *code, MonoMethod *m, guint8* tramp) MONO_INTERNAL;
-gpointer          mono_generic_virtual_remoting_trampoline (gssize *regs, guint8 *code, MonoMethod *m, guint8 *tramp) MONO_INTERNAL;
-gpointer          mono_delegate_trampoline (gssize *regs, guint8 *code, gpointer *tramp_data, guint8* tramp) MONO_INTERNAL;
-gpointer          mono_aot_trampoline (gssize *regs, guint8 *code, guint8 *token_info, 
+gpointer          mono_magic_trampoline (mgreg_t *regs, guint8 *code, MonoMethod *m, guint8* tramp) MONO_INTERNAL;
+gpointer          mono_generic_virtual_remoting_trampoline (mgreg_t *regs, guint8 *code, MonoMethod *m, guint8 *tramp) MONO_INTERNAL;
+gpointer          mono_delegate_trampoline (mgreg_t *regs, guint8 *code, gpointer *tramp_data, guint8* tramp) MONO_INTERNAL;
+gpointer          mono_aot_trampoline (mgreg_t *regs, guint8 *code, guint8 *token_info, 
                                                                           guint8* tramp) MONO_INTERNAL;
-gpointer          mono_aot_plt_trampoline (gssize *regs, guint8 *code, guint8 *token_info, 
+gpointer          mono_aot_plt_trampoline (mgreg_t *regs, guint8 *code, guint8 *token_info, 
                                                                                   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, MonoVTable *vtable, guint8 *tramp) MONO_INTERNAL;
-void              mono_monitor_enter_trampoline (gssize *regs, guint8 *code, MonoObject *obj, guint8 *tramp) MONO_INTERNAL;
-void              mono_monitor_exit_trampoline (gssize *regs, guint8 *code, MonoObject *obj, guint8 *tramp) MONO_INTERNAL;
+void              mono_class_init_trampoline (mgreg_t *regs, guint8 *code, MonoVTable *vtable, guint8 *tramp) MONO_INTERNAL;
+void              mono_generic_class_init_trampoline (mgreg_t *regs, guint8 *code, MonoVTable *vtable, guint8 *tramp) MONO_INTERNAL;
+void              mono_monitor_enter_trampoline (mgreg_t *regs, guint8 *code, MonoObject *obj, guint8 *tramp) MONO_INTERNAL;
+void              mono_monitor_exit_trampoline (mgreg_t *regs, guint8 *code, MonoObject *obj, guint8 *tramp) MONO_INTERNAL;
 gconstpointer     mono_get_trampoline_func (MonoTrampolineType tramp_type);
 gpointer          mini_get_vtable_trampoline (void) MONO_INTERNAL;
-gpointer*         mono_get_vcall_slot_addr (guint8* code, gpointer *regs) MONO_INTERNAL;
+gpointer*         mono_get_vcall_slot_addr (guint8* code, mgreg_t *regs) MONO_INTERNAL;
 
 gboolean          mono_running_on_valgrind (void) MONO_INTERNAL;
 void*             mono_global_codeman_reserve (int size) MONO_INTERNAL;
@@ -1617,25 +1617,25 @@ MonoInst* mono_arch_get_thread_intrinsic        (MonoCompile* cfg) MONO_INTERNAL
 gboolean mono_arch_is_int_overflow              (void *sigctx, void *info) MONO_INTERNAL;
 void     mono_arch_invalidate_method            (MonoJitInfo *ji, void *func, gpointer func_arg) MONO_INTERNAL;
 guint32  mono_arch_get_patch_offset             (guint8 *code) MONO_INTERNAL;
-gpointer mono_arch_get_vcall_slot               (guint8 *code, gpointer *regs, int *displacement) MONO_INTERNAL;
-gpointer*mono_arch_get_delegate_method_ptr_addr (guint8* code, gpointer *regs) MONO_INTERNAL;
+gpointer mono_arch_get_vcall_slot               (guint8 *code, mgreg_t *regs, int *displacement) MONO_INTERNAL;
+gpointer*mono_arch_get_delegate_method_ptr_addr (guint8* code, mgreg_t *regs) MONO_INTERNAL;
 void     mono_arch_create_vars                  (MonoCompile *cfg) MONO_INTERNAL;
 void     mono_arch_save_unwind_info             (MonoCompile *cfg) MONO_INTERNAL;
 void     mono_arch_register_lowlevel_calls      (void) MONO_INTERNAL;
 gpointer mono_arch_get_unbox_trampoline         (MonoGenericSharingContext *gsctx, MonoMethod *m, gpointer addr) MONO_INTERNAL;
 gpointer mono_arch_get_static_rgctx_trampoline  (MonoMethod *m, MonoMethodRuntimeGenericContext *mrgctx, gpointer addr) MONO_INTERNAL;
 void     mono_arch_patch_callsite               (guint8 *method_start, guint8 *code, guint8 *addr) MONO_INTERNAL;
-void     mono_arch_patch_plt_entry              (guint8 *code, gpointer *got, gssize *regs, guint8 *addr) MONO_INTERNAL;
-void     mono_arch_nullify_class_init_trampoline(guint8 *code, gssize *regs) MONO_INTERNAL;
-void     mono_arch_nullify_plt_entry            (guint8 *code, gssize *regs) MONO_INTERNAL;
+void     mono_arch_patch_plt_entry              (guint8 *code, gpointer *got, mgreg_t *regs, guint8 *addr) MONO_INTERNAL;
+void     mono_arch_nullify_class_init_trampoline(guint8 *code, mgreg_t *regs) MONO_INTERNAL;
+void     mono_arch_nullify_plt_entry            (guint8 *code, mgreg_t *regs) MONO_INTERNAL;
 int      mono_arch_get_this_arg_reg             (MonoMethodSignature *sig, MonoGenericSharingContext *gsctx, guint8 *code) MONO_INTERNAL;
-gpointer mono_arch_get_this_arg_from_call       (MonoGenericSharingContext *gsctx, MonoMethodSignature *sig, gssize *regs, guint8 *code) MONO_INTERNAL;
-MonoObject* mono_arch_find_this_argument        (gpointer *regs, MonoMethod *method, MonoGenericSharingContext *gsctx) MONO_INTERNAL;
+gpointer mono_arch_get_this_arg_from_call       (MonoGenericSharingContext *gsctx, MonoMethodSignature *sig, mgreg_t *regs, guint8 *code) MONO_INTERNAL;
+MonoObject* mono_arch_find_this_argument        (mgreg_t *regs, MonoMethod *method, MonoGenericSharingContext *gsctx) MONO_INTERNAL;
 gpointer mono_arch_get_delegate_invoke_impl     (MonoMethodSignature *sig, gboolean has_target) MONO_INTERNAL;
 gpointer mono_arch_create_specific_trampoline   (gpointer arg1, MonoTrampolineType tramp_type, MonoDomain *domain, guint32 *code_len) MONO_INTERNAL;
 void        mono_arch_emit_imt_argument         (MonoCompile *cfg, MonoCallInst *call, MonoInst *imt_arg) MONO_INTERNAL;
-MonoMethod* mono_arch_find_imt_method           (gpointer *regs, guint8 *code) MONO_INTERNAL;
-MonoVTable* mono_arch_find_static_call_vtable   (gpointer *regs, guint8 *code) MONO_INTERNAL;
+MonoMethod* mono_arch_find_imt_method           (mgreg_t *regs, guint8 *code) MONO_INTERNAL;
+MonoVTable* mono_arch_find_static_call_vtable   (mgreg_t *regs, guint8 *code) MONO_INTERNAL;
 gpointer    mono_arch_build_imt_thunk           (MonoVTable *vtable, MonoDomain *domain, MonoIMTCheckItem **imt_entries, int count, gpointer fail_tramp) MONO_INTERNAL;
 void    mono_arch_notify_pending_exc            (void) MONO_INTERNAL;
 
@@ -1649,7 +1649,7 @@ void     mono_jit_walk_stack                    (MonoStackWalk func, gboolean do
 void     mono_jit_walk_stack_from_ctx           (MonoStackWalk func, MonoContext *ctx, gboolean do_il_offset, gpointer user_data) MONO_INTERNAL;
 void     mono_setup_altstack                    (MonoJitTlsData *tls) MONO_INTERNAL;
 void     mono_free_altstack                     (MonoJitTlsData *tls) MONO_INTERNAL;
-gpointer mono_altstack_restore_prot             (gssize *regs, guint8 *code, gpointer *tramp_data, guint8* tramp) MONO_INTERNAL;
+gpointer mono_altstack_restore_prot             (mgreg_t *regs, guint8 *code, gpointer *tramp_data, guint8* tramp) MONO_INTERNAL;
 
 MonoJitInfo * mono_find_jit_info                (MonoDomain *domain, MonoJitTlsData *jit_tls, MonoJitInfo *res, MonoJitInfo *prev_ji, MonoContext *ctx, MonoContext *new_ctx, char **trace, MonoLMF **lmf, int *native_offset, gboolean *managed) MONO_INTERNAL;
 
index a186ac5036d983900871a163b2ab213ca2a6bd99..186d9bc08cbe791bed96028e04dcf2857ba3f0af 100644 (file)
@@ -497,7 +497,7 @@ mono_arch_create_specific_trampoline (gpointer arg1,
 /*========================= End of Function ========================*/
 
 void
-mono_arch_nullify_class_init_trampoline (guint8 *code, gssize *regs)
+mono_arch_nullify_class_init_trampoline (guint8 *code, mgreg_t *regs)
 {
   unsigned int *pcode = (unsigned int *)code;
 
@@ -614,13 +614,13 @@ mono_arch_get_unbox_trampoline (MonoGenericSharingContext *gsctx, MonoMethod *m,
 }
 
 void
-mono_arch_nullify_plt_entry (guint8 *code, gssize *regs)
+mono_arch_nullify_plt_entry (guint8 *code, mgreg_t *regs)
 {
         g_assert_not_reached ();
 }
 
 void
-mono_arch_patch_plt_entry (guint8 *code, gpointer *got, gssize *regs, guint8 *addr)
+mono_arch_patch_plt_entry (guint8 *code, gpointer *got, mgreg_t *regs, guint8 *addr)
 {
         g_assert_not_reached ();
 }
index f071b29d13907e05847a0ecbe9fd5b6fe941c7dc..1a8988cb565214b268bf7fb9186fafe97ed45c97 100644 (file)
@@ -153,7 +153,7 @@ mono_arch_patch_callsite (guint8 *method_start, guint8 *orig_code, guint8 *addr)
 }
 
 void
-mono_arch_patch_plt_entry (guint8 *code, gpointer *got, gssize *regs, guint8 *addr)
+mono_arch_patch_plt_entry (guint8 *code, gpointer *got, mgreg_t *regs, guint8 *addr)
 {
        gint32 disp;
        gpointer *plt_jump_table_entry;
@@ -170,7 +170,7 @@ mono_arch_patch_plt_entry (guint8 *code, gpointer *got, gssize *regs, guint8 *ad
 }
 
 void
-mono_arch_nullify_class_init_trampoline (guint8 *code, gssize *regs)
+mono_arch_nullify_class_init_trampoline (guint8 *code, mgreg_t *regs)
 {
        guint8 buf [16];
        gboolean can_write = mono_breakpoint_clean_code (NULL, code, 7, buf, sizeof (buf));
@@ -189,7 +189,7 @@ mono_arch_nullify_class_init_trampoline (guint8 *code, gssize *regs)
                gpointer *vtable_slot;
 
                /* call *<OFFSET>(%rip) */
-               vtable_slot = mono_get_vcall_slot_addr (code + 3, (gpointer*)regs);
+               vtable_slot = mono_get_vcall_slot_addr (code + 3, regs);
                g_assert (vtable_slot);
 
                *vtable_slot = nullified_class_init_trampoline;
@@ -243,7 +243,7 @@ mono_arch_nullify_class_init_trampoline (guint8 *code, gssize *regs)
 }
 
 void
-mono_arch_nullify_plt_entry (guint8 *code, gssize *regs)
+mono_arch_nullify_plt_entry (guint8 *code, mgreg_t *regs)
 {
        if (mono_aot_only && !nullified_class_init_trampoline)
                nullified_class_init_trampoline = mono_aot_get_named_code ("nullified_class_init_trampoline");
index 326b160f58964c0fe53307340f99118ebe556b2e..c2e2124ee98b4ac9ac345bc0ab67305a8fab5911 100644 (file)
@@ -130,7 +130,7 @@ mono_arch_patch_callsite (guint8 *method_start, guint8 *code_ptr, guint8 *addr)
 }
 
 void
-mono_arch_patch_plt_entry (guint8 *code, gpointer *got, gssize *regs, guint8 *addr)
+mono_arch_patch_plt_entry (guint8 *code, gpointer *got, mgreg_t *regs, guint8 *addr)
 {
        guint8 *jump_entry;
 
@@ -148,13 +148,13 @@ mono_arch_patch_plt_entry (guint8 *code, gpointer *got, gssize *regs, guint8 *ad
 }
 
 void
-mono_arch_nullify_class_init_trampoline (guint8 *code, gssize *regs)
+mono_arch_nullify_class_init_trampoline (guint8 *code, mgreg_t *regs)
 {
        mono_arch_patch_callsite (NULL, code, nullified_class_init_trampoline);
 }
 
 void
-mono_arch_nullify_plt_entry (guint8 *code, gssize *regs)
+mono_arch_nullify_plt_entry (guint8 *code, mgreg_t *regs)
 {
        if (mono_aot_only && !nullified_class_init_trampoline)
                nullified_class_init_trampoline = mono_aot_get_named_code ("nullified_class_init_trampoline");
index b17eeb83b918af56924d40fc3e80b363115d32db..595bbc0416624c40a6f89562d1483772ea304761 100644 (file)
@@ -114,13 +114,13 @@ mono_arch_patch_callsite (guint8 *method_start, guint8 *p, guint8 *addr)
 }
 
 void
-mono_arch_patch_plt_entry (guint8 *code, gpointer *got, gssize *regs, guint8 *addr)
+mono_arch_patch_plt_entry (guint8 *code, gpointer *got, mgreg_t *regs, guint8 *addr)
 {
        g_assert_not_reached ();
 }
 
 void
-mono_arch_nullify_class_init_trampoline (guint8 *code8, gssize *regs)
+mono_arch_nullify_class_init_trampoline (guint8 *code8, mgreg_t *regs)
 {
        guint32 *buf = (guint32 *)((unsigned long)code8 & ~3);
        guint32 *code = buf;
@@ -137,7 +137,7 @@ mono_arch_nullify_class_init_trampoline (guint8 *code8, gssize *regs)
 }
 
 void
-mono_arch_nullify_plt_entry (guint8 *code, gssize *regs)
+mono_arch_nullify_plt_entry (guint8 *code, mgreg_t *regs)
 {
        g_assert_not_reached ();
 }
@@ -229,7 +229,7 @@ mono_arch_create_trampoline_code (MonoTrampolineType tramp_type)
        hppa_ldo (buf, HPPA_STACK_LMF_OFFSET, hppa_r3, hppa_r1);
        hppa_stw (buf, hppa_r1, 0, hppa_r28);
 
-       /* Call mono_magic_trampoline (gssize *regs, guint8 *code, MonoMethod *m, guint8* tramp) */
+       /* Call mono_magic_trampoline (mgreg_t *regs, guint8 *code, MonoMethod *m, guint8* tramp) */
        hppa_ldo (buf, HPPA_STACK_LMF_OFFSET + G_STRUCT_OFFSET (MonoLMF, regs), hppa_r3, hppa_r26);
        hppa_ldw (buf, HPPA_STACK_LMF_OFFSET + G_STRUCT_OFFSET (MonoLMF, method), hppa_r3, hppa_r24);
        if (tramp_type == MONO_TRAMPOLINE_JUMP)
index c93ec7b3c3c01667c22d51ecf47ea1e1c9f7abf9..4a9970ff42e05b08f811cfcba702770d56acd0d4 100644 (file)
@@ -122,13 +122,13 @@ mono_arch_patch_callsite (guint8 *method_start, guint8 *code, guint8 *addr)
 }
 
 void
-mono_arch_patch_plt_entry (guint8 *code, gpointer *got, gssize *regs, guint8 *addr)
+mono_arch_patch_plt_entry (guint8 *code, gpointer *got, mgreg_t *regs, guint8 *addr)
 {
        g_assert_not_reached ();
 }
 
 void
-mono_arch_nullify_class_init_trampoline (guint8 *code, gssize *regs)
+mono_arch_nullify_class_init_trampoline (guint8 *code, mgreg_t *regs)
 {
        guint8 *callsite_begin;
        guint64 *callsite = (guint64*)(gpointer)(code - 16);
@@ -174,7 +174,7 @@ mono_arch_nullify_class_init_trampoline (guint8 *code, gssize *regs)
 }
 
 void
-mono_arch_nullify_plt_entry (guint8 *code, gssize *regs)
+mono_arch_nullify_plt_entry (guint8 *code, mgreg_t *regs)
 {
        g_assert_not_reached ();
 }
index 4c35843a9148df1e7a26231b4dbf6b249389dc51..3cc54ce4c2ddcd8da88c5ab72f1ffd0be5dab984 100644 (file)
@@ -99,7 +99,7 @@ mono_arch_patch_callsite (guint8 *method_start, guint8 *orig_code, guint8 *addr)
 }
 
 void
-mono_arch_patch_plt_entry (guint8 *code, gpointer *got, gssize *regs, guint8 *addr)
+mono_arch_patch_plt_entry (guint8 *code, gpointer *got, mgreg_t *regs, guint8 *addr)
 {
        g_assert_not_reached ();
 }
@@ -115,7 +115,7 @@ mono_arch_patch_plt_entry (guint8 *code, gpointer *got, gssize *regs, guint8 *ad
 
 
 gpointer
-mono_arch_get_vcall_slot (guint8 *code_ptr, gpointer *regs, int *displacement)
+mono_arch_get_vcall_slot (guint8 *code_ptr, mgreg_t *regs, int *displacement)
 {
        char *o = NULL;
        char *vtable = NULL;
@@ -177,13 +177,13 @@ mono_arch_get_vcall_slot (guint8 *code_ptr, gpointer *regs, int *displacement)
 }
 
 void
-mono_arch_nullify_plt_entry (guint8 *code, gssize *regs)
+mono_arch_nullify_plt_entry (guint8 *code, mgreg_t *regs)
 {
        g_assert_not_reached ();
 }
 
 void
-mono_arch_nullify_class_init_trampoline (guint8 *code, gssize *regs)
+mono_arch_nullify_class_init_trampoline (guint8 *code, mgreg_t *regs)
 {
        guint32 *code32 = (guint32*)code;
 
index 260bb72d6ee8a95187285251031b41239db1d301..694392c136514b1e484d05ac6db910f3d3343865 100644 (file)
@@ -182,10 +182,9 @@ mono_arch_patch_callsite (guint8 *method_start, guint8 *code_ptr, guint8 *addr)
 }
 
 void
-mono_arch_patch_plt_entry (guint8 *code, gpointer *got, gssize *regs, guint8 *addr)
+mono_arch_patch_plt_entry (guint8 *code, gpointer *got, mgreg_t *regs, guint8 *addr)
 {
        guint32 ins1, ins2, offset;
-       mgreg_t *r = (mgreg_t*)regs;
 
        /* Patch the jump table entry used by the plt entry */
 
@@ -198,18 +197,18 @@ mono_arch_patch_plt_entry (guint8 *code, gpointer *got, gssize *regs, guint8 *ad
 
        /* Either got or regs is set */
        if (!got)
-               got = (gpointer*)r [30];
+               got = (gpointer*)regs [30];
        *(guint8**)((guint8*)got + offset) = addr;
 }
 
 void
-mono_arch_nullify_class_init_trampoline (guint8 *code, gssize *regs)
+mono_arch_nullify_class_init_trampoline (guint8 *code, mgreg_t *regs)
 {
        mono_arch_patch_callsite (NULL, code, nullified_class_init_trampoline);
 }
 
 void
-mono_arch_nullify_plt_entry (guint8 *code, gssize *regs)
+mono_arch_nullify_plt_entry (guint8 *code, mgreg_t *regs)
 {
        if (mono_aot_only && !nullified_class_init_trampoline)
                nullified_class_init_trampoline = mono_aot_get_named_code ("nullified_class_init_trampoline");
@@ -368,7 +367,7 @@ mono_arch_create_trampoline_code_full (MonoTrampolineType tramp_type, guint32 *c
        ppc_stptr (buf, ppc_r0, G_STRUCT_OFFSET(MonoLMF, eip), ppc_r11);
 
        /*
-        * Now we're ready to call trampoline (gssize *regs, guint8 *code, gpointer value, guint8 *tramp)
+        * Now we're ready to call trampoline (mgreg_t *regs, guint8 *code, gpointer value, guint8 *tramp)
         * Note that the last argument is unused.
         */
        /* Arg 1: a pointer to the registers */
index 100edb632f426cf837dbb018212441b5b19d7c70..c4294458abd3dc4a55d3cc258d373ca3ab27ad47 100644 (file)
@@ -143,7 +143,7 @@ mono_arch_patch_callsite (guint8 *method_start, guint8 *orig_code, guint8 *addr)
 /*========================= End of Function ========================*/
 
 void
-mono_arch_patch_plt_entry (guint8 *code, gpointer *got, gssize *regs, guint8 *addr)
+mono_arch_patch_plt_entry (guint8 *code, gpointer *got, mgreg_t *regs, guint8 *addr)
 {
        g_assert_not_reached ();
 }
@@ -159,7 +159,7 @@ mono_arch_patch_plt_entry (guint8 *code, gpointer *got, gssize *regs, guint8 *ad
 /*------------------------------------------------------------------*/
 
 void
-mono_arch_nullify_class_init_trampoline (guint8 *code, gssize *regs)
+mono_arch_nullify_class_init_trampoline (guint8 *code, mgreg_t *regs)
 {
        char patch[6] = {0x47, 0x00, 0x00, 0x00, 0x07, 0x00};
 
@@ -171,7 +171,7 @@ mono_arch_nullify_class_init_trampoline (guint8 *code, gssize *regs)
 /*========================= End of Function ========================*/
 
 void
-mono_arch_nullify_plt_entry (guint8 *code, gssize *regs)
+mono_arch_nullify_plt_entry (guint8 *code, mgreg_t *regs)
 {
        g_assert_not_reached ();
 }
@@ -199,7 +199,7 @@ mono_arch_nullify_plt_entry (guint8 *code, gssize *regs)
 /*------------------------------------------------------------------*/
 
 gpointer
-mono_arch_get_vcall_slot (guint8 *code, gpointer *regs, int *displacement)
+mono_arch_get_vcall_slot (guint8 *code, mgreg_t *regs, int *displacement)
 {
        int reg;
        guchar* base;
@@ -377,7 +377,7 @@ mono_arch_create_trampoline_code (MonoTrampolineType tramp_type)
                                
        /* Set arguments */
 
-       /* Arg 1: gssize *regs. We pass sp instead */
+       /* Arg 1: mgreg_t *regs. We pass sp instead */
        s390_lr   (buf, s390_r2, STK_BASE);
        s390_ahi  (buf, s390_r2, CREATE_STACK_SIZE);
                
index 980cd9fba0810db5d38249072e4275917a62f12a..0398aa6191e3c6c36600222c8075d912b92e4bfb 100644 (file)
@@ -158,7 +158,7 @@ mono_arch_patch_callsite (guint8 *method_start, guint8 *orig_code, guint8 *addr)
 /*========================= End of Function ========================*/
 
 void
-mono_arch_patch_plt_entry (guint8 *code, gpointer *got, gssize *regs, guint8 *addr)
+mono_arch_patch_plt_entry (guint8 *code, gpointer *got, mgreg_t *regs, guint8 *addr)
 {
        g_assert_not_reached ();
 }
@@ -174,7 +174,7 @@ mono_arch_patch_plt_entry (guint8 *code, gpointer *got, gssize *regs, guint8 *ad
 /*------------------------------------------------------------------*/
 
 void
-mono_arch_nullify_class_init_trampoline (guint8 *code, gssize *regs)
+mono_arch_nullify_class_init_trampoline (guint8 *code, mgreg_t *regs)
 {
        char patch[2] = {0x07, 0x00};
 
@@ -186,7 +186,7 @@ mono_arch_nullify_class_init_trampoline (guint8 *code, gssize *regs)
 /*========================= End of Function ========================*/
 
 void
-mono_arch_nullify_plt_entry (guint8 *code, gssize *regs)
+mono_arch_nullify_plt_entry (guint8 *code, mgreg_t *regs)
 {
        g_assert_not_reached ();
 }
@@ -209,7 +209,7 @@ mono_arch_nullify_plt_entry (guint8 *code, gssize *regs)
 /*------------------------------------------------------------------*/
 
 gpointer
-mono_arch_get_vcall_slot (guint8 *code, gpointer *regs, int *displacement)
+mono_arch_get_vcall_slot (guint8 *code, mgreg_t *regs, int *displacement)
 {
        int reg, lkReg;
        guchar* base;
@@ -401,7 +401,7 @@ mono_arch_create_trampoline_code (MonoTrampolineType tramp_type)
                                
        /* Set arguments */
 
-       /* Arg 1: gssize *regs. We pass sp instead */
+       /* Arg 1: mgreg_t *regs. We pass sp instead */
        s390_lgr  (buf, s390_r2, STK_BASE);
        s390_ahi  (buf, s390_r2, CREATE_STACK_SIZE);
                
index 66856525c06c70b4e46d98cdf242ddbe5d1cc2ee..0fae9ac9b6aa6f1fe04aaea8f8c4f487956b7c11 100644 (file)
@@ -67,20 +67,20 @@ mono_arch_patch_callsite (guint8 *method_start, guint8 *code, guint8 *addr)
 }
 
 void
-mono_arch_patch_plt_entry (guint8 *code, gpointer *got, gssize *regs, guint8 *addr)
+mono_arch_patch_plt_entry (guint8 *code, gpointer *got, mgreg_t *regs, guint8 *addr)
 {
        g_assert_not_reached ();
 }
 
 void
-mono_arch_nullify_class_init_trampoline (guint8 *code, gssize *regs)
+mono_arch_nullify_class_init_trampoline (guint8 *code, mgreg_t *regs)
 {
        /* Patch calling code */
        sparc_nop (code);
 }
 
 void
-mono_arch_nullify_plt_entry (guint8 *code, gssize *regs)
+mono_arch_nullify_plt_entry (guint8 *code, mgreg_t *regs)
 {
        g_assert_not_reached ();
 }
index 2179a32c8109173e609b0bc9415146ba057fde89..4234cd8806f742aa1dacff89dadc19a6c824a709 100644 (file)
@@ -119,7 +119,7 @@ mono_arch_patch_callsite (guint8 *method_start, guint8 *orig_code, guint8 *addr)
 }
 
 void
-mono_arch_patch_plt_entry (guint8 *code, gpointer *got, gssize *regs, guint8 *addr)
+mono_arch_patch_plt_entry (guint8 *code, gpointer *got, mgreg_t *regs, guint8 *addr)
 {
        /* A PLT entry: jmp <DISP> */
        g_assert (code [0] == 0xe9);
@@ -129,7 +129,7 @@ mono_arch_patch_plt_entry (guint8 *code, gpointer *got, gssize *regs, guint8 *ad
 }
 
 void
-mono_arch_nullify_class_init_trampoline (guint8 *code, gssize *regs)
+mono_arch_nullify_class_init_trampoline (guint8 *code, mgreg_t *regs)
 {
        guint8 buf [16];
        gboolean can_write = mono_breakpoint_clean_code (NULL, code, 6, buf, sizeof (buf));
@@ -174,7 +174,7 @@ mono_arch_nullify_class_init_trampoline (guint8 *code, gssize *regs)
                /* call *<OFFSET>(<REG>) -> Call made from AOT code */
                gpointer *vtable_slot;
 
-               vtable_slot = mono_get_vcall_slot_addr (code + 5, (gpointer*)regs);
+               vtable_slot = mono_get_vcall_slot_addr (code + 5, regs);
                g_assert (vtable_slot);
 
                *vtable_slot = nullified_class_init_trampoline;
@@ -186,7 +186,7 @@ mono_arch_nullify_class_init_trampoline (guint8 *code, gssize *regs)
 }
 
 void
-mono_arch_nullify_plt_entry (guint8 *code, gssize *regs)
+mono_arch_nullify_plt_entry (guint8 *code, mgreg_t *regs)
 {
        if (!mono_running_on_valgrind ()) {
                guint32 ops;
index 975738ab9256c350486020e6fb39ba816978c13e..c0d5a45fa19242f77eeb88d9f30729fd5f260080 100644 (file)
@@ -318,7 +318,7 @@ print_dwarf_state (int cfa_reg, int cfa_offset, int ip, int nregs, Loc *location
  */
 void
 mono_unwind_frame (guint8 *unwind_info, guint32 unwind_info_len, 
-                                  guint8 *start_ip, guint8 *end_ip, guint8 *ip, gssize *regs, 
+                                  guint8 *start_ip, guint8 *end_ip, guint8 *ip, mgreg_t *regs, 
                                   int nregs, guint8 **out_cfa) 
 {
        Loc locations [NUM_REGS];
index 71f3caa11688ae190e335a87d14ae7966330af15..4e02bc32dd75aa5f0e4ef1a5f79cd5c14b2fb8fe 100644 (file)
@@ -100,7 +100,7 @@ mono_unwind_ops_encode (GSList *unwind_ops, guint32 *out_len) MONO_INTERNAL;
 
 void
 mono_unwind_frame (guint8 *unwind_info, guint32 unwind_info_len, 
-                                  guint8 *start_ip, guint8 *end_ip, guint8 *ip, gssize *regs, 
+                                  guint8 *start_ip, guint8 *end_ip, guint8 *ip, mgreg_t *regs, 
                                   int nregs, guint8 **out_cfa) MONO_INTERNAL;
 
 void mono_unwind_init (void) MONO_INTERNAL;