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>
* fibonacci_heap.h (fibonacci_heap<K,V>::consolidate): Turn auto_vec
......@@ -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
......
......@@ -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
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>
* gcc.dg/vect/bb-slp-42.c: Adjust.
......
/* { dg-options {-fcommon} } */
struct {} admbaserest_; // { dg-lto-message "type of " 2 }
......
/* { 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;
......
......@@ -2,7 +2,7 @@
/* Origin: Jonathan Larmour <jifl-bugzilla@jifvik.org> */
/* { dg-do compile { target *-*-linux* *-*-gnu* *-*-uclinux* } } */
/* { dg-options "-fdata-sections" } */
/* { dg-options "-fcommon -fdata-sections" } */
int x;
......
/* { 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;
......
/* { dg-lto-options "-w" } */
/* { dg-lto-options { {-fcommon -w} {-fcommon} } } */
double i;
int j;
/* { 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" } */
/* { 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
......
/* { dg-lto-do link } */
/* { dg-lto-options { { -flto -w } } } */
/* { dg-lto-options { { -fcommon -flto -w } } } */
char s[sizeof (char *)];
int main(void)
......
/* { dg-lto-do link } */
int HeaderStr;
long HeaderStr;
/* { dg-options {-fcommon} } */
char HeaderStr[1];
int main()
......
......@@ -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} } } */
......
......@@ -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} } } */
......@@ -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} } } */
......@@ -14,4 +14,4 @@ int foo ()
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