Some fixup of the RISCV code.

This commit is contained in:
Christoffer Lerno
2020-11-28 19:36:12 +01:00
parent 84eea12efe
commit 08e4757ade
4 changed files with 20 additions and 13 deletions

View File

@@ -265,7 +265,10 @@ void c_abi_func_create(GenContext *context, FunctionSignature *signature)
c_abi_func_create_win64(context, signature);
break;
case ABI_AARCH64:
c_abi_func_create_aarch64(context, signature);
c_abi_func_create_aarch64(signature);
break;
case ABI_RISCV:
c_abi_func_create_riscv(context, signature);
break;
default:
FATAL_ERROR("Unsupported ABI");

View File

@@ -15,7 +15,7 @@ ABIArgInfo *aarch64_coerce_illegal_vector(Type *type)
TODO
}
ABIArgInfo *aarch64_classify_argument_type(GenContext *context, Type *type)
ABIArgInfo *aarch64_classify_argument_type(Type *type)
{
type = type_lowering(type);
@@ -79,7 +79,7 @@ ABIArgInfo *aarch64_classify_argument_type(GenContext *context, Type *type)
return abi_arg_new_indirect_not_by_val();
}
ABIArgInfo *aarch64_classify_return_type(GenContext *context, Type *type, bool variadic)
ABIArgInfo *aarch64_classify_return_type(Type *type, bool variadic)
{
type = type_lowering(type);
@@ -138,24 +138,24 @@ ABIArgInfo *aarch64_classify_return_type(GenContext *context, Type *type, bool v
}
void c_abi_func_create_aarch64(GenContext *context, FunctionSignature *signature)
void c_abi_func_create_aarch64(FunctionSignature *signature)
{
if (signature->failable)
{
signature->failable_abi_info = aarch64_classify_return_type(context, signature->rtype->type, signature->variadic);
signature->failable_abi_info = aarch64_classify_return_type(signature->rtype->type, signature->variadic);
if (signature->rtype->type->type_kind != TYPE_VOID)
{
signature->ret_abi_info = aarch64_classify_argument_type(context, type_get_ptr(type_lowering(signature->rtype->type)));
signature->ret_abi_info = aarch64_classify_argument_type(type_get_ptr(type_lowering(signature->rtype->type)));
}
}
else
{
signature->ret_abi_info = aarch64_classify_return_type(context, signature->rtype->type, signature->variadic);
signature->ret_abi_info = aarch64_classify_return_type(signature->rtype->type, signature->variadic);
}
Decl **params = signature->params;
VECEACH(params, i)
{
params[i]->var.abi_info = aarch64_classify_argument_type(context, params[i]->type);
params[i]->var.abi_info = aarch64_classify_argument_type(params[i]->type);
}
}

View File

@@ -48,7 +48,7 @@ ABIArgInfo *c_abi_classify_argument_type_default(Type *type);
void c_abi_func_create_win64(GenContext *context, FunctionSignature *signature);
void c_abi_func_create_x86(GenContext *context, FunctionSignature *signature);
void c_abi_func_create_x64(GenContext *context, FunctionSignature *signature);
void c_abi_func_create_aarch64(GenContext *context, FunctionSignature *signature);
void c_abi_func_create_aarch64(FunctionSignature *signature);
void c_abi_func_create_riscv(GenContext *context, FunctionSignature *signature);
// Implementation

View File

@@ -294,14 +294,13 @@ void c_abi_func_create_riscv(GenContext *context, FunctionSignature *signature)
Type *return_type = signature->failable ? type_error : signature->rtype->type;
return_type = type_lowering(return_type);
ABIArgInfo *return_abi = riscv_classify_return(context, return_type);
// TODO fixup of failable.
// IsRetIndirect is true if classifyArgumentType indicated the value should
// be passed indirect, or if the type size is a scalar greater than 2*XLen
// and not a complex type with elements <= FLen. e.g. fp128 is passed direct
// in LLVM IR, relying on the backend lowering code to rewrite the argument
// list and pass indirectly on RV32.
bool is_ret_indirect = abi_arg_is_indirect(signature->failable ? signature->failable_abi_info : signature->ret_abi_info);
bool is_ret_indirect = abi_arg_is_indirect(return_abi);
if (!is_ret_indirect && type_is_scalar(return_type) && type_size(return_type) > 2 * build_target.riscv.xlen)
{
if (return_type->type_kind == TYPE_COMPLEX && build_target.riscv.flen)
@@ -322,8 +321,13 @@ void c_abi_func_create_riscv(GenContext *context, FunctionSignature *signature)
unsigned arg_gprs_left = is_ret_indirect ? gpr - 1 : gpr;
unsigned arg_fprs_left = build_target.riscv.flen ? fpr : 0;
// unsigned fixed_arguments = vec_size(signature->params); todo
// TODO fix failable.
// If we have a failable, then the return type is a parameter.
if (signature->failable && signature->rtype->type->type_kind != TYPE_VOID)
{
signature->ret_abi_info = riscv_classify_argument_type(context, type_get_ptr(type_lowering(signature->rtype->type)),
true, &arg_gprs_left, &arg_fprs_left);
}
Decl **params = signature->params;
VECEACH(params, i)
{