diff --git a/llvm/include/llvm/BinaryFormat/ELF.h b/llvm/include/llvm/BinaryFormat/ELF.h --- a/llvm/include/llvm/BinaryFormat/ELF.h +++ b/llvm/include/llvm/BinaryFormat/ELF.h @@ -1470,8 +1470,14 @@ GNU_PROPERTY_NO_COPY_ON_PROTECTED = 2, GNU_PROPERTY_AARCH64_FEATURE_1_AND = 0xc0000000, GNU_PROPERTY_X86_FEATURE_1_AND = 0xc0000002, - GNU_PROPERTY_X86_FEATURE_2_NEEDED = 0xc0008001, - GNU_PROPERTY_X86_FEATURE_2_USED = 0xc0010001, + + GNU_PROPERTY_X86_UINT32_OR_LO = 0xc0008000, + GNU_PROPERTY_X86_FEATURE_2_NEEDED = GNU_PROPERTY_X86_UINT32_OR_LO + 1, + GNU_PROPERTY_X86_ISA_1_NEEDED = GNU_PROPERTY_X86_UINT32_OR_LO + 2, + + GNU_PROPERTY_X86_UINT32_OR_AND_LO = 0xc0010000, + GNU_PROPERTY_X86_FEATURE_2_USED = GNU_PROPERTY_X86_UINT32_OR_AND_LO + 1, + GNU_PROPERTY_X86_ISA_1_USED = GNU_PROPERTY_X86_UINT32_OR_AND_LO + 2, }; // aarch64 processor feature bits. @@ -1495,6 +1501,11 @@ GNU_PROPERTY_X86_FEATURE_2_XSAVE = 1 << 7, GNU_PROPERTY_X86_FEATURE_2_XSAVEOPT = 1 << 8, GNU_PROPERTY_X86_FEATURE_2_XSAVEC = 1 << 9, + + GNU_PROPERTY_X86_ISA_1_BASELINE = 1 << 0, + GNU_PROPERTY_X86_ISA_1_V2 = 1 << 1, + GNU_PROPERTY_X86_ISA_1_V3 = 1 << 2, + GNU_PROPERTY_X86_ISA_1_V4 = 1 << 3, }; // FreeBSD note types. diff --git a/llvm/test/tools/llvm-readobj/ELF/note-gnu-property.s b/llvm/test/tools/llvm-readobj/ELF/note-gnu-property.s --- a/llvm/test/tools/llvm-readobj/ELF/note-gnu-property.s +++ b/llvm/test/tools/llvm-readobj/ELF/note-gnu-property.s @@ -5,7 +5,7 @@ // GNU: Displaying notes found in: .note.gnu.property // GNU-NEXT: Owner Data size Description -// GNU-NEXT: GNU 0x000000c8 NT_GNU_PROPERTY_TYPE_0 (property note) +// GNU-NEXT: GNU 0x000000e8 NT_GNU_PROPERTY_TYPE_0 (property note) // GNU-NEXT: Properties: stack size: 0x100 // GNU-NEXT: stack size: 0x100 // GNU-NEXT: no copy on protected @@ -14,6 +14,8 @@ // GNU-NEXT: x86 feature: // GNU-NEXT: x86 feature needed: x86, x87, MMX, XMM, YMM // GNU-NEXT: x86 feature used: ZMM, FXSR, XSAVE, XSAVEOPT, XSAVEC +// GNU-NEXT: x86 ISA needed: x86-64-baseline, x86-64-v2, x86-64-v3, x86-64-v4 +// GNU-NEXT: x86 ISA used: x86-64-baseline, x86-64-v2, x86-64-v3, x86-64-v4 // GNU-NEXT: // GNU-NEXT: stack size: // GNU-NEXT: stack size: @@ -26,10 +28,10 @@ // LLVM-NEXT: NoteSection { // LLVM-NEXT: Name: .note.gnu.property // LLVM-NEXT: Offset: 0x40 -// LLVM-NEXT: Size: 0xD8 +// LLVM-NEXT: Size: 0xF8 // LLVM-NEXT: Note { // LLVM-NEXT: Owner: GNU -// LLVM-NEXT: Data size: 0xC8 +// LLVM-NEXT: Data size: 0xE8 // LLVM-NEXT: Type: NT_GNU_PROPERTY_TYPE_0 (property note) // LLVM-NEXT: Property [ // LLVM-NEXT: stack size: 0x100 @@ -40,6 +42,8 @@ // LLVM-NEXT: x86 feature: // LLVM-NEXT: x86 feature needed: x86, x87, MMX, XMM, YMM // LLVM-NEXT: x86 feature used: ZMM, FXSR, XSAVE, XSAVEOPT, XSAVEC +// LLVM-NEXT: x86 ISA needed: x86-64-baseline, x86-64-v2, x86-64-v3, x86-64-v4 +// LLVM-NEXT: x86 ISA used: x86-64-baseline, x86-64-v2, x86-64-v3, x86-64-v4 // LLVM-NEXT: // LLVM-NEXT: stack size: // LLVM-NEXT: stack size: @@ -102,6 +106,16 @@ .long 0x000003e0 /* ZMM, ... */ .p2align 3 /* Align to 8 byte for 64 bit */ + .long 0xc0008002 /* Type: GNU_PROPERTY_X86_ISA_1_NEEDED */ + .long 4 /* Data size */ + .long 0x0000000f /* x86-64-baseline, ... */ + .p2align 3 /* Align to 8 byte for 64 bit */ + + .long 0xc0010002 /* Type: GNU_PROPERTY_X86_ISA_1_USED */ + .long 4 /* Data size */ + .long 0x0000000f /* x86-64-baseline, ... */ + .p2align 3 /* Align to 8 byte for 64 bit */ + /* All notes below are broken. Test we are able to report them. */ /* Broken note type */ diff --git a/llvm/tools/llvm-readobj/ELFDumper.cpp b/llvm/tools/llvm-readobj/ELFDumper.cpp --- a/llvm/tools/llvm-readobj/ELFDumper.cpp +++ b/llvm/tools/llvm-readobj/ELFDumper.cpp @@ -4762,6 +4762,26 @@ if (PrData) OS << format("", PrData); return OS.str(); + case GNU_PROPERTY_X86_ISA_1_NEEDED: + case GNU_PROPERTY_X86_ISA_1_USED: + OS << "x86 ISA " + << (Type == GNU_PROPERTY_X86_ISA_1_NEEDED ? "needed: " : "used: "); + if (DataSize != 4) { + OS << format("", DataSize); + return OS.str(); + } + PrData = support::endian::read32(Data.data()); + if (PrData == 0) { + OS << ""; + return OS.str(); + } + DumpBit(GNU_PROPERTY_X86_ISA_1_BASELINE, "x86-64-baseline"); + DumpBit(GNU_PROPERTY_X86_ISA_1_V2, "x86-64-v2"); + DumpBit(GNU_PROPERTY_X86_ISA_1_V3, "x86-64-v3"); + DumpBit(GNU_PROPERTY_X86_ISA_1_V4, "x86-64-v4"); + if (PrData) + OS << format("", PrData); + return OS.str(); } }