Add a new target hook TARGET_MEMTAG_TAG_MEMORY to tag (and untag)
memory. The default implementation is empty.
Hardware-assisted sanitizers on architectures providing instructions to
tag/untag memory can then make use of this target hook. On AArch64,
e.g., the MEMTAG sanitizer will use this hook to tag and untag memory
using MTE insns.
gcc/ChangeLog:
* doc/tm.texi: Re-generate.
* doc/tm.texi.in: Add documentation for new target hooks.
* target.def: Add new hook.
* targhooks.cc (default_memtag_tag_memory): New hook.
* targhooks.h (default_memtag_tag_memory): Likewise.
---
gcc/doc/tm.texi | 5 +++++
gcc/doc/tm.texi.in | 2 ++
gcc/target.def | 6 ++++++
gcc/targhooks.cc | 7 +++++++
gcc/targhooks.h | 1 +
5 files changed, 21 insertions(+)
diff --git a/gcc/doc/tm.texi b/gcc/doc/tm.texi
index a96700c0d38e..18e09489593a 100644
--- a/gcc/doc/tm.texi
+++ b/gcc/doc/tm.texi
@@ -12921,6 +12921,11 @@ 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_TAG_MEMORY (rtx @var{base}, rtx
@var{size}, rtx @var{tagged_pointer})
+Tag memory at address @var{base} TBD FIXME.
+The default clears the top byte of the original pointer.
+@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 eccc4d884938..d5e252de2366 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_TAG_MEMORY
+
@hook TARGET_HAVE_SHADOW_CALL_STACK
@hook TARGET_HAVE_LIBATOMIC
diff --git a/gcc/target.def b/gcc/target.def
index 6c7cdc8126b2..93e8b3a0b67f 100644
--- a/gcc/target.def
+++ b/gcc/target.def
@@ -7525,6 +7525,12 @@ 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
+(tag_memory,
+ "Tag memory at address @var{base} TBD FIXME.\n\
+The default clears the top byte of the original pointer.",
+ rtx, (rtx base, rtx size, rtx tagged_pointer), default_memtag_tag_memory)
+
HOOK_VECTOR_END (memtag)
#undef HOOK_PREFIX
#define HOOK_PREFIX "TARGET_"
diff --git a/gcc/targhooks.cc b/gcc/targhooks.cc
index c79458e374e2..689ca94d6d2a 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_TAG_MEMORY. */
+rtx
+default_memtag_tag_memory (rtx, rtx, rtx)
+{
+ gcc_unreachable ();
+}
+
#include "gt-targhooks.h"
diff --git a/gcc/targhooks.h b/gcc/targhooks.h
index f16b58798c2b..8cb420aec051 100644
--- a/gcc/targhooks.h
+++ b/gcc/targhooks.h
@@ -317,5 +317,6 @@ 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_tag_memory (rtx, rtx, rtx);
#endif /* GCC_TARGHOOKS_H */
--
2.43.0