From patchwork Mon Nov 9 18:57:34 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "H.J. Lu" X-Patchwork-Id: 1397062 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org (client-ip=8.43.85.97; helo=sourceware.org; envelope-from=gcc-patches-bounces@gcc.gnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gcc.gnu.org Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.a=rsa-sha256 header.s=default header.b=wK46rD/2; dkim-atps=neutral Received: from sourceware.org (unknown [8.43.85.97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4CVKxm3rybz9s1l for ; Tue, 10 Nov 2020 05:57:46 +1100 (AEDT) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id C1D8D3861815; Mon, 9 Nov 2020 18:57:43 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org C1D8D3861815 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1604948263; bh=jvnpe7/O29tXsWKIQ2qUtnANQigPflo1HY46zy0iwV4=; h=To:Subject:Date:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:From; b=wK46rD/2cdDzSDTA5pbmkUtQ1YcU6r07NZ2CuBAiEzTdffB+gva8ONICp8Pw75r7h gOy5OyVT8WUb4z0BqV86HK3ZNX74bjv8mWK1cC9gbPiNmJZEwVoKCHits35gujaMRJ xgDX4raWBEgREUwGAw9guc0gF8yAN+rxOoxUf73Q= X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from mail-pf1-x42d.google.com (mail-pf1-x42d.google.com [IPv6:2607:f8b0:4864:20::42d]) by sourceware.org (Postfix) with ESMTPS id 8CDCF3857C65 for ; Mon, 9 Nov 2020 18:57:40 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 8CDCF3857C65 Received: by mail-pf1-x42d.google.com with SMTP id x13so8998078pfa.9 for ; Mon, 09 Nov 2020 10:57:40 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:mime-version :content-transfer-encoding; bh=jvnpe7/O29tXsWKIQ2qUtnANQigPflo1HY46zy0iwV4=; b=k0WCLI1THYHmWwEY5mx8ADf8w1M8dx0xS23c+HqRs47ixLEDgkMB6PE4qEY8UupSX2 dPTA0hD1Y6buq689F6UlDSuFvdJwHowviXyZnhQwCI3rNR4p/uYvykeRPKLDHuAX0BoS SGQVW6Cjdw0dW5X0p+zFmLUI1g7pI1WQ6FdBofvTD7j30aTei0Suypym13nJqg1Pdv9q INVckLehCjJdwVS83gbdeQW4+FpkmG7uazJnXkEOkeP7ALtI7I7e0rfIIaSaUEaNFdXD 3Owrf9FSfT1/AUkpDWsu6rFe+tooUifqruJugPcpvDO7YSPMUvCNwGaHRxjeNygk61BU OkEg== X-Gm-Message-State: AOAM532A9P4IgSmppwoU151f3ZUK4prH5jsvO7BuevvwtGixwEt3svOO yeRQz2+IKMsuKOeKelyYF7bg683wtgc= X-Google-Smtp-Source: ABdhPJxlGixj2wUPAnAp8HGvaT4SBsudnE2Cnjr+U6fsFf8FTzWUWA/DuWmvO9K0QEOsiIfkhTvY/Q== X-Received: by 2002:aa7:9699:0:b029:18a:e057:c44 with SMTP id f25-20020aa796990000b029018ae0570c44mr15395415pfk.34.1604948258926; Mon, 09 Nov 2020 10:57:38 -0800 (PST) Received: from gnu-cfl-2.localdomain (c-69-181-90-243.hsd1.ca.comcast.net. [69.181.90.243]) by smtp.gmail.com with ESMTPSA id y8sm11936740pfe.33.2020.11.09.10.57.37 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 09 Nov 2020 10:57:38 -0800 (PST) Received: from gnu-cfl-2.localdomain (localhost [IPv6:::1]) by gnu-cfl-2.localdomain (Postfix) with ESMTP id 9AC681A00DB for ; Mon, 9 Nov 2020 10:57:36 -0800 (PST) To: gcc-patches@gcc.gnu.org Subject: [PATCH] x86: Add -mneeded for GNU_PROPERTY_X86_ISA_1_V[234] marker Date: Mon, 9 Nov 2020 10:57:34 -0800 Message-Id: <20201109185734.547879-1-hjl.tools@gmail.com> X-Mailer: git-send-email 2.28.0 MIME-Version: 1.0 X-Spam-Status: No, score=-3040.9 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, GIT_PATCH_0, KAM_SHORT, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: "H.J. Lu via Gcc-patches" From: "H.J. Lu" Reply-To: "H.J. Lu" Errors-To: gcc-patches-bounces@gcc.gnu.org Sender: "Gcc-patches" GCC 11 supports -march=x86-64-v[234] to enable x86 micro-architecture ISA levels: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97250 Binutils has been updated to support GNU_PROPERTY_X86_ISA_1_V[234] marker: https://gitlab.com/x86-psABIs/x86-64-ABI/-/merge_requests/13 with commit b0ab06937385e0ae25cebf1991787d64f439bf12 Author: H.J. Lu Date: Fri Oct 30 06:49:57 2020 -0700 x86: Support GNU_PROPERTY_X86_ISA_1_BASELINE marker and commit 32930e4edbc06bc6f10c435dbcc63131715df678 Author: H.J. Lu Date: Fri Oct 9 05:05:57 2020 -0700 x86: Support GNU_PROPERTY_X86_ISA_1_V[234] marker in x86 ELF binaries. Add -mneeded to emit GNU_PROPERTY_X86_ISA_1_NEEDED property to indicate the micro-architecture ISA level required to execute the binary. gcc/ * config.gcc: Replace cet.o with gnu-property.o. Replace i386/t-cet with i386/t-gnu-property. * config/i386/cet.c: Renamed to ... * config/i386/gnu-property.c: This. (emit_gnu_property): New function. (file_end_indicate_exec_stack_and_cet): Renamed to ... (file_end_indicate_exec_stack_and_gnu_property): This. Call emit_gnu_property to generate GNU_PROPERTY_X86_FEATURE_1_AND and GNU_PROPERTY_X86_ISA_1_NEEDED properties. * config/i386/i386.opt (mneeded): New. * config/i386/linux-common.h (file_end_indicate_exec_stack_and_cet): Renamed to ... (file_end_indicate_exec_stack_and_gnu_property): This. (TARGET_ASM_FILE_END): Updated. * config/i386/t-cet: Renamed to ... * config/i386/t-gnu-property: This. (cet.o): Renamed to ... (gnu-property.o): This. * doc/invoke.texi: Document -mneeded. gcc/testsuite/ * gcc.target/i386/x86-needed-1.c: New test. * gcc.target/i386/x86-needed-2.c: Likewise. * gcc.target/i386/x86-needed-3.c: Likewise. --- gcc/config.gcc | 4 +- gcc/config/i386/cet.c | 76 ------------ gcc/config/i386/gnu-property.c | 124 +++++++++++++++++++ gcc/config/i386/i386.opt | 4 + gcc/config/i386/linux-common.h | 4 +- gcc/config/i386/{t-cet => t-gnu-property} | 2 +- gcc/doc/invoke.texi | 8 +- gcc/testsuite/gcc.target/i386/x86-needed-1.c | 13 ++ gcc/testsuite/gcc.target/i386/x86-needed-2.c | 11 ++ gcc/testsuite/gcc.target/i386/x86-needed-3.c | 11 ++ 10 files changed, 175 insertions(+), 82 deletions(-) delete mode 100644 gcc/config/i386/cet.c create mode 100644 gcc/config/i386/gnu-property.c rename gcc/config/i386/{t-cet => t-gnu-property} (93%) create mode 100644 gcc/testsuite/gcc.target/i386/x86-needed-1.c create mode 100644 gcc/testsuite/gcc.target/i386/x86-needed-2.c create mode 100644 gcc/testsuite/gcc.target/i386/x86-needed-3.c diff --git a/gcc/config.gcc b/gcc/config.gcc index dc6d68bd4eb..9bbc4274f86 100644 --- a/gcc/config.gcc +++ b/gcc/config.gcc @@ -5226,8 +5226,8 @@ case ${target} in i[34567]86-*-darwin* | x86_64-*-darwin*) ;; i[34567]86-*-linux* | x86_64-*-linux*) - extra_objs="${extra_objs} cet.o" - tmake_file="$tmake_file i386/t-linux i386/t-cet" + extra_objs="${extra_objs} gnu-property.o" + tmake_file="$tmake_file i386/t-linux i386/t-gnu-property" ;; i[34567]86-*-kfreebsd*-gnu | x86_64-*-kfreebsd*-gnu) tmake_file="$tmake_file i386/t-kfreebsd" diff --git a/gcc/config/i386/cet.c b/gcc/config/i386/cet.c deleted file mode 100644 index 5450ac307d5..00000000000 --- 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 -. */ - -#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 00000000000..128832561e2 --- /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 +. */ + +#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 029cacb38e0..11b027e0fbb 100644 --- a/gcc/config/i386/i386.opt +++ b/gcc/config/i386/i386.opt @@ -1143,3 +1143,7 @@ Support KL built-in functions and code generation. mwidekl Target Report Mask(ISA2_WIDEKL) Var(ix86_isa_flags2) Save Support WIDEKL 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 982390d7f3e..da0fabbb398 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 similarity index 93% rename from gcc/config/i386/t-cet rename to gcc/config/i386/t-gnu-property index d685d31ebcd..fd8bbce73c9 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 # . -cet.o: $(srcdir)/config/i386/cet.c +gnu-property.o: $(srcdir)/config/i386/gnu-property.c $(COMPILE) $< $(POSTCOMPILE) diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index d01beb248e1..9593f0365e7 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -1389,7 +1389,7 @@ See RS/6000 and PowerPC Options. -mstack-protector-guard-symbol=@var{symbol} @gol -mgeneral-regs-only -mcall-ms2sysv-xlogues @gol -mindirect-branch=@var{choice} -mfunction-return=@var{choice} @gol --mindirect-branch-register} +-mindirect-branch-register -mneeded} @emph{x86 Windows Options} @gccoptlist{-mconsole -mcygwin -mno-cygwin -mdll @gol @@ -31161,6 +31161,12 @@ environments. Generate code for short address mode. This is only supported for 32-bit and x32 environments. It is the default address mode for 32-bit and x32 environments. + +@item -mneeded +@itemx -mno-needed +@opindex mneeded +Emit GNU_PROPERTY_X86_ISA_1_NEEDED GNU property for Linux target to +indicate the micro-architecture ISA level required to execute the binary. @end table @node x86 Windows Options diff --git a/gcc/testsuite/gcc.target/i386/x86-needed-1.c b/gcc/testsuite/gcc.target/i386/x86-needed-1.c new file mode 100644 index 00000000000..b4584dfaeac --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/x86-needed-1.c @@ -0,0 +1,13 @@ +/* { dg-do compile { target *-*-linux* } } */ +/* { dg-options "-fcf-protection -march=x86-64 -mneeded" } */ +/* { dg-final { scan-assembler-times ".note.gnu.property" 1 } } */ +/* { dg-final { scan-assembler-times ".long 0xc0000002" 1 } } */ +/* { dg-final { scan-assembler-times ".long 0xc0008002" 1 } } */ + +extern void foo (void); + +void +bar (void) +{ + foo (); +} diff --git a/gcc/testsuite/gcc.target/i386/x86-needed-2.c b/gcc/testsuite/gcc.target/i386/x86-needed-2.c new file mode 100644 index 00000000000..2d916562e6e --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/x86-needed-2.c @@ -0,0 +1,11 @@ +/* { dg-do compile } */ +/* { dg-options "-fcf-protection=none -march=x86-64 -mno-needed" } */ +/* { dg-final { scan-assembler-not ".note.gnu.property" } } */ + +extern void foo (void); + +void +bar (void) +{ + foo (); +} diff --git a/gcc/testsuite/gcc.target/i386/x86-needed-3.c b/gcc/testsuite/gcc.target/i386/x86-needed-3.c new file mode 100644 index 00000000000..1d93726bd32 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/x86-needed-3.c @@ -0,0 +1,11 @@ +/* { dg-do compile { target ia32 } } */ +/* { dg-options "-fcf-protection=none -march=i686 -msoft-float -mneeded" } */ +/* { dg-final { scan-assembler-not ".note.gnu.property" } } */ + +extern void foo (void); + +void +bar (void) +{ + foo (); +}