public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc(refs/vendors/ARM/heads/morello)] Keep the cheri_capability attribute
@ 2022-05-05 12:04 Matthew Malcomson
0 siblings, 0 replies; only message in thread
From: Matthew Malcomson @ 2022-05-05 12:04 UTC (permalink / raw)
To: gcc-cvs
https://gcc.gnu.org/g:2f0e6bc008a27e3222072bc791e4325b845789be
commit 2f0e6bc008a27e3222072bc791e4325b845789be
Author: Richard Sandiford <richard.sandiford@arm.com>
Date: Fri Mar 4 15:10:59 2022 +0000
Keep the cheri_capability attribute
This patch keeps the cheri_capability attribute in TYPE_ATTRIBUTES
and uses it to determine the mode of pointers. In some ways it
feels a bit nasty to be calling layout_type in the middle of
build_type_attribute_qual_variant, but I think it's the right
interface. If the starting type passed to the function is not
a capability type then it should not (on hybrid targets) have
a capability mode, so the caller can't change the mode first.
Changing the mode later would leave a significant window in which
the type is internally inconsistent.
Diff:
---
gcc/attribs.c | 19 +++++++++++++++++++
gcc/c-family/c-attribs.c | 16 +++++++---------
2 files changed, 26 insertions(+), 9 deletions(-)
diff --git a/gcc/attribs.c b/gcc/attribs.c
index 71dae123af8..c4c7591a107 100644
--- a/gcc/attribs.c
+++ b/gcc/attribs.c
@@ -1151,7 +1151,23 @@ build_type_attribute_qual_variant (tree otype, tree attribute, int quals)
tree dtype = ntype = build_distinct_type_copy (ttype);
+ gcc_assert (ntype == TYPE_MAIN_VARIANT (ntype));
TYPE_ATTRIBUTES (ntype) = attribute;
+ if (POINTER_TYPE_P (ntype)
+ && !capability_type_p (ptr_type_node))
+ {
+ bool old_cap = capability_type_p (ttype);
+ bool new_cap = lookup_attribute ("cheri_capability", attribute);
+ if (old_cap != new_cap)
+ {
+ auto as = TYPE_ADDR_SPACE (TREE_TYPE (ntype));
+ auto mode = targetm.addr_space.pointer_mode (as, new_cap);
+ SET_TYPE_MODE (ntype, mode);
+ /* Force the size to be recomputed. */
+ TYPE_SIZE (ntype) = NULL_TREE;
+ layout_type (ntype);
+ }
+ }
hashval_t hash = type_hash_canon_hash (ntype);
ntype = type_hash_canon (hash, ntype);
@@ -1352,6 +1368,9 @@ comp_type_attributes (const_tree type1, const_tree type2)
if ((lookup_attribute ("nocf_check", TYPE_ATTRIBUTES (type1)) != NULL)
^ (lookup_attribute ("nocf_check", TYPE_ATTRIBUTES (type2)) != NULL))
return 0;
+ if (bool (lookup_attribute ("cheri_capability", TYPE_ATTRIBUTES (type1)))
+ != bool (lookup_attribute ("cheri_capability", TYPE_ATTRIBUTES (type2))))
+ return 0;
/* As some type combinations - like default calling-convention - might
be compatible, we have to call the target hook to get the final result. */
return targetm.comp_type_attributes (type1, type2);
diff --git a/gcc/c-family/c-attribs.c b/gcc/c-family/c-attribs.c
index 7b299b9ce9e..5981e2ac477 100644
--- a/gcc/c-family/c-attribs.c
+++ b/gcc/c-family/c-attribs.c
@@ -804,11 +804,8 @@ handle_cheri_capability_attribute (tree *node, tree ARG_UNUSED (name),
{
*no_add_attrs = true;
- opt_scalar_addr_mode opt_cap_mode = targetm.capability_mode ();
- if (opt_cap_mode.exists ())
+ if (targetm.capability_mode ().exists ())
{
- scalar_addr_mode cap_mode = opt_cap_mode.require();
-
/* Scan down the tree *node and find how many
POINTER_TYPE_P nodes there are in the chain. */
int capability_pointer_depth = 1, c = 1;
@@ -860,15 +857,16 @@ handle_cheri_capability_attribute (tree *node, tree ARG_UNUSED (name),
treetoedit = &TREE_TYPE (*treetoedit);
gcc_assert (TREE_CODE (*treetoedit) == POINTER_TYPE);
+ tree attrs = tree_cons (get_identifier ("cheri_capability"), NULL_TREE,
+ TYPE_ATTRIBUTES (*treetoedit));
+
/* Call build_pointer_type_for_mode to create a Capability Pointer
to whatever is being referenced by (*treetoedit). Then use
build_type_attribute_qual_variant to reapply the qualifiers and
attributes of the original pointer type. */
- (*treetoedit) = build_type_attribute_qual_variant
- (build_pointer_type_for_mode (TREE_TYPE (*treetoedit),
- cap_mode, true),
- TYPE_ATTRIBUTES (*treetoedit),
- TYPE_QUALS (*treetoedit));
+ auto quals = TYPE_QUALS (*treetoedit);
+ (*treetoedit) = build_type_attribute_qual_variant (*treetoedit, attrs,
+ quals);
}
else
error ("__capability attribute is not supported for this architecture");
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2022-05-05 12:04 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:04 [gcc(refs/vendors/ARM/heads/morello)] Keep the cheri_capability attribute 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).