ret_type = LLVMVoidType ();
break;
case LLVMArgVtypeRetAddr:
- case LLVMArgScalarRetAddr:
case LLVMArgGsharedvtFixed:
case LLVMArgGsharedvtFixedVtype:
case LLVMArgGsharedvtVariable:
pindex ++;
break;
case LLVMArgVtypeByRef:
- case LLVMArgScalarByRef:
param_types [pindex] = type_to_llvm_arg_type (ctx, ainfo->type);
if (!ctx_ok (ctx))
break;
ctx->addresses [reg] = LLVMGetParam (ctx->lmethod, pindex);
break;
}
- case LLVMArgScalarByRef: {
- if (names [i])
- name = g_strdup_printf ("arg_%s", names [i]);
- else
- name = g_strdup_printf ("arg_%d", i);
- ctx->values [reg] = LLVMBuildLoad (builder, LLVMGetParam (ctx->lmethod, pindex), name);
- g_free (name);
- break;
- }
case LLVMArgAsIArgs: {
LLVMValueRef arg = LLVMGetParam (ctx->lmethod, pindex);
int size;
if (call->imt_arg_reg)
cinfo->imt_arg = TRUE;
- vretaddr = (cinfo->ret.storage == LLVMArgVtypeRetAddr || cinfo->ret.storage == LLVMArgVtypeByRef || cinfo->ret.storage == LLVMArgScalarRetAddr || cinfo->ret.storage == LLVMArgGsharedvtFixed || cinfo->ret.storage == LLVMArgGsharedvtVariable || cinfo->ret.storage == LLVMArgGsharedvtFixedVtype);
+ vretaddr = (cinfo->ret.storage == LLVMArgVtypeRetAddr || cinfo->ret.storage == LLVMArgVtypeByRef || cinfo->ret.storage == LLVMArgGsharedvtFixed || cinfo->ret.storage == LLVMArgGsharedvtVariable || cinfo->ret.storage == LLVMArgGsharedvtFixedVtype);
llvm_sig = sig_to_llvm_sig_full (ctx, sig, cinfo);
if (!ctx_ok (ctx))
g_assert (addresses [reg]);
args [pindex] = addresses [reg];
break;
- case LLVMArgVtypeByRef:
- case LLVMArgScalarByRef: {
+ case LLVMArgVtypeByRef: {
g_assert (addresses [reg]);
args [pindex] = convert (ctx, addresses [reg], LLVMPointerType (type_to_llvm_arg_type (ctx, ainfo->type), 0));
break;
values [ins->dreg] = LLVMBuildLoad (builder, convert_full (ctx, addresses [call->inst.dreg], LLVMPointerType (type_to_llvm_type (ctx, sig->ret), 0), FALSE), "");
}
break;
- case LLVMArgScalarRetAddr:
- /* Normal scalar returned using a vtype return argument */
- values [ins->dreg] = LLVMBuildLoad (builder, convert_full (ctx, addresses [call->inst.dreg], LLVMPointerType (type_to_llvm_type (ctx, sig->ret), 0), FALSE), "");
- break;
case LLVMArgGsharedvtVariable:
break;
case LLVMArgGsharedvtFixed:
LLVMBuildRetVoid (builder);
break;
}
- case LLVMArgScalarRetAddr: {
- LLVMTypeRef ret_type = type_to_llvm_type (ctx, sig->ret);
- LLVMValueRef param = LLVMGetParam (method, linfo->vret_arg_pindex);
-
- /* sreg1 might not be set */
- if (lhs)
- LLVMBuildStore (builder, convert (ctx, lhs, ret_type), convert (ctx, param, LLVMPointerType (ret_type, 0)));
- LLVMBuildRetVoid (builder);
- break;
- }
case LLVMArgFpStruct: {
LLVMTypeRef ret_type = LLVMGetReturnType (LLVMGetElementType (LLVMTypeOf (method)));
LLVMValueRef retval;
LLVMArgInfo *ainfo = (LLVMArgInfo*)ins->inst_p0;
MonoType *t = mini_get_underlying_type (ins->inst_vtype);
- if (ainfo->storage == LLVMArgScalarByRef) {
- LLVMTypeRef argtype;
- LLVMValueRef loc, v;
-
- argtype = type_to_llvm_arg_type (ctx, t);
- loc = build_alloca_llvm_type (ctx, argtype, 0);
- v = convert (ctx, values [ins->sreg1], argtype);
- LLVMBuildStore (ctx->builder, v, loc);
- addresses [ins->dreg] = loc;
- } else if (ainfo->storage == LLVMArgGsharedvtVariable) {
+ if (ainfo->storage == LLVMArgGsharedvtVariable) {
MonoInst *var = get_vreg_to_inst (cfg, ins->sreg1);
if (var && var->opcode == OP_GSHAREDVT_LOCAL) {
LLVMAddAttribute (LLVMGetParam (method, linfo->vret_arg_pindex), LLVMStructRetAttribute);
LLVMAddAttribute (LLVMGetParam (method, linfo->vret_arg_pindex), LLVMNoAliasAttribute);
}
- } else if (linfo->ret.storage == LLVMArgScalarRetAddr) {
- LLVMValueRef param = LLVMGetParam (method, linfo->vret_arg_pindex);
- LLVMSetValueName (param, "vret");
}
if (sig->hasthis) {
}
values [cfg->args [i + sig->hasthis]->dreg] = LLVMGetParam (method, pindex);
- if (ainfo->storage == LLVMArgScalarByRef) {
- if (names [i] && names [i][0] != '\0')
- name = g_strdup_printf ("p_arg_%s", names [i]);
- else
- name = g_strdup_printf ("p_arg_%d", i);
- } else if (ainfo->storage == LLVMArgGsharedvtFixed || ainfo->storage == LLVMArgGsharedvtFixedVtype) {
+ if (ainfo->storage == LLVMArgGsharedvtFixed || ainfo->storage == LLVMArgGsharedvtFixedVtype) {
if (names [i] && names [i][0] != '\0')
name = g_strdup_printf ("p_arg_%s", names [i]);
else
case LLVMArgVtypeByRef:
case LLVMArgVtypeInReg:
case LLVMArgVtypeAsScalar:
- case LLVMArgScalarByRef:
case LLVMArgAsIArgs:
case LLVMArgAsFpArgs:
case LLVMArgGsharedvtVariable: