[GCC, AARCH64] Add GNU note section with BTI and PAC.
authorSudakshina Das <sudi.das@arm.com>
Tue, 23 Apr 2019 15:51:25 +0000 (15:51 +0000)
committerSudakshina Das <sudi@gcc.gnu.org>
Tue, 23 Apr 2019 15:51:25 +0000 (15:51 +0000)
This patch adds the GNU NOTE section to the BTI and/or PAC
enabled objects for linux targets.

The patches for needed for these in binutils are already approved
and committed.
https://sourceware.org/ml/binutils/2019-03/msg00072.html

*** gcc/ChangeLog ***

2018-04-23  Sudakshina Das  <sudi.das@arm.com>

* config/aarch64/aarch64-linux.h (TARGET_ASM_FILE_END): Define for
AArch64.
(aarch64_file_end_indicate_exec_stack): Add gnu note section.

gcc/testsuite/ChangeLog:

2018-04-23  Sudakshina Das  <sudi.das@arm.com>

* gcc.target/aarch64/bti-1.c: Add scan directive for gnu note section
for linux targets.
* gcc.target/aarch64/va_arg_1.c: Update scan directive to not clash
with GNU note section.

From-SVN: r270515

gcc/ChangeLog
gcc/config/aarch64/aarch64-linux.h
gcc/config/aarch64/aarch64.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/aarch64/bti-1.c
gcc/testsuite/gcc.target/aarch64/va_arg_1.c

index 5ea2fa0c4423d2f82c163801f7e037307e536f7e..2c1cc3774a101265c17adeff43c82d419ee8fbec 100644 (file)
@@ -1,3 +1,10 @@
+2018-04-23  Sudakshina Das  <sudi.das@arm.com>
+
+       * config/aarch64/aarch64-linux.h (TARGET_ASM_FILE_END): Define for
+       AArch64.
+       (aarch64_file_end_indicate_exec_stack): Add gnu note section.
+
+
 2019-04-23  Roman Zhuykov  <zhroma@ispras.ru>
 
        PR rtl-optimization/87979
index 9d0292d64f20939ccedd7ab56027aa1282826b23..5e8b34ded03c78493f868e38647bf57c2da5187c 100644 (file)
@@ -83,7 +83,7 @@
 
 #define GNU_USER_TARGET_D_CRITSEC_SIZE 48
 
-#define TARGET_ASM_FILE_END file_end_indicate_exec_stack
+#define TARGET_ASM_FILE_END aarch64_file_end_indicate_exec_stack
 
 /* Uninitialized common symbols in non-PIE executables, even with
    strong definitions in dependent shared libraries, will resolve
index 10b0bd2d5321ee380292d13eb3973424fd91ff24..14259439c9079c9139fca51370765cce54127890 100644 (file)
@@ -18772,6 +18772,57 @@ aarch64_stack_protect_guard (void)
   return NULL_TREE;
 }
 
+/* Implement TARGET_ASM_FILE_END for AArch64.  This adds the AArch64 GNU NOTE
+   section at the end if needed.  */
+#define GNU_PROPERTY_AARCH64_FEATURE_1_AND     0xc0000000
+#define GNU_PROPERTY_AARCH64_FEATURE_1_BTI     (1U << 0)
+#define GNU_PROPERTY_AARCH64_FEATURE_1_PAC     (1U << 1)
+void
+aarch64_file_end_indicate_exec_stack ()
+{
+  file_end_indicate_exec_stack ();
+
+  unsigned feature_1_and = 0;
+  if (aarch64_bti_enabled ())
+    feature_1_and |= GNU_PROPERTY_AARCH64_FEATURE_1_BTI;
+
+  if (aarch64_ra_sign_scope != AARCH64_FUNCTION_NONE)
+    feature_1_and |= GNU_PROPERTY_AARCH64_FEATURE_1_PAC;
+
+  if (feature_1_and)
+    {
+      /* Generate .note.gnu.property section.  */
+      switch_to_section (get_section (".note.gnu.property",
+                                     SECTION_NOTYPE, NULL));
+
+      /* PT_NOTE header: namesz, descsz, type.
+        namesz = 4 ("GNU\0")
+        descsz = 16 (Size of the program property array)
+                 [(12 + padding) * Number of array elements]
+        type   = 5 (NT_GNU_PROPERTY_TYPE_0).  */
+      assemble_align (POINTER_SIZE);
+      assemble_integer (GEN_INT (4), 4, 32, 1);
+      assemble_integer (GEN_INT (ROUND_UP (12, POINTER_BYTES)), 4, 32, 1);
+      assemble_integer (GEN_INT (5), 4, 32, 1);
+
+      /* PT_NOTE name.  */
+      assemble_string ("GNU", 4);
+
+      /* PT_NOTE contents for NT_GNU_PROPERTY_TYPE_0:
+        type   = GNU_PROPERTY_AARCH64_FEATURE_1_AND
+        datasz = 4
+        data   = feature_1_and.  */
+      assemble_integer (GEN_INT (GNU_PROPERTY_AARCH64_FEATURE_1_AND), 4, 32, 1);
+      assemble_integer (GEN_INT (4), 4, 32, 1);
+      assemble_integer (GEN_INT (feature_1_and), 4, 32, 1);
+
+      /* Pad the size of the note to the required alignment.  */
+      assemble_align (POINTER_SIZE);
+    }
+}
+#undef GNU_PROPERTY_AARCH64_FEATURE_1_PAC
+#undef GNU_PROPERTY_AARCH64_FEATURE_1_BTI
+#undef GNU_PROPERTY_AARCH64_FEATURE_1_AND
 
 /* Target-specific selftests.  */
 
index 81d6f2694b852132a014f88685b8323ca3013186..76e1a8ee8f700630647c334ff92cbfb0fd1772af 100644 (file)
@@ -1,3 +1,10 @@
+2018-04-23  Sudakshina Das  <sudi.das@arm.com>
+
+       * gcc.target/aarch64/bti-1.c: Add scan directive for gnu note section
+       for linux targets.
+       * gcc.target/aarch64/va_arg_1.c: Update scan directive to not clash
+       with GNU note section.
+
 2019-04-23  Jeff Law  <law@redhat.com>
 
        * lib/target-supports.exp
index a8c60412e310a4f322372f334ae5314f426d310e..5a556b08ed15679b25676a11fe9c7a64641ee671 100644 (file)
@@ -61,3 +61,4 @@ lab2:
 }
 /* { dg-final { scan-assembler-times "hint\t34" 1 } } */
 /* { dg-final { scan-assembler-times "hint\t36" 12 } } */
+/* { dg-final { scan-assembler ".note.gnu.property" { target *-*-linux* } } } */
index e8e3cdac51350b545e5c2a644a3e1f4d1c37f88d..5bcb5f3b186ad00b12a125b535517e3dfdb6e433 100644 (file)
@@ -4,7 +4,7 @@
 int
 f (int a, ...)
 {
-  /* { dg-final { scan-assembler-not "str" } } */
+  /* { dg-final { scan-assembler-not "str\t" } } */
   return a;
 }