From c47c7215696dbbe9e7a1d2cdd38d6f941717361f Mon Sep 17 00:00:00 2001 From: Sandra Loosemore Date: Thu, 10 Nov 2016 18:56:30 -0500 Subject: [PATCH] re PR c/37998 (Unclear documentation of -fno-common) 2016-11-10 Sandra Loosemore PR c/37998 gcc/ * doc/invoke.texi (Code Gen Options) [-fno-common]: Use correct terminology. Expand to remove ambiguity. From-SVN: r242062 --- gcc/ChangeLog | 6 ++++++ gcc/doc/invoke.texi | 39 +++++++++++++++++++++++---------------- 2 files changed, 29 insertions(+), 16 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 761896fe6c5..5cbc53d45b7 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2016-11-10 Sandra Loosemore + + PR c/37998 + * doc/invoke.texi (Code Gen Options) [-fno-common]: Use correct + terminology. Expand to remove ambiguity. + 2016-11-10 Segher Boessenkool PR rtl-optimization/78232 diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index f133b3a4b9b..04a6fac356b 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -11968,25 +11968,32 @@ Use it to conform to a non-default application binary interface. @item -fno-common @opindex fno-common -In C code, controls the placement of uninitialized global variables. -Unix C compilers have traditionally permitted multiple definitions of -such variables in different compilation units by placing the variables -in a common block. -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 place -uninitialized global variables in the data section of the object file, -rather than generating them as common blocks. -This has the effect that if the same variable is declared -(without @code{extern}) in two different compilations, -you get a multiple-definition error when you link them. -In this case, you must compile with @option{-fcommon} instead. +@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 +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 +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 data 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 declarations this way. +variable definitions this way. @item -fno-ident @opindex fno-ident -- 2.30.2