public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc(refs/vendors/ARM/heads/morello)] Add -fgimple support for __CAP_ADDR
@ 2022-05-05 12:08 Matthew Malcomson
  0 siblings, 0 replies; only message in thread
From: Matthew Malcomson @ 2022-05-05 12:08 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:221fc4613527f40b230d0776d727b864340a126f

commit 221fc4613527f40b230d0776d727b864340a126f
Author: Richard Sandiford <richard.sandiford@arm.com>
Date:   Wed Apr 13 09:54:12 2022 +0100

    Add -fgimple support for __CAP_ADDR
    
    Provide a way of explicitly choosing CAP_ADDR_EXPR over
    NONCAP_ADDR_EXPR when the latter is the default.  The syntax
    is a bit clunky -- "&x" becomes "__CAP_ADDR x" -- but that's
    consistent with other unary operators like __ABS.

Diff:
---
 gcc/c/c-typeck.c                                           |  2 +-
 gcc/c/gimple-parser.c                                      |  7 +++++++
 gcc/testsuite/gcc.target/aarch64/morello/cap-addr-expr-1.c | 12 ++++++++++++
 gcc/tree.c                                                 | 13 +++++++++++++
 gcc/tree.h                                                 |  1 +
 5 files changed, 34 insertions(+), 1 deletion(-)

diff --git a/gcc/c/c-typeck.c b/gcc/c/c-typeck.c
index d8e5e07923b..3cd39f6cf04 100644
--- a/gcc/c/c-typeck.c
+++ b/gcc/c/c-typeck.c
@@ -4899,7 +4899,7 @@ build_unary_op (location_t location, enum tree_code code, tree xarg,
       gcc_assert (TREE_CODE (arg) != COMPONENT_REF
 		  || !DECL_C_BIT_FIELD (TREE_OPERAND (arg, 1)));
 
-      argtype = build_pointer_type (argtype);
+      argtype = addr_expr_type (code, argtype);
 
       /* ??? Cope with user tricks that amount to offsetof.  Delete this
 	 when we have proper support for integer constant expressions.  */
diff --git a/gcc/c/gimple-parser.c b/gcc/c/gimple-parser.c
index 5ab987772b9..754d60b742f 100644
--- a/gcc/c/gimple-parser.c
+++ b/gcc/c/gimple-parser.c
@@ -762,6 +762,7 @@ c_parser_gimple_statement (gimple_parser &parser, gimple_seq *seq)
 	tree id = c_parser_peek_token (parser)->value;
 	if (strcmp (IDENTIFIER_POINTER (id), "__ABS") == 0
 	    || strcmp (IDENTIFIER_POINTER (id), "__ABSU") == 0
+	    || strcmp (IDENTIFIER_POINTER (id), "__CAP_ADDR") == 0
 	    || strcmp (IDENTIFIER_POINTER (id), "__MIN") == 0
 	    || strcmp (IDENTIFIER_POINTER (id), "__MAX") == 0
 	    || strcmp (IDENTIFIER_POINTER (id), "__BIT_INSERT") == 0
@@ -1151,6 +1152,12 @@ c_parser_gimple_unary_expression (gimple_parser &parser)
 	      op = c_parser_gimple_postfix_expression (parser);
 	      return parser_build_unary_op (op_loc, ABSU_EXPR, op);
 	    }
+	  else if (strcmp (IDENTIFIER_POINTER (id), "__CAP_ADDR") == 0)
+	    {
+	      c_parser_consume_token (parser);
+	      op = c_parser_gimple_postfix_expression (parser);
+	      return parser_build_unary_op (op_loc, CAP_ADDR_EXPR, op);
+	    }
 	  else if (strcmp (IDENTIFIER_POINTER (id), "__MIN") == 0)
 	    return c_parser_gimple_parentized_binary_expression (parser,
 								 op_loc,
diff --git a/gcc/testsuite/gcc.target/aarch64/morello/cap-addr-expr-1.c b/gcc/testsuite/gcc.target/aarch64/morello/cap-addr-expr-1.c
new file mode 100644
index 00000000000..8896adea723
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/morello/cap-addr-expr-1.c
@@ -0,0 +1,12 @@
+/* { dg-do compile } */
+/* { dg-additional-options "-fgimple" } */
+
+#ifdef __ARM_CAP_PERMISSION_EXECUTIVE__
+int x;
+__GIMPLE int *__capability foo() {
+  int *__capability res;
+
+  res = __CAP_ADDR x;
+  return res;
+}
+#endif
diff --git a/gcc/tree.c b/gcc/tree.c
index e0d3bbeb7c8..c7291a67aac 100644
--- a/gcc/tree.c
+++ b/gcc/tree.c
@@ -8079,6 +8079,19 @@ build_pointer_type (tree to_type)
   return build_pointer_type_for_mode (to_type, pointer_mode, false);
 }
 
+/* Return the pointer type produced by using *ADDR_EXPR code CODE
+   to take the address of an object of type OP_TYPE.  */
+
+tree
+addr_expr_type (tree_code code, tree op_type)
+{
+  gcc_assert (ADDR_EXPR_CODE_P (code) && TYPE_P (op_type));
+  auto as = TYPE_ADDR_SPACE (op_type);
+  bool is_capability = (code == CAP_ADDR_EXPR);
+  auto ptr_mode = targetm.addr_space.pointer_mode (as, is_capability);
+  return build_pointer_type_for_mode (op_type, ptr_mode, false);
+}
+
 /* Build REPLACE_ADDRESS_VALUE internal function.  This represents replacing
    the value of a pointer with something else.  It is different to a simple
    assignment since it works with pointers represented by capabilities and not
diff --git a/gcc/tree.h b/gcc/tree.h
index aebea940439..7c99f4f6e96 100644
--- a/gcc/tree.h
+++ b/gcc/tree.h
@@ -4578,6 +4578,7 @@ extern tree unsigned_type_for (tree);
 extern tree truth_type_for (tree);
 extern tree build_pointer_type_for_mode (tree, machine_mode, bool);
 extern tree build_pointer_type (tree);
+extern tree addr_expr_type (tree_code, tree);
 extern tree build_intcap_type_for_mode (machine_mode, int);
 extern tree build_reference_type_for_mode (tree, machine_mode, bool);
 extern tree build_reference_type (tree);


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2022-05-05 12:08 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-05-05 12:08 [gcc(refs/vendors/ARM/heads/morello)] Add -fgimple support for __CAP_ADDR Matthew Malcomson

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).