Hi Yury, > On 31 Oct 2024, at 14:23, Yury Khrustalev <[email protected]> wrote: > > From: Szabolcs Nagy <[email protected]> > > Add new builtins for GCS: > > void *__builtin_aarch64_gcspr (void) > uint64_t __builtin_aarch64_gcspopm (void) > void *__builtin_aarch64_gcsss (void *) > > The builtins are always enabled, but should be used behind runtime > checks in case the target does not support GCS. They are thin > wrappers around the corresponding instructions. > > The GCS pointer is modelled with void * type (normal stores do not > work on GCS memory, but it is writable via the gcsss operation or > via GCSSTR if enabled so not const) and an entry on the GCS is > modelled with uint64_t (since it has fixed size and can be a token > that's not a pointer). > > gcc/ChangeLog: > > * config/aarch64/aarch64-builtins.cc (enum aarch64_builtins): Add > AARCH64_BUILTIN_GCSPR, AARCH64_BUILTIN_GCSPOPM, AARCH64_BUILTIN_GCSSS. > (aarch64_init_gcs_builtins): New. > (aarch64_general_init_builtins): Call aarch64_init_gcs_builtins. > (aarch64_expand_gcs_builtin): New. > (aarch64_general_expand_builtin): Call aarch64_expand_gcs_builtin. > --- > gcc/config/aarch64/aarch64-builtins.cc | 78 ++++++++++++++++++++++++++ > 1 file changed, 78 insertions(+) > > diff --git a/gcc/config/aarch64/aarch64-builtins.cc > b/gcc/config/aarch64/aarch64-builtins.cc > index 55506530ee4..3d9d8c296c0 100644 > --- a/gcc/config/aarch64/aarch64-builtins.cc > +++ b/gcc/config/aarch64/aarch64-builtins.cc > @@ -886,6 +886,9 @@ enum aarch64_builtins > AARCH64_PLIX, > /* Armv8.9-A / Armv9.4-A builtins. */ > AARCH64_BUILTIN_CHKFEAT, > + AARCH64_BUILTIN_GCSPR, > + AARCH64_BUILTIN_GCSPOPM, > + AARCH64_BUILTIN_GCSSS, > AARCH64_BUILTIN_MAX > }; > > @@ -2255,6 +2258,29 @@ aarch64_init_fpsr_fpcr_builtins (void) > AARCH64_BUILTIN_SET_FPSR64); > } > > +/* Add builtins for Guarded Control Stack instructions. */ > + > +static void > +aarch64_init_gcs_builtins (void) > +{ > + tree ftype; > + > + ftype = build_function_type_list (ptr_type_node, NULL); > + aarch64_builtin_decls[AARCH64_BUILTIN_GCSPR] > + = aarch64_general_add_builtin ("__builtin_aarch64_gcspr", ftype, > + AARCH64_BUILTIN_GCSPR);
Are these builtins intended to eventually implement the ACLE intrinsics like
__gcspr ()?
I see that in the spec the type signature of that is const void * __gcspr
(void).
So I think you want to use const_ptr_type_node rather than just ptr_type_node
in the ftype.
> +
> + ftype = build_function_type_list (uint64_type_node, NULL);
> + aarch64_builtin_decls[AARCH64_BUILTIN_GCSPOPM]
> + = aarch64_general_add_builtin ("__builtin_aarch64_gcspopm", ftype,
> + AARCH64_BUILTIN_GCSPOPM);
> +
> + ftype = build_function_type_list (ptr_type_node, ptr_type_node, NULL);
> + aarch64_builtin_decls[AARCH64_BUILTIN_GCSSS]
> + = aarch64_general_add_builtin ("__builtin_aarch64_gcsss", ftype,
> + AARCH64_BUILTIN_GCSSS);
Same here.
Looks ok to me otherwise.
Thanks,
Kyrill
> +}
> +
> /* Initialize all builtins in the AARCH64_BUILTIN_GENERAL group. */
>
> void
> @@ -2302,6 +2328,8 @@ aarch64_general_init_builtins (void)
> = aarch64_general_add_builtin ("__builtin_aarch64_chkfeat", ftype_chkfeat,
> AARCH64_BUILTIN_CHKFEAT);
>
> + aarch64_init_gcs_builtins ();
> +
> if (in_lto_p)
> handle_arm_acle_h ();
> }
> @@ -3381,6 +3409,51 @@ aarch64_expand_fpsr_fpcr_getter (enum insn_code icode,
> machine_mode mode,
> return op.value;
> }
>
> +/* Expand GCS builtin EXP with code FCODE, putting the result
> + into TARGET. If IGNORE is true the return value is ignored. */
> +
> +rtx
> +aarch64_expand_gcs_builtin (tree exp, rtx target, int fcode, int ignore)
> +{
> + if (fcode == AARCH64_BUILTIN_GCSPR)
> + {
> + expand_operand op;
> + create_output_operand (&op, target, DImode);
> + expand_insn (CODE_FOR_aarch64_load_gcspr, 1, &op);
> + return op.value;
> + }
> + if (fcode == AARCH64_BUILTIN_GCSPOPM && ignore)
> + {
> + expand_insn (CODE_FOR_aarch64_gcspopm_xzr, 0, 0);
> + return target;
> + }
> + if (fcode == AARCH64_BUILTIN_GCSPOPM)
> + {
> + rtx tmp = gen_reg_rtx (DImode);
> + emit_move_insn (tmp, const0_rtx);
> + expand_operand ops[2];
> + create_output_operand (&ops[0], target, Pmode);
> + create_input_operand (&ops[1], tmp, Pmode);
> + expand_insn (CODE_FOR_aarch64_gcspopm, 2, ops);
> + return ops[0].value;
> + }
> + if (fcode == AARCH64_BUILTIN_GCSSS)
> + {
> + expand_operand opnd;
> + rtx arg = expand_normal (CALL_EXPR_ARG (exp, 0));
> + create_input_operand (&opnd, arg, Pmode);
> + expand_insn (CODE_FOR_aarch64_gcsss1, 1, &opnd);
> + expand_operand ops[2];
> + rtx tmp = gen_reg_rtx (DImode);
> + emit_move_insn (tmp, const0_rtx);
> + create_output_operand (&ops[0], target, Pmode);
> + create_input_operand (&ops[1], tmp, Pmode);
> + expand_insn (CODE_FOR_aarch64_gcsss2, 2, ops);
> + return ops[0].value;
> + }
> + gcc_unreachable ();
> +}
> +
> /* Expand an expression EXP that calls built-in function FCODE,
> with result going to TARGET if that's convenient. IGNORE is true
> if the result of the builtin is ignored. */
> @@ -3515,6 +3588,11 @@ aarch64_general_expand_builtin (unsigned int fcode,
> tree exp, rtx target,
> expand_insn (CODE_FOR_aarch64_chkfeat, 0, 0);
> return copy_to_reg (x16_reg);
> }
> +
> + case AARCH64_BUILTIN_GCSPR:
> + case AARCH64_BUILTIN_GCSPOPM:
> + case AARCH64_BUILTIN_GCSSS:
> + return aarch64_expand_gcs_builtin (exp, target, fcode, ignore);
> }
>
> if (fcode >= AARCH64_SIMD_BUILTIN_BASE && fcode <= AARCH64_SIMD_BUILTIN_MAX)
> --
> 2.39.5
>
smime.p7s
Description: S/MIME cryptographic signature
