mirror of
https://github.com/c3lang/c3c.git
synced 2026-02-27 12:01:16 +00:00
Some fixup of the RISCV code.
This commit is contained in:
@@ -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");
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user