Hi Yury,

> On 31 Oct 2024, at 14:23, Yury Khrustalev <yury.khrusta...@arm.com> wrote:
> 
> From: Szabolcs Nagy <szabolcs.n...@arm.com>
> 
> 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
> 

Attachment: smime.p7s
Description: S/MIME cryptographic signature

Reply via email to