Commit 6271dd98 by Wilco Dijkstra Committed by Wilco Dijkstra

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
parent 83115e9e
2019-11-20 Wilco Dijkstra <wdijkstr@arm.com>
PR85678
* common.opt (fcommon): Change init to 1.
* doc/invoke.texi (-fcommon): Update documentation.
2019-11-20 Jan Hubicka <jh@suse.cz> 2019-11-20 Jan Hubicka <jh@suse.cz>
* fibonacci_heap.h (fibonacci_heap<K,V>::consolidate): Turn auto_vec * fibonacci_heap.h (fibonacci_heap<K,V>::consolidate): Turn auto_vec
...@@ -1131,7 +1131,7 @@ Common Report Var(flag_combine_stack_adjustments) Optimization ...@@ -1131,7 +1131,7 @@ Common Report Var(flag_combine_stack_adjustments) Optimization
Looks for opportunities to reduce stack adjustments and stack references. Looks for opportunities to reduce stack adjustments and stack references.
fcommon fcommon
Common Report Var(flag_no_common,0) Common Report Var(flag_no_common,0) Init(1)
Put uninitialized globals in the common section. Put uninitialized globals in the common section.
fcompare-debug fcompare-debug
......
...@@ -569,7 +569,7 @@ Objective-C and Objective-C++ Dialects}. ...@@ -569,7 +569,7 @@ Objective-C and Objective-C++ Dialects}.
-fnon-call-exceptions -fdelete-dead-exceptions -funwind-tables @gol -fnon-call-exceptions -fdelete-dead-exceptions -funwind-tables @gol
-fasynchronous-unwind-tables @gol -fasynchronous-unwind-tables @gol
-fno-gnu-unique @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 -fpcc-struct-return -fpic -fPIC -fpie -fPIE -fno-plt @gol
-fno-jump-tables @gol -fno-jump-tables @gol
-frecord-gcc-switches @gol -frecord-gcc-switches @gol
...@@ -14112,35 +14112,27 @@ useful for building programs to run under WINE@. ...@@ -14112,35 +14112,27 @@ useful for building programs to run under WINE@.
code that is not binary compatible with code generated without that switch. code that is not binary compatible with code generated without that switch.
Use it to conform to a non-default application binary interface. Use it to conform to a non-default application binary interface.
@item -fno-common @item -fcommon
@opindex fno-common
@opindex fcommon @opindex fcommon
@opindex fno-common
@cindex tentative definitions @cindex tentative definitions
In C code, this option controls the placement of global variables In C code, this option controls the placement of global variables
defined without an initializer, known as @dfn{tentative definitions} defined without an initializer, known as @dfn{tentative definitions}
in the C standard. Tentative definitions are distinct from declarations in the C standard. Tentative definitions are distinct from declarations
of a variable with the @code{extern} keyword, which do not allocate storage. of a variable with the @code{extern} keyword, which do not allocate storage.
Unix C compilers have traditionally allocated storage for The default is @option{-fno-common}, which specifies that the compiler places
uninitialized global variables in a common block. This allows the uninitialized global variables in the BSS section of the object file.
linker to resolve all tentative definitions of the same variable 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 in different compilation units to the same object, or to a non-tentative
definition. definition. This behavior does not conform to ISO C, is inconsistent with C++,
This is the behavior specified by @option{-fcommon}, and is the default for and on many targets implies a speed and code size penalty on global variable
GCC on most targets. references. It is mainly useful to enable legacy code to link without errors.
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.
@item -fno-ident @item -fno-ident
@opindex fno-ident @opindex fno-ident
2019-11-20 Wilco Dijkstra <wdijkstr@arm.com>
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 <rguenther@suse.de> 2019-11-20 Richard Biener <rguenther@suse.de>
* gcc.dg/vect/bb-slp-42.c: Adjust. * gcc.dg/vect/bb-slp-42.c: Adjust.
......
/* { dg-options {-fcommon} } */
struct {} admbaserest_; // { dg-lto-message "type of " 2 } struct {} admbaserest_; // { dg-lto-message "type of " 2 }
......
/* { dg-do compile } */ /* { 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 */ /* RTL-level CSE shouldn't introduce LCO (for the string) into varpool */
char *p; char *p;
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
/* Origin: Jonathan Larmour <jifl-bugzilla@jifvik.org> */ /* Origin: Jonathan Larmour <jifl-bugzilla@jifvik.org> */
/* { dg-do compile { target *-*-linux* *-*-gnu* *-*-uclinux* } } */ /* { dg-do compile { target *-*-linux* *-*-gnu* *-*-uclinux* } } */
/* { dg-options "-fdata-sections" } */ /* { dg-options "-fcommon -fdata-sections" } */
int x; int x;
......
/* { dg-require-alias "" } */ /* { 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; int a, b, c, d, e, h, i, j, k, l;
const int f; const int f;
......
/* { dg-lto-options "-w" } */ /* { dg-lto-options { {-fcommon -w} {-fcommon} } } */
double i; double i;
int j; int j;
/* { dg-lto-do run } */ /* { dg-lto-do run } */
/* { dg-lto-options { { -flto } } } */ /* { dg-lto-options { { -flto -fcommon } {-fcommon} {-fcommon} {-fcommon} } } */
/* { dg-require-linker-plugin "" } */ /* { dg-require-linker-plugin "" } */
/* { dg-extra-ld-options "-fuse-linker-plugin" } */ /* { dg-extra-ld-options "-fuse-linker-plugin" } */
/* { dg-lto-do run } */ /* { 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 /* 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 integer, type, or an unsigned integer type. The choice of type is
......
/* { dg-lto-do link } */ /* { dg-lto-do link } */
/* { dg-lto-options { { -flto -w } } } */ /* { dg-lto-options { { -fcommon -flto -w } } } */
char s[sizeof (char *)]; char s[sizeof (char *)];
int main(void) int main(void)
......
/* { dg-lto-do link } */ /* { dg-lto-do link } */
int HeaderStr; long HeaderStr;
/* { dg-options {-fcommon} } */
char HeaderStr[1]; char HeaderStr[1];
int main() int main()
......
...@@ -21,7 +21,7 @@ foo (void) ...@@ -21,7 +21,7 @@ foo (void)
} }
/* We should operate on aligned vectors. */ /* 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 /* We should use an induction that starts at -5, with only the last
7 elements of the first iteration being active. */ 7 elements of the first iteration being active. */
/* { dg-final { scan-assembler {\tindex\tz[0-9]+\.s, #-5, #5\n} } } */ /* { dg-final { scan-assembler {\tindex\tz[0-9]+\.s, #-5, #5\n} } } */
......
...@@ -17,7 +17,7 @@ foo (void) ...@@ -17,7 +17,7 @@ foo (void)
} }
/* We should operate on aligned vectors. */ /* 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. */ /* We should unroll the loop three times. */
/* { dg-final { scan-assembler-times "\tst1w\t" 3 } } */ /* { 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} } } */ /* { 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} } } */
...@@ -17,5 +17,5 @@ foo (int start) ...@@ -17,5 +17,5 @@ foo (int start)
} }
/* We should operate on aligned vectors. */ /* 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} } } */ /* { dg-final { scan-assembler {\tubfx\t} } } */
...@@ -14,4 +14,4 @@ int foo () ...@@ -14,4 +14,4 @@ int foo ()
return bits.b; return bits.b;
} }
/* { dg-final { scan-assembler "movl.*bits" } } */ /* { dg-final { scan-assembler "mov(q|l).*bits" } } */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment