X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmini%2Fmini-amd64.c;h=434f74f3f6cfa29640989f7ffc3f0f2a6de0cdc4;hb=3fb128ac0de7cca459098c2dc3359d81f5e48353;hp=bdfc9858370e1783b49a90dfee6362c70cf423cb;hpb=cbf44a1e55d55fdc8734da413d8224066aa70091;p=mono.git diff --git a/mono/mini/mini-amd64.c b/mono/mini/mini-amd64.c index bdfc9858370..434f74f3f6c 100644 --- a/mono/mini/mini-amd64.c +++ b/mono/mini/mini-amd64.c @@ -603,12 +603,12 @@ typedef enum ArgumentClass { } ArgumentClass; static ArgumentClass -merge_argument_class_from_type (MonoType *type, ArgumentClass class1) +merge_argument_class_from_type (MonoGenericSharingContext *gsctx, MonoType *type, ArgumentClass class1) { ArgumentClass class2 = ARG_CLASS_NO_CLASS; MonoType *ptype; - ptype = mini_type_get_underlying_type (NULL, type); + ptype = mini_type_get_underlying_type (gsctx, type); switch (ptype->type) { case MONO_TYPE_BOOLEAN: case MONO_TYPE_CHAR: @@ -655,7 +655,7 @@ merge_argument_class_from_type (MonoType *type, ArgumentClass class1) for (i = 0; i < info->num_fields; ++i) { class2 = class1; - class2 = merge_argument_class_from_type (info->fields [i].field->type, class2); + class2 = merge_argument_class_from_type (gsctx, info->fields [i].field->type, class2); } break; } @@ -861,7 +861,7 @@ add_valuetype (MonoGenericSharingContext *gsctx, MonoMethodSignature *sig, ArgIn /* (8 is size of quad) */ quadsize [quad] = info->fields [i].offset + size - (quad * 8); - class1 = merge_argument_class_from_type (info->fields [i].field->type, class1); + class1 = merge_argument_class_from_type (gsctx, info->fields [i].field->type, class1); } g_assert (class1 != ARG_CLASS_NO_CLASS); args [quad] = class1; @@ -1204,7 +1204,7 @@ mono_arch_get_argument_info (MonoGenericSharingContext *gsctx, MonoMethodSignatu } gboolean -mono_arch_tail_call_supported (MonoMethodSignature *caller_sig, MonoMethodSignature *callee_sig) +mono_arch_tail_call_supported (MonoCompile *cfg, MonoMethodSignature *caller_sig, MonoMethodSignature *callee_sig) { CallInfo *c1, *c2; gboolean res; @@ -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 = mini_type_get_underlying_type (NULL, callee_sig->ret); + callee_ret = mini_replace_type (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,7 @@ mono_arch_fill_argument_info (MonoCompile *cfg) sig = mono_method_signature (cfg->method); cinfo = cfg->arch.cinfo; - sig_ret = mini_type_get_underlying_type (NULL, sig->ret); + sig_ret = mini_replace_type (sig->ret); /* * Contrary to mono_arch_allocate_vars (), the information should describe @@ -1704,7 +1704,7 @@ mono_arch_allocate_vars (MonoCompile *cfg) sig = mono_method_signature (cfg->method); cinfo = cfg->arch.cinfo; - sig_ret = mini_type_get_underlying_type (NULL, sig->ret); + sig_ret = mini_replace_type (sig->ret); mono_arch_compute_omit_fp (cfg); @@ -1984,7 +1984,7 @@ mono_arch_create_vars (MonoCompile *cfg) if (cinfo->ret.storage == ArgValuetypeInReg) cfg->ret_var_is_local = TRUE; - sig_ret = mini_type_get_underlying_type (NULL, sig->ret); + sig_ret = mini_replace_type (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)) { @@ -2153,7 +2153,7 @@ mono_arch_get_llvm_call_info (MonoCompile *cfg, MonoMethodSignature *sig) MonoType *t, *sig_ret; n = sig->param_count + sig->hasthis; - sig_ret = mini_type_get_underlying_type (NULL, sig->ret); + sig_ret = mini_replace_type (sig->ret); cinfo = get_call_info (cfg->generic_sharing_context, cfg->mempool, sig); @@ -2412,7 +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); + sig_ret = mini_replace_type (sig->ret); if (sig_ret && MONO_TYPE_ISSTRUCT (sig_ret)) { MonoInst *vtarg; @@ -2578,7 +2578,7 @@ mono_arch_emit_outarg_vt (MonoCompile *cfg, MonoInst *ins, MonoInst *src) void mono_arch_emit_setret (MonoCompile *cfg, MonoMethod *method, MonoInst *val) { - MonoType *ret = mini_type_get_underlying_type (NULL, mono_method_signature (method)->ret); + MonoType *ret = mini_replace_type (mono_method_signature (method)->ret); if (ret->type == MONO_TYPE_R4) { if (COMPILE_LLVM (cfg)) @@ -7629,7 +7629,7 @@ mono_arch_instrument_epilog_full (MonoCompile *cfg, void *func, void *p, gboolea guchar *code = p; int save_mode = SAVE_NONE; MonoMethod *method = cfg->method; - MonoType *ret_type = mini_type_get_underlying_type (NULL, mono_method_signature (method)->ret); + MonoType *ret_type = mini_replace_type (mono_method_signature (method)->ret); int i; switch (ret_type->type) { @@ -8030,7 +8030,7 @@ mono_arch_get_delegate_invoke_impl (MonoMethodSignature *sig, gboolean has_targe return NULL; /* FIXME: Support more cases */ - if (MONO_TYPE_ISSTRUCT (mini_type_get_underlying_type (NULL, sig->ret))) + if (MONO_TYPE_ISSTRUCT (mini_replace_type (sig->ret))) return NULL; if (has_target) {