From: Peter Smith Date: Tue, 4 Jun 2019 11:28:22 +0000 (+0000) Subject: [AARCH64][ELF][llvm-readobj] Support for AArch64 .note.gnu.property X-Git-Tag: llvmorg-10-init~3818 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=580c6d31c00dd038ca0ea1ea72f54b4db4fd4bef;p=platform%2Fupstream%2Fllvm.git [AARCH64][ELF][llvm-readobj] Support for AArch64 .note.gnu.property 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. Differential Revision: https://reviews.llvm.org/D62595 llvm-svn: 362490 --- diff --git a/llvm/include/llvm/BinaryFormat/ELF.h b/llvm/include/llvm/BinaryFormat/ELF.h index 8258bb3..1ad5866 100644 --- a/llvm/include/llvm/BinaryFormat/ELF.h +++ b/llvm/include/llvm/BinaryFormat/ELF.h @@ -1364,6 +1364,7 @@ enum { 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 @@ enum : unsigned { 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, diff --git a/llvm/test/tools/llvm-readobj/AArch64/aarch64-note-gnu-property.s b/llvm/test/tools/llvm-readobj/AArch64/aarch64-note-gnu-property.s new file mode 100644 index 0000000..693b6c93 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/AArch64/aarch64-note-gnu-property.s @@ -0,0 +1,38 @@ +// RUN: llvm-mc -filetype=obj -triple aarch64-linux-gnu %s -o %t +// RUN: llvm-readelf --notes %t | FileCheck %s --check-prefix=GNU +// RUN: llvm-readobj --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: diff --git a/llvm/tools/llvm-readobj/ELFDumper.cpp b/llvm/tools/llvm-readobj/ELFDumper.cpp index 1012cf1..f87be61 100644 --- a/llvm/tools/llvm-readobj/ELFDumper.cpp +++ b/llvm/tools/llvm-readobj/ELFDumper.cpp @@ -3840,8 +3840,10 @@ static std::string getGNUProperty(uint32_t Type, uint32_t DataSize, if (DataSize) OS << format(" ", DataSize); return OS.str(); + case GNU_PROPERTY_AARCH64_FEATURE_1_AND: case GNU_PROPERTY_X86_FEATURE_1_AND: - OS << "x86 feature: "; + OS << ((Type == GNU_PROPERTY_AARCH64_FEATURE_1_AND) ? "aarch64 feature: " + : "x86 feature: "); if (DataSize != 4) { OS << format("", DataSize); return OS.str(); @@ -3851,8 +3853,13 @@ static std::string getGNUProperty(uint32_t Type, uint32_t DataSize, OS << ""; return OS.str(); } - DumpBit(GNU_PROPERTY_X86_FEATURE_1_IBT, "IBT"); - DumpBit(GNU_PROPERTY_X86_FEATURE_1_SHSTK, "SHSTK"); + if (Type == GNU_PROPERTY_AARCH64_FEATURE_1_AND) { + DumpBit(GNU_PROPERTY_AARCH64_FEATURE_1_BTI, "BTI"); + DumpBit(GNU_PROPERTY_AARCH64_FEATURE_1_PAC, "PAC"); + } else { + DumpBit(GNU_PROPERTY_X86_FEATURE_1_IBT, "IBT"); + DumpBit(GNU_PROPERTY_X86_FEATURE_1_SHSTK, "SHSTK"); + } if (PrData) OS << format("", PrData); return OS.str();