[PATCH] D62595: [AARCH64][ELF][llvm-readobj] Support for AArch64 .note.gnu.property

Peter Smith via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed May 29 08:02:43 PDT 2019


peter.smith created this revision.
peter.smith added reviewers: jhenderson, grimar, jakehehrlich, LukeCheeseman.
Herald added subscribers: rupprecht, kristof.beyls, javed.absar.

ELF for the 64-bit Arm Architecture defines a processor specific property type GNU_PROPERTY_AARCH64_FEATURE_1_AND as GNU_PROPERTY_LOPROC. This property works in a similar way to the existing X86 processor specific property GNU_PROPERTY_GNU_X86_FEATURE_1_AND.

      

Two feature bits are defined for GNU_PROPERTY_AARCH64_FEATURE_1_AND:

- GNU_PROPERTY_AARCH64_FEATURE_1_BTI 0x1
- GNU_PROPERTY_AARCH64_FEATURE_1_PAC 0x2

This patch defines the property, feature bits and implements support for printing in llvm-readobj.

The overall destination is support for BTI and PAC in LLD.

The ELF for the 64-bit Arm Architecture spec with the above features defined can be found at: https://developer.arm.com/docs/ihi0056/latest/elf-for-the-arm-64-bit-architecture-aarch64-abi-2019q1-documentation


https://reviews.llvm.org/D62595

Files:
  include/llvm/BinaryFormat/ELF.h
  test/tools/llvm-readobj/aarch64-note-gnu-property.s
  tools/llvm-readobj/ELFDumper.cpp


Index: tools/llvm-readobj/ELFDumper.cpp
===================================================================
--- tools/llvm-readobj/ELFDumper.cpp
+++ tools/llvm-readobj/ELFDumper.cpp
@@ -3745,6 +3745,22 @@
     if (DataSize)
       OS << format(" <corrupt length: 0x%x>", DataSize);
     return OS.str();
+  case GNU_PROPERTY_AARCH64_FEATURE_1_AND:
+    OS << "aarch64 feature: ";
+    if (DataSize != 4) {
+      OS << format("<corrupt length: 0x%x>", DataSize);
+      return OS.str();
+    }
+    PrData = support::endian::read32<ELFT::TargetEndianness>(Data.data());
+    if (PrData == 0) {
+      OS << "<None>";
+      return OS.str();
+    }
+    DumpBit(GNU_PROPERTY_AARCH64_FEATURE_1_BTI, "BTI");
+    DumpBit(GNU_PROPERTY_AARCH64_FEATURE_1_PAC, "PAC");
+    if (PrData)
+      OS << format("<unknown flags: 0x%x>", PrData);
+    return OS.str();
   case GNU_PROPERTY_X86_FEATURE_1_AND:
     OS << "x86 feature: ";
     if (DataSize != 4) {
Index: test/tools/llvm-readobj/aarch64-note-gnu-property.s
===================================================================
--- /dev/null
+++ test/tools/llvm-readobj/aarch64-note-gnu-property.s
@@ -0,0 +1,39 @@
+// REQUIRES: aarch64-registered-target
+// RUN: llvm-mc -filetype=obj -triple aarch64-linux-gnu %s -o %t
+// RUN: llvm-readobj -elf-output-style GNU --notes %t | FileCheck %s --check-prefix=GNU
+// RUN: llvm-readobj -elf-output-style LLVM --notes %t | FileCheck %s --check-prefix=LLVM
+
+// GNU: Displaying notes found at file offset 0x00000040 with length 0x00000020:
+// GNU-NEXT:   Owner                 Data size	Description
+// GNU-NEXT:   GNU                   0x00000010	NT_GNU_PROPERTY_TYPE_0 (property note)
+// GNU-NEXT:     Properties:    aarch64 feature: BTI, PAC
+
+// LLVM:      Notes [
+// LLVM-NEXT:   NoteSection {
+// LLVM-NEXT:     Offset: 0x40
+// LLVM-NEXT:     Size: 0x20
+// LLVM-NEXT:     Note {
+// LLVM-NEXT:       Owner: GNU
+// LLVM-NEXT:       Data size: 0x10
+// LLVM-NEXT:       Type: NT_GNU_PROPERTY_TYPE_0 (property note)
+// LLVM-NEXT:       Property [
+// LLVM-NEXT:         aarch64 feature: BTI, PAC
+// LLVM-NEXT:       ]
+// LLVM-NEXT:     }
+// LLVM-NEXT:   }
+// LLVM-NEXT: ]
+
+.section ".note.gnu.property", "a"
+.align 4
+  .long 4           /* Name length is always 4 ("GNU") */
+  .long end - begin /* Data length */
+  .long 5           /* Type: NT_GNU_PROPERTY_TYPE_0 */
+  .asciz "GNU"      /* Name */
+  .p2align 3
+begin:
+  /* BTI and PAC property note */
+  .long 0xc0000000  /* Type: GNU_PROPERTY_AARCH64_FEATURE_1_AND */
+  .long 4           /* Data size */
+  .long 3           /* BTI and PAC */
+  .p2align 3        /* Align to 8 byte for 64 bit */
+end:
Index: include/llvm/BinaryFormat/ELF.h
===================================================================
--- include/llvm/BinaryFormat/ELF.h
+++ include/llvm/BinaryFormat/ELF.h
@@ -1364,6 +1364,7 @@
 enum : unsigned {
   GNU_PROPERTY_STACK_SIZE = 1,
   GNU_PROPERTY_NO_COPY_ON_PROTECTED = 2,
+  GNU_PROPERTY_AARCH64_FEATURE_1_AND = 0xc0000000,
   GNU_PROPERTY_X86_FEATURE_1_AND = 0xc0000002,
   GNU_PROPERTY_X86_ISA_1_NEEDED = 0xc0008000,
   GNU_PROPERTY_X86_FEATURE_2_NEEDED = 0xc0008001,
@@ -1371,6 +1372,12 @@
   GNU_PROPERTY_X86_FEATURE_2_USED = 0xc0010001,
 };
 
+// aarch64 processor feature bits.
+enum : unsigned {
+  GNU_PROPERTY_AARCH64_FEATURE_1_BTI = 1 << 0,
+  GNU_PROPERTY_AARCH64_FEATURE_1_PAC = 1 << 1,
+};
+
 // x86 processor feature bits.
 enum : unsigned {
   GNU_PROPERTY_X86_FEATURE_1_IBT = 1 << 0,


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D62595.201913.patch
Type: text/x-patch
Size: 3497 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190529/32eb5fad/attachment.bin>


More information about the llvm-commits mailing list