[llvmonly] Add unbox wrappers when invoking vtype instance methods through a delegate.
authorZoltan Varga <vargaz@gmail.com>
Tue, 9 Feb 2016 00:21:49 +0000 (19:21 -0500)
committerZoltan Varga <vargaz@gmail.com>
Tue, 9 Feb 2016 00:21:53 +0000 (19:21 -0500)
mono/mini/aot-compiler.c
mono/mini/jit-icalls.c
mono/mini/objects.cs

index fda8f95021c666d8e7f76d4adda9936fc2e16649..f216772a8fd481e5dd92ce9cfa7dbd4378fe9009 100644 (file)
@@ -7946,7 +7946,7 @@ emit_llvm_file (MonoAotCompile *acfg)
                // FIXME: arch
                // FIXME: -O2
                // FIXME: llc/opt flags
-               command = g_strdup_printf ("clang -march=x86-64 -fpic -msse -msse2 -msse3 -msse4 -O2 -fno-optimize-sibling-calls -c -o \"%s\" \"%s.opt.bc\"", acfg->llvm_ofile, acfg->tmpbasename);
+               command = g_strdup_printf ("clang -march=x86-64 -fpic -msse -msse2 -msse3 -msse4 -O0 -fno-optimize-sibling-calls -c -o \"%s\" \"%s.opt.bc\"", acfg->llvm_ofile, acfg->tmpbasename);
                //command = g_strdup_printf ("/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang  -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.3.sdk -Qunused-arguments -miphoneos-version-min=8.2 -arch arm64 -fpic -O0 -c -o \"%s\" \"%s.bc\"", acfg->llvm_ofile, acfg->tmpbasename);
 
                aot_printf (acfg, "Executing clang: %s\n", command);
index 3d169f251bd03e8cce4e310bd1e6af953a5b0203..5cc3f4b89e743d9fce44363c8c39e080f36bc939 100644 (file)
@@ -1711,6 +1711,10 @@ mono_llvmonly_init_delegate (MonoDelegate *del)
         */
        if (G_UNLIKELY (!ftndesc)) {
                gpointer addr = mono_compile_method (del->method);
+
+               if (del->method->klass->valuetype && mono_method_signature (del->method)->hasthis)
+                   addr = mono_aot_get_unbox_trampoline (del->method);
+
                gpointer arg = mini_get_delegate_arg (del->method, addr);
 
                ftndesc = mini_create_llvmonly_ftndesc (mono_domain_get (), addr, arg);
@@ -1730,6 +1734,8 @@ mono_llvmonly_init_delegate_virtual (MonoDelegate *del, MonoObject *target, Mono
 
        del->method = method;
        del->method_ptr = mono_compile_method (method);
+       if (method->klass->valuetype)
+               del->method_ptr = mono_aot_get_unbox_trampoline (method);
        del->extra_arg = mini_get_delegate_arg (del->method, del->method_ptr);
 }
 
index e3ce97974cc38505135deb1009c489f450bcc3fb..32b92286c914855e53e94636f34abd9d6333cf8e 100644 (file)
@@ -874,6 +874,32 @@ class Tests {
                return 2;
        }
 
+       interface IFaceVirtualDel {
+               int return_field ();
+       }
+
+       struct VtypeVirtualDelStruct : IFaceVirtualDel {
+               public int f;
+               public int return_field_nonvirt () {
+                       return f;
+               }
+               public int return_field () {
+                       return f;
+               }
+       }
+
+       public static int test_42_vtype_delegate () {
+               var s = new VtypeVirtualDelStruct () { f = 42 };
+               Func<int> f = s.return_field_nonvirt;
+               return f ();
+       }
+
+       public static int test_42_vtype_virtual_delegate () {
+               IFaceVirtualDel s = new VtypeVirtualDelStruct () { f = 42 };
+               Func<int> f = s.return_field;
+               return f ();
+       }
+
        public static int test_1_store_decimal () {
                decimal[,] a = {{1}};