From 08e4757ade5cc1584c91b1fdbd7fe4714b23963f Mon Sep 17 00:00:00 2001 From: Christoffer Lerno Date: Sat, 28 Nov 2020 19:36:12 +0100 Subject: [PATCH] Some fixup of the RISCV code. --- src/compiler/llvm_codegen_c_abi.c | 5 ++++- src/compiler/llvm_codegen_c_abi_aarch64.c | 14 +++++++------- src/compiler/llvm_codegen_c_abi_internal.h | 2 +- src/compiler/llvm_codegen_c_abi_riscv.c | 12 ++++++++---- 4 files changed, 20 insertions(+), 13 deletions(-) diff --git a/src/compiler/llvm_codegen_c_abi.c b/src/compiler/llvm_codegen_c_abi.c index de613efbc..2565e6e88 100644 --- a/src/compiler/llvm_codegen_c_abi.c +++ b/src/compiler/llvm_codegen_c_abi.c @@ -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"); diff --git a/src/compiler/llvm_codegen_c_abi_aarch64.c b/src/compiler/llvm_codegen_c_abi_aarch64.c index 1f67a02b8..9498d02ad 100644 --- a/src/compiler/llvm_codegen_c_abi_aarch64.c +++ b/src/compiler/llvm_codegen_c_abi_aarch64.c @@ -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); } } diff --git a/src/compiler/llvm_codegen_c_abi_internal.h b/src/compiler/llvm_codegen_c_abi_internal.h index 240ef4894..f10349570 100644 --- a/src/compiler/llvm_codegen_c_abi_internal.h +++ b/src/compiler/llvm_codegen_c_abi_internal.h @@ -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 diff --git a/src/compiler/llvm_codegen_c_abi_riscv.c b/src/compiler/llvm_codegen_c_abi_riscv.c index 9576d5245..e0775d44d 100644 --- a/src/compiler/llvm_codegen_c_abi_riscv.c +++ b/src/compiler/llvm_codegen_c_abi_riscv.c @@ -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) {