]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
RISC-V: Add GNU_PROPERTY_RISCV_FEATURE_1_CFI_SS and GNU_PROPERTY_RISCV_FEATURE_1_CFI_...
authorKito Cheng <kito.cheng@sifive.com>
Wed, 11 Jun 2025 08:33:47 +0000 (16:33 +0800)
committerNelson Chu <nelson@rivosinc.com>
Tue, 24 Jun 2025 10:14:39 +0000 (18:14 +0800)
This patch adds two new GNU properties for RISC-V:
GNU_PROPERTY_RISCV_FEATURE_1_CFI_SS and GNU_PROPERTY_RISCV_FEATURE_1_CFI_LP_UNLABELED.

We only add readelf and define the properties in this patch.

Ref: https://github.com/riscv-non-isa/riscv-elf-psabi-doc/pull/417

binutils/readelf.c
binutils/testsuite/binutils-all/riscv/property-cfi-lp-unlabeled.d [new file with mode: 0644]
binutils/testsuite/binutils-all/riscv/property-cfi-ss.d [new file with mode: 0644]
binutils/testsuite/binutils-all/riscv/property.s [new file with mode: 0644]
include/elf/common.h

index dd1871d8c75a72bd0ea1ad2b5e5a3bbfd987ef98..77a88bff032fb28b22de7cc54674bfcda9dd4121 100644 (file)
@@ -21287,6 +21287,33 @@ decode_aarch64_feature_1_and (unsigned int bitmask)
     }
 }
 
+static void
+decode_riscv_feature_1_and (unsigned int bitmask)
+{
+  while (bitmask)
+    {
+      unsigned int bit = bitmask & (- bitmask);
+
+      bitmask &= ~ bit;
+      switch (bit)
+       {
+       case GNU_PROPERTY_RISCV_FEATURE_1_CFI_LP_UNLABELED:
+         printf ("CFI_LP_UNLABELED");
+         break;
+
+       case GNU_PROPERTY_RISCV_FEATURE_1_CFI_SS:
+         printf ("CFI_SS");
+         break;
+
+       default:
+         printf (_("<unknown: %x>"), bit);
+         break;
+       }
+      if (bitmask)
+       printf (", ");
+    }
+}
+
 static void
 decode_1_needed (unsigned int bitmask)
 {
@@ -21477,6 +21504,18 @@ print_gnu_property_note (Filedata * filedata, Elf_Internal_Note * pnote)
                  goto next;
                }
            }
+         else if (filedata->file_header.e_machine == EM_RISCV)
+           {
+             if (type == GNU_PROPERTY_RISCV_FEATURE_1_AND)
+               {
+                 printf ("RISC-V AND feature: ");
+                 if (datasz != 4)
+                   printf (_("<corrupt length: %#x> "), datasz);
+                 else
+                   decode_riscv_feature_1_and (byte_get (ptr, 4));
+                 goto next;
+               }
+           }
        }
       else
        {
diff --git a/binutils/testsuite/binutils-all/riscv/property-cfi-lp-unlabeled.d b/binutils/testsuite/binutils-all/riscv/property-cfi-lp-unlabeled.d
new file mode 100644 (file)
index 0000000..396b4cd
--- /dev/null
@@ -0,0 +1,8 @@
+#as: -defsym __property_zicfilp_unlabeled__=1 -march=rv64i -mabi=lp64
+#readelf: -n
+#source: property.s
+
+Displaying notes found in: .note.gnu.property
+[      ]+Owner[        ]+Data size[    ]+Description
+[      ]+GNU[  ]+0x00000010[   ]+NT_GNU_PROPERTY_TYPE_0
+[      ]+Properties: RISC-V AND feature: CFI_LP_UNLABELED
diff --git a/binutils/testsuite/binutils-all/riscv/property-cfi-ss.d b/binutils/testsuite/binutils-all/riscv/property-cfi-ss.d
new file mode 100644 (file)
index 0000000..5bc844a
--- /dev/null
@@ -0,0 +1,8 @@
+#as: -defsym __property_zicfiss__=1 -march=rv64i -mabi=lp64
+#readelf: -n
+#source: property.s
+
+Displaying notes found in: .note.gnu.property
+[      ]+Owner[        ]+Data size[    ]+Description
+[      ]+GNU[  ]+0x00000010[   ]+NT_GNU_PROPERTY_TYPE_0
+[      ]+Properties: RISC-V AND feature: CFI_SS
diff --git a/binutils/testsuite/binutils-all/riscv/property.s b/binutils/testsuite/binutils-all/riscv/property.s
new file mode 100644 (file)
index 0000000..1b62654
--- /dev/null
@@ -0,0 +1,41 @@
+       .text
+       .globl _start
+       .type _start,@function
+_start:
+    ret
+
+.ifdef __property_zicfilp_unlabeled__
+       .section ".note.gnu.property", "a"
+       .p2align 3
+       .long 1f - 0f           /* name length */
+       .long 5f - 2f           /* data length */
+       .long 5                 /* note type */
+0:     .asciz "GNU"            /* vendor name */
+1:
+       .p2align 3
+2:     .long 0xc0000000        /* pr_type.  */
+       .long 4f - 3f           /* pr_datasz.  */
+3:
+       .long 0x1               /* GNU_PROPERTY_RISCV_FEATURE_1_CFI_LP_UNLABELED.  */
+4:
+       .p2align 3
+5:
+.endif
+
+.ifdef __property_zicfiss__
+       .section ".note.gnu.property", "a"
+       .p2align 3
+       .long 1f - 0f           /* name length */
+       .long 5f - 2f           /* data length */
+       .long 5                 /* note type */
+0:     .asciz "GNU"            /* vendor name */
+1:
+       .p2align 3
+2:     .long 0xc0000000        /* pr_type.  */
+       .long 4f - 3f           /* pr_datasz.  */
+3:
+       .long 0x2               /* GNU_PROPERTY_RISCV_FEATURE_1_CFI_SS.  */
+4:
+       .p2align 3
+5:
+.endif
index fd032d1e03ed5b19f84fda4a8f1a9ecb14867de3..01812b48caa73dcef556e05b9a8f3cccd0d81603 100644 (file)
 #define GNU_PROPERTY_AARCH64_FEATURE_1_PAC     (1U << 1)
 #define GNU_PROPERTY_AARCH64_FEATURE_1_GCS     (1U << 2)
 
+/* RISC-V specific GNU PROPERTY. */
+#define GNU_PROPERTY_RISCV_FEATURE_1_AND       0xc0000000
+#define GNU_PROPERTY_RISCV_FEATURE_1_CFI_LP_UNLABELED  (1U << 0)
+#define GNU_PROPERTY_RISCV_FEATURE_1_CFI_SS            (1U << 1)
+
 /* Values used in GNU .note.ABI-tag notes (NT_GNU_ABI_TAG).  */
 #define GNU_ABI_TAG_LINUX      0
 #define GNU_ABI_TAG_HURD       1