Emit .cfi_mte_memtag_frame after .cfi_startproc for each function where
the stack memory uses MTE protection.
TBD:
- Need to double check if checking on frame_size is the right thing to
do. clang generates cfi_mte_tagged_frame directive irrespective of
whether the function ended up tagging the stack usage or not.
gcc/ChangeLog:
* config/aarch64/aarch64.cc (aarch64_can_tag_addresses): Add
forward declaration.
(aarch64_post_cfi_startproc): Emit .cfi_mte_tagged_frame CFI
directive.
gcc/testsuite/ChangeLog:
* gcc.target/aarch64/memtag/cfi-mte-memtag-frame-1.c: New test.
---
[New in RFC V2]
---
gcc/config/aarch64/aarch64.cc | 6 ++++++
.../aarch64/memtag/cfi-mte-memtag-frame-1.c | 12 ++++++++++++
2 files changed, 18 insertions(+)
create mode 100644
gcc/testsuite/gcc.target/aarch64/memtag/cfi-mte-memtag-frame-1.c
diff --git a/gcc/config/aarch64/aarch64.cc b/gcc/config/aarch64/aarch64.cc
index 4dee57eb255f..bf448895d1ab 100644
--- a/gcc/config/aarch64/aarch64.cc
+++ b/gcc/config/aarch64/aarch64.cc
@@ -25162,6 +25162,8 @@ aarch64_asm_output_external (FILE *stream, tree decl,
const char* name)
aarch64_asm_output_variant_pcs (stream, decl, name);
}
+bool aarch64_can_tag_addresses (void);
+
/* Triggered after a .cfi_startproc directive is emitted into the assembly
file.
Used to output the .cfi_b_key_frame directive when signing the current
function with the B key. */
@@ -25172,6 +25174,10 @@ aarch64_post_cfi_startproc (FILE *f, tree ignored
ATTRIBUTE_UNUSED)
if (cfun->machine->frame.laid_out && aarch64_return_address_signing_enabled
()
&& aarch64_ra_sign_key == AARCH64_KEY_B)
asm_fprintf (f, "\t.cfi_b_key_frame\n");
+ if (cfun->machine->frame.laid_out && aarch64_can_tag_addresses ()
+ && memtag_sanitize_p ()
+ && !known_eq (cfun->machine->frame.frame_size, 0))
+ asm_fprintf (f, "\t.cfi_mte_tagged_frame\n");
}
/* Implements TARGET_ASM_FILE_START. Output the assembly header. */
diff --git a/gcc/testsuite/gcc.target/aarch64/memtag/cfi-mte-memtag-frame-1.c
b/gcc/testsuite/gcc.target/aarch64/memtag/cfi-mte-memtag-frame-1.c
new file mode 100644
index 000000000000..43ef5d238b58
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/memtag/cfi-mte-memtag-frame-1.c
@@ -0,0 +1,12 @@
+/* { dg-do compile } */
+/* { dg-additional-options "-fsanitize=memtag -march=armv8.5-a+memtag" } */
+
+int use (int *x);
+
+void foo (int n)
+{
+ int x = 99;
+ use (&x);
+}
+
+/* { dg-final { scan-assembler-times ".cfi_mte_tagged_frame" 1 } } */
--
2.43.0