[jit] Use mini_type_get_underlying type in a few missing places int the amd64 port.
authorRodrigo Kumpera <kumpera@gmail.com>
Tue, 10 Dec 2013 00:39:21 +0000 (19:39 -0500)
committerRodrigo Kumpera <kumpera@gmail.com>
Tue, 10 Dec 2013 20:20:20 +0000 (15:20 -0500)
mono/mini/mini-amd64.c

index 8658500c91c488a373359885ead7147bde005862..52ee97986b5b6b456b07e17390e80630f644a786 100644 (file)
@@ -1213,7 +1213,7 @@ mono_arch_tail_call_supported (MonoMethodSignature *caller_sig, MonoMethodSignat
        c1 = get_call_info (NULL, NULL, caller_sig);
        c2 = get_call_info (NULL, NULL, callee_sig);
        res = c1->stack_usage >= c2->stack_usage;
-       callee_ret = callee_sig->ret;
+       callee_ret = mini_type_get_underlying_type (NULL, callee_sig->ret);
        if (callee_ret && MONO_TYPE_ISSTRUCT (callee_ret) && c2->ret.storage != ArgValuetypeInReg)
                /* An address on the callee's stack is passed as the first argument */
                res = FALSE;
@@ -1622,7 +1622,8 @@ mono_arch_fill_argument_info (MonoCompile *cfg)
        sig = mono_method_signature (cfg->method);
 
        cinfo = cfg->arch.cinfo;
-       sig_ret = sig->ret;
+       sig_ret = mini_type_get_underlying_type (NULL, sig->ret);
+
        /*
         * Contrary to mono_arch_allocate_vars (), the information should describe
         * where the arguments are at the beginning of the method, not where they can be 
@@ -1703,7 +1704,7 @@ mono_arch_allocate_vars (MonoCompile *cfg)
        sig = mono_method_signature (cfg->method);
 
        cinfo = cfg->arch.cinfo;
-       sig_ret = sig->ret;
+       sig_ret = mini_type_get_underlying_type (NULL, sig->ret);
 
        mono_arch_compute_omit_fp (cfg);
 
@@ -1972,6 +1973,7 @@ mono_arch_create_vars (MonoCompile *cfg)
 {
        MonoMethodSignature *sig;
        CallInfo *cinfo;
+       MonoType *sig_ret;
 
        sig = mono_method_signature (cfg->method);
 
@@ -1982,7 +1984,8 @@ mono_arch_create_vars (MonoCompile *cfg)
        if (cinfo->ret.storage == ArgValuetypeInReg)
                cfg->ret_var_is_local = TRUE;
 
-       if ((cinfo->ret.storage != ArgValuetypeInReg) && MONO_TYPE_ISSTRUCT (sig->ret)) {
+       sig_ret = mini_type_get_underlying_type (NULL, sig->ret);
+       if ((cinfo->ret.storage != ArgValuetypeInReg) && MONO_TYPE_ISSTRUCT (sig_ret)) {
                cfg->vret_addr = mono_compile_create_var (cfg, &mono_defaults.int_class->byval_arg, OP_ARG);
                if (G_UNLIKELY (cfg->verbose_level > 1)) {
                        printf ("vret_addr = ");
@@ -2150,7 +2153,8 @@ mono_arch_get_llvm_call_info (MonoCompile *cfg, MonoMethodSignature *sig)
        MonoType *t, *sig_ret;
 
        n = sig->param_count + sig->hasthis;
-       sig_ret = sig->ret;
+       sig_ret = mini_type_get_underlying_type (NULL, sig->ret);
+
        cinfo = get_call_info (cfg->generic_sharing_context, cfg->mempool, sig);
 
        linfo = mono_mempool_alloc0 (cfg->mempool, sizeof (LLVMCallInfo) + (sizeof (LLVMArgInfo) * n));
@@ -2408,6 +2412,7 @@ mono_arch_emit_call (MonoCompile *cfg, MonoCallInst *call)
        if (!sig->pinvoke && (sig->call_convention == MONO_CALL_VARARG) && (n == sig->sentinelpos))
                emit_sig_cookie (cfg, call, cinfo);
 
+       sig_ret = mini_type_get_underlying_type (NULL, sig->ret);
        if (sig_ret && MONO_TYPE_ISSTRUCT (sig_ret)) {
                MonoInst *vtarg;
 
@@ -8018,7 +8023,7 @@ mono_arch_get_delegate_invoke_impl (MonoMethodSignature *sig, gboolean has_targe
                return NULL;
 
        /* FIXME: Support more cases */
-       if (MONO_TYPE_ISSTRUCT (sig->ret))
+       if (MONO_TYPE_ISSTRUCT (mini_type_get_underlying_type (NULL, sig->ret)))
                return NULL;
 
        if (has_target) {