diff options
Diffstat (limited to 'gcc/config/i386')
-rw-r--r-- | gcc/config/i386/cet.c | 76 | ||||
-rw-r--r-- | gcc/config/i386/gnu-property.c | 124 | ||||
-rw-r--r-- | gcc/config/i386/i386.opt | 4 | ||||
-rw-r--r-- | gcc/config/i386/linux-common.h | 4 | ||||
-rw-r--r-- | gcc/config/i386/t-gnu-property (renamed from gcc/config/i386/t-cet) | 2 |
5 files changed, 131 insertions, 79 deletions
diff --git a/gcc/config/i386/cet.c b/gcc/config/i386/cet.c deleted file mode 100644 index 5450ac3..0000000 --- a/gcc/config/i386/cet.c +++ /dev/null @@ -1,76 +0,0 @@ -/* Functions for CET/x86. - Copyright (C) 2017-2020 Free Software Foundation, Inc. - -This file is part of GCC. - -GCC is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 3, or (at your option) -any later version. - -GCC is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GCC; see the file COPYING3. If not see -<http://www.gnu.org/licenses/>. */ - -#include "config.h" -#include "system.h" -#include "coretypes.h" -#include "tm.h" -#include "output.h" -#include "linux-common.h" - -void -file_end_indicate_exec_stack_and_cet (void) -{ - file_end_indicate_exec_stack (); - - if (flag_cf_protection == CF_NONE) - return; - - unsigned int feature_1 = 0; - - if (flag_cf_protection & CF_BRANCH) - /* GNU_PROPERTY_X86_FEATURE_1_IBT. */ - feature_1 |= 0x1; - - if (flag_cf_protection & CF_RETURN) - /* GNU_PROPERTY_X86_FEATURE_1_SHSTK. */ - feature_1 |= 0x2; - - if (feature_1) - { - int p2align = ptr_mode == SImode ? 2 : 3; - - /* Generate GNU_PROPERTY_X86_FEATURE_1_XXX. */ - switch_to_section (get_section (".note.gnu.property", - SECTION_NOTYPE, NULL)); - - ASM_OUTPUT_ALIGN (asm_out_file, p2align); - /* name length. */ - fprintf (asm_out_file, ASM_LONG " 1f - 0f\n"); - /* data length. */ - fprintf (asm_out_file, ASM_LONG " 4f - 1f\n"); - /* note type: NT_GNU_PROPERTY_TYPE_0. */ - fprintf (asm_out_file, ASM_LONG " 5\n"); - fprintf (asm_out_file, "0:\n"); - /* vendor name: "GNU". */ - fprintf (asm_out_file, STRING_ASM_OP " \"GNU\"\n"); - fprintf (asm_out_file, "1:\n"); - ASM_OUTPUT_ALIGN (asm_out_file, p2align); - /* pr_type: GNU_PROPERTY_X86_FEATURE_1_AND. */ - fprintf (asm_out_file, ASM_LONG " 0xc0000002\n"); - /* pr_datasz. */\ - fprintf (asm_out_file, ASM_LONG " 3f - 2f\n"); - fprintf (asm_out_file, "2:\n"); - /* GNU_PROPERTY_X86_FEATURE_1_XXX. */ - fprintf (asm_out_file, ASM_LONG " 0x%x\n", feature_1); - fprintf (asm_out_file, "3:\n"); - ASM_OUTPUT_ALIGN (asm_out_file, p2align); - fprintf (asm_out_file, "4:\n"); - } -} diff --git a/gcc/config/i386/gnu-property.c b/gcc/config/i386/gnu-property.c new file mode 100644 index 0000000..1288325 --- /dev/null +++ b/gcc/config/i386/gnu-property.c @@ -0,0 +1,124 @@ +/* Functions for x86 GNU property. + Copyright (C) 2017-2020 Free Software Foundation, Inc. + +This file is part of GCC. + +GCC is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 3, or (at your option) +any later version. + +GCC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with GCC; see the file COPYING3. If not see +<http://www.gnu.org/licenses/>. */ + +#include "config.h" +#include "system.h" +#include "coretypes.h" +#include "tm.h" +#include "output.h" +#include "linux-common.h" + +static void +emit_gnu_property (unsigned int type, unsigned int data) +{ + int p2align = ptr_mode == SImode ? 2 : 3; + + switch_to_section (get_section (".note.gnu.property", + SECTION_NOTYPE, NULL)); + + ASM_OUTPUT_ALIGN (asm_out_file, p2align); + /* name length. */ + fprintf (asm_out_file, ASM_LONG "1f - 0f\n"); + /* data length. */ + fprintf (asm_out_file, ASM_LONG "4f - 1f\n"); + /* note type: NT_GNU_PROPERTY_TYPE_0. */ + fprintf (asm_out_file, ASM_LONG "5\n"); + fprintf (asm_out_file, "0:\n"); + /* vendor name: "GNU". */ + fprintf (asm_out_file, STRING_ASM_OP "\"GNU\"\n"); + fprintf (asm_out_file, "1:\n"); + ASM_OUTPUT_ALIGN (asm_out_file, p2align); + /* pr_type. */ + fprintf (asm_out_file, ASM_LONG "0x%x\n", type); + /* pr_datasz. */ + fprintf (asm_out_file, ASM_LONG "3f - 2f\n"); + fprintf (asm_out_file, "2:\n"); + fprintf (asm_out_file, ASM_LONG "0x%x\n", data); + fprintf (asm_out_file, "3:\n"); + ASM_OUTPUT_ALIGN (asm_out_file, p2align); + fprintf (asm_out_file, "4:\n"); +} + +void +file_end_indicate_exec_stack_and_gnu_property (void) +{ + file_end_indicate_exec_stack (); + + if (flag_cf_protection == CF_NONE && !ix86_needed) + return; + + unsigned int feature_1 = 0; + + if (flag_cf_protection & CF_BRANCH) + /* GNU_PROPERTY_X86_FEATURE_1_IBT. */ + feature_1 |= 0x1; + + if (flag_cf_protection & CF_RETURN) + /* GNU_PROPERTY_X86_FEATURE_1_SHSTK. */ + feature_1 |= 0x2; + + /* Generate GNU_PROPERTY_X86_FEATURE_1_AND. */ + if (feature_1) + emit_gnu_property (0xc0000002, feature_1); + + unsigned int isa_1 = 0; + if (ix86_needed) + { + /* GNU_PROPERTY_X86_ISA_1_BASELINE. */ + if (TARGET_64BIT + || TARGET_FXSR + || TARGET_80387 + || TARGET_MMX + || TARGET_SSE + || TARGET_SSE2) + isa_1 |= 1 << 0; + + /* GNU_PROPERTY_X86_ISA_1_V2. */ + if (TARGET_CMPXCHG16B + || (TARGET_64BIT && TARGET_SAHF) + || TARGET_POPCNT + || TARGET_SSE3 + || TARGET_SSSE3 + || TARGET_SSE4_1 + || TARGET_SSE4_2) + isa_1 |= 1 << 1; + + /* GNU_PROPERTY_X86_ISA_1_V3. */ + if (TARGET_AVX + || TARGET_AVX2 + || TARGET_F16C + || TARGET_FMA + || TARGET_LZCNT + || TARGET_MOVBE + || TARGET_XSAVE) + isa_1 |= 1 << 2; + + /* GNU_PROPERTY_X86_ISA_1_V4. */ + if (TARGET_AVX512F + || TARGET_AVX512BW + || TARGET_AVX512CD + || TARGET_AVX512DQ + || TARGET_AVX512VL) + isa_1 |= 1 << 3; + } + + /* Generate GNU_PROPERTY_X86_ISA_1_NEEDED. */ + if (isa_1) + emit_gnu_property (0xc0008002, isa_1); +} diff --git a/gcc/config/i386/i386.opt b/gcc/config/i386/i386.opt index fac76e4..d7e4f44 100644 --- a/gcc/config/i386/i386.opt +++ b/gcc/config/i386/i386.opt @@ -1148,3 +1148,7 @@ mavxvnni Target Report Mask(ISA2_AVXVNNI) Var(ix86_isa_flags2) Save Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX, AVX2, and AVXVNNI built-in functions and code generation. + +mneeded +Target Report Var(ix86_needed) Save +Emit GNU_PROPERTY_X86_ISA_1_NEEDED GNU property diff --git a/gcc/config/i386/linux-common.h b/gcc/config/i386/linux-common.h index 982390d..da0fabb 100644 --- a/gcc/config/i386/linux-common.h +++ b/gcc/config/i386/linux-common.h @@ -65,7 +65,7 @@ along with GCC; see the file COPYING3. If not see #define MPX_LD_AS_NEEDED_GUARD_POP "" #endif -extern void file_end_indicate_exec_stack_and_cet (void); +extern void file_end_indicate_exec_stack_and_gnu_property (void); #undef TARGET_ASM_FILE_END -#define TARGET_ASM_FILE_END file_end_indicate_exec_stack_and_cet +#define TARGET_ASM_FILE_END file_end_indicate_exec_stack_and_gnu_property diff --git a/gcc/config/i386/t-cet b/gcc/config/i386/t-gnu-property index d685d31..fd8bbce 100644 --- a/gcc/config/i386/t-cet +++ b/gcc/config/i386/t-gnu-property @@ -16,6 +16,6 @@ # along with GCC; see the file COPYING3. If not see # <http://www.gnu.org/licenses/>. -cet.o: $(srcdir)/config/i386/cet.c +gnu-property.o: $(srcdir)/config/i386/gnu-property.c $(COMPILE) $< $(POSTCOMPILE) |