From: Claudiu Zissulescu <claudiu.zissulescu-iancule...@oracle.com>

Add a new target hook TARGET_MEMTAG_COMPOSE_OFFSET_TAG to perform
addition between two tags.

The default of this hook is to byte add the inputs.

Hardware-assisted sanitizers on architectures providing instructions
to compose (add) two tags like in the case of AArch64.

gcc/

        * doc/tm.texi: Re-generate.
        * doc/tm.texi.in: Add documentation for new target hooks.
        * target.def: Add new hook.
        * targhooks.cc (default_memtag_compose_offset_tag): New hook.
        * targhooks.h (default_memtag_compose_offset_tag): Likewise.

Signed-off-by: Claudiu Zissulescu <claudiu.zissulescu-iancule...@oracle.com>
---
 gcc/doc/tm.texi    | 6 ++++++
 gcc/doc/tm.texi.in | 2 ++
 gcc/target.def     | 7 +++++++
 gcc/targhooks.cc   | 7 +++++++
 gcc/targhooks.h    | 2 +-
 5 files changed, 23 insertions(+), 1 deletion(-)

diff --git a/gcc/doc/tm.texi b/gcc/doc/tm.texi
index 3f87abf97b2..a4fba6d21b3 100644
--- a/gcc/doc/tm.texi
+++ b/gcc/doc/tm.texi
@@ -12917,6 +12917,12 @@ Store the result in @var{target} if convenient.
 The default clears the top byte of the original pointer.
 @end deftypefn
 
+@deftypefn {Target Hook} rtx TARGET_MEMTAG_COMPOSE_OFFSET_TAG (rtx 
@var{base_tag}, uint8_t @var{tag_offset})
+Return an RTX that represnts the result of composing @var{tag_offset} with
+the base tag @var{base_tag}.
+The default of this hook is to byte add @var{tag_offset} to @var{base_tag}.
+@end deftypefn
+
 @deftypevr {Target Hook} bool TARGET_HAVE_SHADOW_CALL_STACK
 This value is true if the target platform supports
 @option{-fsanitize=shadow-call-stack}.  The default value is false.
diff --git a/gcc/doc/tm.texi.in b/gcc/doc/tm.texi.in
index 040d26c40f1..ff381b486e1 100644
--- a/gcc/doc/tm.texi.in
+++ b/gcc/doc/tm.texi.in
@@ -8138,6 +8138,8 @@ maintainer is familiar with.
 
 @hook TARGET_MEMTAG_UNTAGGED_POINTER
 
+@hook TARGET_MEMTAG_COMPOSE_OFFSET_TAG
+
 @hook TARGET_HAVE_SHADOW_CALL_STACK
 
 @hook TARGET_HAVE_LIBATOMIC
diff --git a/gcc/target.def b/gcc/target.def
index db48df9498d..89f96ca73c5 100644
--- a/gcc/target.def
+++ b/gcc/target.def
@@ -7521,6 +7521,13 @@ Store the result in @var{target} if convenient.\n\
 The default clears the top byte of the original pointer.",
   rtx, (rtx tagged_pointer, rtx target), default_memtag_untagged_pointer)
 
+DEFHOOK
+(compose_offset_tag,
+ "Return an RTX that represnts the result of composing @var{tag_offset} with\n\
+the base tag @var{base_tag}.\n\
+The default of this hook is to byte add @var{tag_offset} to @var{base_tag}.",
+  rtx, (rtx base_tag, uint8_t tag_offset), default_memtag_compose_offset_tag)
+
 HOOK_VECTOR_END (memtag)
 #undef HOOK_PREFIX
 #define HOOK_PREFIX "TARGET_"
diff --git a/gcc/targhooks.cc b/gcc/targhooks.cc
index 0696f95adeb..cfea4a70403 100644
--- a/gcc/targhooks.cc
+++ b/gcc/targhooks.cc
@@ -2904,4 +2904,11 @@ default_memtag_untagged_pointer (rtx tagged_pointer, rtx 
target)
   return untagged_base;
 }
 
+/* The default implementation of TARGET_MEMTAG_COMPOSE_OFFSET_TAG.  */
+rtx
+default_memtag_compose_offset_tag (rtx base_tag, uint8_t tag_offset)
+{
+  return plus_constant (QImode, base_tag, tag_offset);
+}
+
 #include "gt-targhooks.h"
diff --git a/gcc/targhooks.h b/gcc/targhooks.h
index c9e57e475dc..76afce71baa 100644
--- a/gcc/targhooks.h
+++ b/gcc/targhooks.h
@@ -317,5 +317,5 @@ extern rtx default_memtag_add_tag (rtx, poly_int64, 
uint8_t);
 extern rtx default_memtag_set_tag (rtx, rtx, rtx);
 extern rtx default_memtag_extract_tag (rtx, rtx);
 extern rtx default_memtag_untagged_pointer (rtx, rtx);
-
+extern rtx default_memtag_compose_offset_tag (rtx, uint8_t);
 #endif /* GCC_TARGHOOKS_H */
-- 
2.50.0

Reply via email to