Merge pull request #5714 from alexischr/update_bockbuild
[mono.git] / mono / mini / mini-amd64-gsharedvt.c
index 6a4e7af9d4485ea1894c08f45c9421519744cc12..d6cc6a743e547b5a6cf0dc8a13ee6a2bdec7d322 100644 (file)
@@ -1,5 +1,6 @@
-/*
- * mini-amd64-gsharedvt.c: libcorkscrew-based native unwinder
+/**
+ * \file
+ * libcorkscrew-based native unwinder
  *
  * Authors:
  *   Zoltan Varga <vargaz@gmail.com>
@@ -17,7 +18,6 @@
 #include <mono/metadata/appdomain.h>
 #include <mono/metadata/marshal.h>
 #include <mono/metadata/tabledefs.h>
-#include <mono/metadata/mono-debug-debugger.h>
 #include <mono/metadata/profiler-private.h>
 #include <mono/metadata/gc-internals.h>
 #include <mono/arch/amd64/amd64-codegen.h>
@@ -128,7 +128,7 @@ Format for the destination descriptor:
        bits 24:32 - slot count
 */
 #define SRC_DESCRIPTOR_MARSHAL_SHIFT 16
-#define SRC_DESCRIPTOR_MARSHAL_MASK 0x0Ff
+#define SRC_DESCRIPTOR_MARSHAL_MASK 0x0ff
 
 #define SLOT_COUNT_SHIFT 24
 #define SLOT_COUNT_MASK 0xff
@@ -378,6 +378,23 @@ mono_arch_get_gsharedvt_call_info (gpointer addr, MonoMethodSignature *normal_si
                default:
                        g_error ("Gsharedvt can't handle dest arg type %d", (int)dst_info->storage); // See above
                }
+
+               if (arg_marshal == GSHAREDVT_ARG_BYREF_TO_BYVAL && dst_info->byte_arg_size) {
+                       /* Have to load less than 4 bytes */
+                       // FIXME: Signed types
+                       switch (dst_info->byte_arg_size) {
+                       case 1:
+                               arg_marshal = GSHAREDVT_ARG_BYREF_TO_BYVAL_U1;
+                               break;
+                       case 2:
+                               arg_marshal = GSHAREDVT_ARG_BYREF_TO_BYVAL_U2;
+                               break;
+                       default:
+                               arg_marshal = GSHAREDVT_ARG_BYREF_TO_BYVAL_U4;
+                               break;
+                       }
+               }
+
                if (nsrc)
                        src [0] |= (arg_marshal << SRC_DESCRIPTOR_MARSHAL_SHIFT) | (arg_slots << SLOT_COUNT_SHIFT);
 
@@ -442,22 +459,17 @@ mono_arch_get_gsharedvt_call_info (gpointer addr, MonoMethodSignature *normal_si
                        } else {
                                MonoType *ret = sig->ret;
 
-                               // Unwrap enums
-                               if (ret->type == MONO_TYPE_VALUETYPE)
-                                       ret = mini_type_get_underlying_type (ret);
-
+                               ret = mini_type_get_underlying_type (ret);
                                switch (ret->type) {
                                case MONO_TYPE_I1:
                                        info->ret_marshal = GSHAREDVT_RET_I1;
                                        break;
-                               case MONO_TYPE_BOOLEAN:
                                case MONO_TYPE_U1:
                                        info->ret_marshal = GSHAREDVT_RET_U1;
                                        break;
                                case MONO_TYPE_I2:
                                        info->ret_marshal = GSHAREDVT_RET_I2;
                                        break;
-                               case MONO_TYPE_CHAR:
                                case MONO_TYPE_U2:
                                        info->ret_marshal = GSHAREDVT_RET_U2;
                                        break;
@@ -471,11 +483,7 @@ mono_arch_get_gsharedvt_call_info (gpointer addr, MonoMethodSignature *normal_si
                                case MONO_TYPE_U:
                                case MONO_TYPE_PTR:
                                case MONO_TYPE_FNPTR:
-                               case MONO_TYPE_CLASS:
                                case MONO_TYPE_OBJECT:
-                               case MONO_TYPE_SZARRAY:
-                               case MONO_TYPE_ARRAY:
-                               case MONO_TYPE_STRING:
                                case MONO_TYPE_U8:
                                case MONO_TYPE_I8:
                                        info->ret_marshal = GSHAREDVT_RET_I8;