From 6271dd984d7f920d4fb17ad37af6a1f8e6b796dc Mon Sep 17 00:00:00 2001 From: Wilco Dijkstra Date: Wed, 20 Nov 2019 16:29:23 +0000 Subject: [PATCH] PR85678: Change default to -fno-common GCC currently defaults to -fcommon. As discussed in the PR, this is an ancient C feature which is not conforming with the latest C standards. On many targets this means global variable accesses have a codesize and performance penalty. This applies to C code only, C++ code is not affected by -fcommon. It is about time to change the default. gcc/ PR85678 * common.opt (fcommon): Change init to 1. * invoke.texi (-fcommon): Update documentation. testsuite/ * g++.dg/lto/odr-6_1.c: Add -fcommon. * gcc.dg/alias-15.c: Likewise. * gcc.dg/fdata-sections-1.c: Likewise. * gcc.dg/ipa/pr77653.c: Likewise. * gcc.dg/lto/20090729_0.c: Likewise. * gcc.dg/lto/20111207-1_0.c: Likewise. * gcc.dg/lto/c-compatible-types-1_0.c: Likewise. * gcc.dg/lto/pr55525_0.c: Likewise. * gcc.dg/lto/pr88077_0.c: Use long to avoid alignment warning. * gcc.dg/lto/pr88077_1.c: Add -fcommon. * gcc.target/aarch64/sve/peel_ind_1.c: Allow ANCHOR0. * gcc.target/aarch64/sve/peel_ind_2.c: Likewise. * gcc.target/aarch64/sve/peel_ind_3.c: Likewise. * gcc.target/i386/volatile-bitfields-2.c: Allow movl or movq. From-SVN: r278509 --- gcc/ChangeLog | 6 ++++ gcc/common.opt | 2 +- gcc/doc/invoke.texi | 42 +++++++++------------- gcc/testsuite/ChangeLog | 18 ++++++++++ gcc/testsuite/g++.dg/lto/odr-6_1.c | 1 + gcc/testsuite/gcc.dg/alias-15.c | 2 +- gcc/testsuite/gcc.dg/fdata-sections-1.c | 2 +- gcc/testsuite/gcc.dg/ipa/pr77653.c | 2 +- gcc/testsuite/gcc.dg/lto/20090729_0.c | 2 +- gcc/testsuite/gcc.dg/lto/20111207-1_0.c | 2 +- gcc/testsuite/gcc.dg/lto/c-compatible-types-1_0.c | 2 +- gcc/testsuite/gcc.dg/lto/pr55525_0.c | 2 +- gcc/testsuite/gcc.dg/lto/pr88077_0.c | 2 +- gcc/testsuite/gcc.dg/lto/pr88077_1.c | 2 ++ gcc/testsuite/gcc.target/aarch64/sve/peel_ind_1.c | 2 +- gcc/testsuite/gcc.target/aarch64/sve/peel_ind_2.c | 2 +- gcc/testsuite/gcc.target/aarch64/sve/peel_ind_3.c | 2 +- .../gcc.target/i386/volatile-bitfields-2.c | 2 +- 18 files changed, 57 insertions(+), 38 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7ba3698..4b51688 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2019-11-20 Wilco Dijkstra + + PR85678 + * common.opt (fcommon): Change init to 1. + * doc/invoke.texi (-fcommon): Update documentation. + 2019-11-20 Jan Hubicka * fibonacci_heap.h (fibonacci_heap::consolidate): Turn auto_vec diff --git a/gcc/common.opt b/gcc/common.opt index e7b8782..404b6aa 100644 --- a/gcc/common.opt +++ b/gcc/common.opt @@ -1131,7 +1131,7 @@ Common Report Var(flag_combine_stack_adjustments) Optimization Looks for opportunities to reduce stack adjustments and stack references. fcommon -Common Report Var(flag_no_common,0) +Common Report Var(flag_no_common,0) Init(1) Put uninitialized globals in the common section. fcompare-debug diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index 2117e5e..031bfd2 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -569,7 +569,7 @@ Objective-C and Objective-C++ Dialects}. -fnon-call-exceptions -fdelete-dead-exceptions -funwind-tables @gol -fasynchronous-unwind-tables @gol -fno-gnu-unique @gol --finhibit-size-directive -fno-common -fno-ident @gol +-finhibit-size-directive -fcommon -fno-ident @gol -fpcc-struct-return -fpic -fPIC -fpie -fPIE -fno-plt @gol -fno-jump-tables @gol -frecord-gcc-switches @gol @@ -14112,35 +14112,27 @@ useful for building programs to run under WINE@. code that is not binary compatible with code generated without that switch. Use it to conform to a non-default application binary interface. -@item -fno-common -@opindex fno-common +@item -fcommon @opindex fcommon +@opindex fno-common @cindex tentative definitions -In C code, this option controls the placement of global variables -defined without an initializer, known as @dfn{tentative definitions} -in the C standard. Tentative definitions are distinct from declarations +In C code, this option controls the placement of global variables +defined without an initializer, known as @dfn{tentative definitions} +in the C standard. Tentative definitions are distinct from declarations of a variable with the @code{extern} keyword, which do not allocate storage. -Unix C compilers have traditionally allocated storage for -uninitialized global variables in a common block. This allows the -linker to resolve all tentative definitions of the same variable +The default is @option{-fno-common}, which specifies that the compiler places +uninitialized global variables in the BSS section of the object file. +This inhibits the merging of tentative definitions by the linker so you get a +multiple-definition error if the same variable is accidentally defined in more +than one compilation unit. + +The @option{-fcommon} places uninitialized global variables in a common block. +This allows the linker to resolve all tentative definitions of the same variable in different compilation units to the same object, or to a non-tentative -definition. -This is the behavior specified by @option{-fcommon}, and is the default for -GCC on most targets. -On the other hand, this behavior is not required by ISO -C, and on some targets may carry a speed or code size penalty on -variable references. - -The @option{-fno-common} option specifies that the compiler should instead -place uninitialized global variables in the BSS section of the object file. -This inhibits the merging of tentative definitions by the linker so -you get a multiple-definition error if the same -variable is defined in more than one compilation unit. -Compiling with @option{-fno-common} is useful on targets for which -it provides better performance, or if you wish to verify that the -program will work on other systems that always treat uninitialized -variable definitions this way. +definition. This behavior does not conform to ISO C, is inconsistent with C++, +and on many targets implies a speed and code size penalty on global variable +references. It is mainly useful to enable legacy code to link without errors. @item -fno-ident @opindex fno-ident diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 057b5d6..8aad0e4 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,21 @@ +2019-11-20 Wilco Dijkstra + + PR85678 + * g++.dg/lto/odr-6_1.c: Add -fcommon. + * gcc.dg/alias-15.c: Likewise. + * gcc.dg/fdata-sections-1.c: Likewise. + * gcc.dg/ipa/pr77653.c: Likewise. + * gcc.dg/lto/20090729_0.c: Likewise. + * gcc.dg/lto/20111207-1_0.c: Likewise. + * gcc.dg/lto/c-compatible-types-1_0.c: Likewise. + * gcc.dg/lto/pr55525_0.c: Likewise. + * gcc.dg/lto/pr88077_0.c: Use long to avoid alignment warning. + * gcc.dg/lto/pr88077_1.c: Add -fcommon. + * gcc.target/aarch64/sve/peel_ind_1.c: Allow ANCHOR0. + * gcc.target/aarch64/sve/peel_ind_2.c: Likewise. + * gcc.target/aarch64/sve/peel_ind_3.c: Likewise. + * gcc.target/i386/volatile-bitfields-2.c: Allow movl or movq. + 2019-11-20 Richard Biener * gcc.dg/vect/bb-slp-42.c: Adjust. diff --git a/gcc/testsuite/g++.dg/lto/odr-6_1.c b/gcc/testsuite/g++.dg/lto/odr-6_1.c index ee4bff4..8328bf5 100644 --- a/gcc/testsuite/g++.dg/lto/odr-6_1.c +++ b/gcc/testsuite/g++.dg/lto/odr-6_1.c @@ -1,3 +1,4 @@ +/* { dg-options {-fcommon} } */ struct {} admbaserest_; // { dg-lto-message "type of " 2 } diff --git a/gcc/testsuite/gcc.dg/alias-15.c b/gcc/testsuite/gcc.dg/alias-15.c index 0a8e69b..304ad1f 100644 --- a/gcc/testsuite/gcc.dg/alias-15.c +++ b/gcc/testsuite/gcc.dg/alias-15.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-additional-options "-O2 -fdump-ipa-cgraph" } */ +/* { dg-additional-options "-O2 -fcommon -fdump-ipa-cgraph" } */ /* RTL-level CSE shouldn't introduce LCO (for the string) into varpool */ char *p; diff --git a/gcc/testsuite/gcc.dg/fdata-sections-1.c b/gcc/testsuite/gcc.dg/fdata-sections-1.c index e8a6639..de5ddfc 100644 --- a/gcc/testsuite/gcc.dg/fdata-sections-1.c +++ b/gcc/testsuite/gcc.dg/fdata-sections-1.c @@ -2,7 +2,7 @@ /* Origin: Jonathan Larmour */ /* { dg-do compile { target *-*-linux* *-*-gnu* *-*-uclinux* } } */ -/* { dg-options "-fdata-sections" } */ +/* { dg-options "-fcommon -fdata-sections" } */ int x; diff --git a/gcc/testsuite/gcc.dg/ipa/pr77653.c b/gcc/testsuite/gcc.dg/ipa/pr77653.c index f0b2b22..2fddb7e 100644 --- a/gcc/testsuite/gcc.dg/ipa/pr77653.c +++ b/gcc/testsuite/gcc.dg/ipa/pr77653.c @@ -1,5 +1,5 @@ /* { dg-require-alias "" } */ -/* { dg-options "-O2 -fdump-ipa-icf-details" } */ +/* { dg-options "-O2 -fcommon -fdump-ipa-icf-details" } */ int a, b, c, d, e, h, i, j, k, l; const int f; diff --git a/gcc/testsuite/gcc.dg/lto/20090729_0.c b/gcc/testsuite/gcc.dg/lto/20090729_0.c index 05ae74f..13fe62b 100644 --- a/gcc/testsuite/gcc.dg/lto/20090729_0.c +++ b/gcc/testsuite/gcc.dg/lto/20090729_0.c @@ -1,4 +1,4 @@ -/* { dg-lto-options "-w" } */ +/* { dg-lto-options { {-fcommon -w} {-fcommon} } } */ double i; int j; diff --git a/gcc/testsuite/gcc.dg/lto/20111207-1_0.c b/gcc/testsuite/gcc.dg/lto/20111207-1_0.c index 4862640..5f11264 100644 --- a/gcc/testsuite/gcc.dg/lto/20111207-1_0.c +++ b/gcc/testsuite/gcc.dg/lto/20111207-1_0.c @@ -1,4 +1,4 @@ /* { dg-lto-do run } */ -/* { dg-lto-options { { -flto } } } */ +/* { dg-lto-options { { -flto -fcommon } {-fcommon} {-fcommon} {-fcommon} } } */ /* { dg-require-linker-plugin "" } */ /* { dg-extra-ld-options "-fuse-linker-plugin" } */ diff --git a/gcc/testsuite/gcc.dg/lto/c-compatible-types-1_0.c b/gcc/testsuite/gcc.dg/lto/c-compatible-types-1_0.c index 376da00..45b0373 100644 --- a/gcc/testsuite/gcc.dg/lto/c-compatible-types-1_0.c +++ b/gcc/testsuite/gcc.dg/lto/c-compatible-types-1_0.c @@ -1,5 +1,5 @@ /* { dg-lto-do run } */ -/* { dg-lto-options "-O3" } */ +/* { dg-lto-options { {-O3 -fcommon} {-fcommon} } } */ /* By C standard Each enumerated type shall be compatible with char, a signed integer, type, or an unsigned integer type. The choice of type is diff --git a/gcc/testsuite/gcc.dg/lto/pr55525_0.c b/gcc/testsuite/gcc.dg/lto/pr55525_0.c index 7faaf80..d8d16d1 100644 --- a/gcc/testsuite/gcc.dg/lto/pr55525_0.c +++ b/gcc/testsuite/gcc.dg/lto/pr55525_0.c @@ -1,5 +1,5 @@ /* { dg-lto-do link } */ -/* { dg-lto-options { { -flto -w } } } */ +/* { dg-lto-options { { -fcommon -flto -w } } } */ char s[sizeof (char *)]; int main(void) diff --git a/gcc/testsuite/gcc.dg/lto/pr88077_0.c b/gcc/testsuite/gcc.dg/lto/pr88077_0.c index 9e464b6..924fe9f 100644 --- a/gcc/testsuite/gcc.dg/lto/pr88077_0.c +++ b/gcc/testsuite/gcc.dg/lto/pr88077_0.c @@ -1,3 +1,3 @@ /* { dg-lto-do link } */ -int HeaderStr; +long HeaderStr; diff --git a/gcc/testsuite/gcc.dg/lto/pr88077_1.c b/gcc/testsuite/gcc.dg/lto/pr88077_1.c index fd3de3e..43d783f 100644 --- a/gcc/testsuite/gcc.dg/lto/pr88077_1.c +++ b/gcc/testsuite/gcc.dg/lto/pr88077_1.c @@ -1,3 +1,5 @@ +/* { dg-options {-fcommon} } */ + char HeaderStr[1]; int main() diff --git a/gcc/testsuite/gcc.target/aarch64/sve/peel_ind_1.c b/gcc/testsuite/gcc.target/aarch64/sve/peel_ind_1.c index 156d04a..e9afc20 100644 --- a/gcc/testsuite/gcc.target/aarch64/sve/peel_ind_1.c +++ b/gcc/testsuite/gcc.target/aarch64/sve/peel_ind_1.c @@ -21,7 +21,7 @@ foo (void) } /* We should operate on aligned vectors. */ -/* { dg-final { scan-assembler {\t(adrp|adr)\tx[0-9]+, x\n} } } */ +/* { dg-final { scan-assembler {\t(adrp|adr)\tx[0-9]+, (x|\.LANCHOR0)\n} } } */ /* We should use an induction that starts at -5, with only the last 7 elements of the first iteration being active. */ /* { dg-final { scan-assembler {\tindex\tz[0-9]+\.s, #-5, #5\n} } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/sve/peel_ind_2.c b/gcc/testsuite/gcc.target/aarch64/sve/peel_ind_2.c index df82d58..5fce021 100644 --- a/gcc/testsuite/gcc.target/aarch64/sve/peel_ind_2.c +++ b/gcc/testsuite/gcc.target/aarch64/sve/peel_ind_2.c @@ -17,7 +17,7 @@ foo (void) } /* We should operate on aligned vectors. */ -/* { dg-final { scan-assembler {\t(adrp|adr)\tx[0-9]+, x\n} } } */ +/* { dg-final { scan-assembler {\t(adrp|adr)\tx[0-9]+, (x|\.LANCHOR0)\n} } } */ /* We should unroll the loop three times. */ /* { dg-final { scan-assembler-times "\tst1w\t" 3 } } */ /* { dg-final { scan-assembler {\tptrue\t(p[0-9]+)\.s, vl7\n.*\teor\tp[0-7]\.b, (p[0-7])/z, (\1\.b, \2\.b|\2\.b, \1\.b)\n} } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/sve/peel_ind_3.c b/gcc/testsuite/gcc.target/aarch64/sve/peel_ind_3.c index 1707f02..15da5a7 100644 --- a/gcc/testsuite/gcc.target/aarch64/sve/peel_ind_3.c +++ b/gcc/testsuite/gcc.target/aarch64/sve/peel_ind_3.c @@ -17,5 +17,5 @@ foo (int start) } /* We should operate on aligned vectors. */ -/* { dg-final { scan-assembler {\t(adrp|adr)\tx[0-9]+, x\n} } } */ +/* { dg-final { scan-assembler {\t(adrp|adr)\tx[0-9]+, (x|\.LANCHOR0)\n} } } */ /* { dg-final { scan-assembler {\tubfx\t} } } */ diff --git a/gcc/testsuite/gcc.target/i386/volatile-bitfields-2.c b/gcc/testsuite/gcc.target/i386/volatile-bitfields-2.c index 302625a..d843633 100644 --- a/gcc/testsuite/gcc.target/i386/volatile-bitfields-2.c +++ b/gcc/testsuite/gcc.target/i386/volatile-bitfields-2.c @@ -14,4 +14,4 @@ int foo () return bits.b; } -/* { dg-final { scan-assembler "movl.*bits" } } */ +/* { dg-final { scan-assembler "mov(q|l).*bits" } } */ -- 2.7.4