[v2,1/4] aarch64: add debug comments to feature properties in .note.gnu.property

Message ID 20241023103600.500910-2-matthieu.longo@arm.com
State New
Headers
Series aarch64: add minimal support of AEABI build attributes for GCS |

Checks

Context Check Description
linaro-tcwg-bot/tcwg_gcc_build--master-arm fail Patch failed to apply
linaro-tcwg-bot/tcwg_gcc_build--master-aarch64 fail Patch failed to apply

Commit Message

Matthieu Longo Oct. 23, 2024, 10:35 a.m. UTC
  GNU properties are emitted to provide some information about the features
used in the generated code like BTI, GCS, or PAC. However, no debug
comment are emitted in the generated assembly even if -dA is provided.
It makes understanding the information stored in the .note.gnu.property
section more difficult than needed.

This patch adds assembly comments (if -dA is provided) next to the GNU
properties. For instance, if BTI and PAC are enabled, it will emit:
  .word  0x3  // GNU_PROPERTY_AARCH64_FEATURE_1_AND (BTI, PAC)

gcc/ChangeLog:

	* config/aarch64/aarch64.cc
	(aarch64_file_end_indicate_exec_stack): Emit assembly comments.

gcc/testsuite/ChangeLog:

	* gcc.target/aarch64/bti-1.c: Emit assembly comments, and update
	test assertion.
---
 gcc/config/aarch64/aarch64.cc            | 35 ++++++++++++++++++++++--
 gcc/testsuite/gcc.target/aarch64/bti-1.c | 13 +++++----
 2 files changed, 40 insertions(+), 8 deletions(-)
  

Patch

diff --git a/gcc/config/aarch64/aarch64.cc b/gcc/config/aarch64/aarch64.cc
index 914f2902d25..0466d6d11eb 100644
--- a/gcc/config/aarch64/aarch64.cc
+++ b/gcc/config/aarch64/aarch64.cc
@@ -29259,10 +29259,41 @@  aarch64_file_end_indicate_exec_stack ()
 	 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);
+      fputs (integer_asm_op (4, true), asm_out_file);
+      fprint_whex (asm_out_file, GNU_PROPERTY_AARCH64_FEATURE_1_AND);
+      putc ('\n', asm_out_file);
       assemble_integer (GEN_INT (4), 4, 32, 1);
-      assemble_integer (GEN_INT (feature_1_and), 4, 32, 1);
 
+      fputs (integer_asm_op (4, true), asm_out_file);
+      fprint_whex (asm_out_file, feature_1_and);
+      if (flag_debug_asm)
+	{
+	  struct flag_name
+	  {
+	    unsigned int mask;
+	    const char *name;
+	  };
+	  static const flag_name flags[] = {
+	    { GNU_PROPERTY_AARCH64_FEATURE_1_BTI, "BTI" },
+	    { GNU_PROPERTY_AARCH64_FEATURE_1_PAC, "PAC" },
+	    { GNU_PROPERTY_AARCH64_FEATURE_1_GCS, "GCS" },
+	  };
+
+	  const char *separator = "";
+	  std::string s_features;
+	  for (auto &flag : flags)
+	    if (feature_1_and & flag.mask)
+	      {
+		s_features.append (separator).append (flag.name);
+		separator = ", ";
+	      }
+
+	  asm_fprintf (asm_out_file,
+		       "\t%s GNU_PROPERTY_AARCH64_FEATURE_1_AND (%s)\n",
+		       ASM_COMMENT_START, s_features.c_str ());
+	}
+      else
+	putc ('\n', asm_out_file);
       /* Pad the size of the note to the required alignment.  */
       assemble_align (POINTER_SIZE);
     }
diff --git a/gcc/testsuite/gcc.target/aarch64/bti-1.c b/gcc/testsuite/gcc.target/aarch64/bti-1.c
index 5a556b08ed1..53dc2d3cd8b 100644
--- a/gcc/testsuite/gcc.target/aarch64/bti-1.c
+++ b/gcc/testsuite/gcc.target/aarch64/bti-1.c
@@ -1,6 +1,6 @@ 
 /* { dg-do compile } */
 /* -Os to create jump table.  */
-/* { dg-options "-Os" } */
+/* { dg-options "-Os -dA" } */
 /* { dg-require-effective-target lp64 } */
 /* If configured with --enable-standard-branch-protection, don't use
    command line option.  */
@@ -44,8 +44,8 @@  f_jump_table (int y, int n)
   return (y == 0)? y+1:4;
 }
 /* f_jump_table should have PACIASP and AUTIASP.  */
-/* { dg-final { scan-assembler-times "hint\t25" 1 } } */
-/* { dg-final { scan-assembler-times "hint\t29" 1 } } */
+/* { dg-final { scan-assembler-times "hint\t25 // paciasp" 1 } } */
+/* { dg-final { scan-assembler-times "hint\t29 // autiasp" 1 } } */
 
 int
 f_label_address ()
@@ -59,6 +59,7 @@  lab2:
   addr = &&lab1;
   return 2;
 }
-/* { 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* } } } */
+/* { dg-final { scan-assembler-times "hint\t34 // bti c" 1 } } */
+/* { dg-final { scan-assembler-times "hint\t36 // bti j" 12 } } */
+/* { dg-final { scan-assembler "\.section\t\.note\.gnu\.property" { target *-*-linux* } } } */
+/* { dg-final { scan-assembler "\.word\t0x7\t\/\/ GNU_PROPERTY_AARCH64_FEATURE_1_AND \\(BTI, PAC, GCS\\)" { target *-*-linux* } } } */
\ No newline at end of file