diff mbox series

[wwwdocs] Document -fcommon default change

Message ID VI1PR0801MB2127C945195E03DBD309D8DB835C0@VI1PR0801MB2127.eurprd08.prod.outlook.com
State New
Headers show
Series [wwwdocs] Document -fcommon default change | expand

Commit Message

Wilco Dijkstra Dec. 5, 2019, 1:14 p.m. UTC
Hi,

Add entries for the default change in changes.html and porting_to.html.
Passes the W3 validator.

Cheers,
Wilco

---

Comments

Jonathan Wakely Jan. 6, 2020, 2:10 p.m. UTC | #1
On 05/12/19 13:14 +0000, Wilco Dijkstra wrote:
>Hi,
>
>Add entries for the default change in changes.html and porting_to.html.
>Passes the W3 validator.
>
>Cheers,
>Wilco
>
>---
>
>diff --git a/htdocs/gcc-10/changes.html b/htdocs/gcc-10/changes.html
>index e02966460450b7aad884b2d45190b9ecd8c7a5d8..304e1e8ccd38795104156e86b92062696fa5aa8b 100644
>--- a/htdocs/gcc-10/changes.html
>+++ b/htdocs/gcc-10/changes.html
>@@ -102,6 +102,11 @@ a work-in-progress.</p>
>     <li>In C2X mode, <code>-fno-fp-int-builtin-inexact</code> is
>     enabled by default.</li>
>   </ul></li>
>+
>+  <li>GCC now defaults to <code>-fno-common</code>.  In C, global variables with
>+      multiple tentative definitions will result in linker errors.
>+      Global variable accesses are also more efficient on various targets.

The "also" here is a bit unclear what it refers to. It seems to follow
on from the previous sentence, which suggests that the efficiencies
are somehow related to the cases that get linker errors.

How about:

GCC now defaults to <code>-fno-common</code>.  As a result, global
variable accesses are more efficient on various targets.  In C, global
variables with multiple tentative definitions will result in linker
errors.


>+  </li>
> </ul>
>
> <h3 id="cxx">C++</h3>
>diff --git a/htdocs/gcc-10/porting_to.html b/htdocs/gcc-10/porting_to.html
>index 3256e8a35d00ce1352c169a1c6df6d8f120889ee..e2c7e226a83b7720fe6ed40061cdddbc27659664 100644
>--- a/htdocs/gcc-10/porting_to.html
>+++ b/htdocs/gcc-10/porting_to.html
>@@ -29,9 +29,25 @@ and provide solutions. Let us know if you have suggestions for improvements!
> <h2 id="cpp">Preprocessor issues</h2>
> -->
>
>-<!--
> <h2 id="c">C language issues</h2>
>--->
>+
>+<h3 id="complit">Default to <code>-fno-common</code></h3>

What does "complit" mean? Would a more memorable anchor such as
"common" or "no-common" be better?
Sandra Loosemore Jan. 6, 2020, 4:25 p.m. UTC | #2
On 1/6/20 7:10 AM, Jonathan Wakely wrote:

> How about:
> 
> GCC now defaults to <code>-fno-common</code>.  As a result, global
> variable accesses are more efficient on various targets.  In C, global
> variables with multiple tentative definitions will result in linker
> errors.

This is better.  I'd also s/will/now/, since we're talking about the 
present behavior of GCC 10, not some future behavior.

-Sandra
Wilco Dijkstra Jan. 7, 2020, 3:15 p.m. UTC | #3
Hi,

>On 1/6/20 7:10 AM, Jonathan Wakely wrote:
>> GCC now defaults to <code>-fno-common</code>.  As a result, global
>> variable accesses are more efficient on various targets.  In C, global
>> variables with multiple tentative definitions will result in linker
>> errors.
>
> This is better.  I'd also s/will/now/, since we're talking about the 
> present behavior of GCC 10, not some future behavior.

Thanks for the suggestions, I've reworded it as:

GCC now defaults to <code>-fno-common</code>.  As a result, global
variable accesses are more efficient on various targets.  In C, global
variables with multiple tentative definitions now result in linker errors.
With <code>-fcommon</code> such definitions are silently merged during
linking.

Also changed the anchor name (I think it was a copy/paste from another entry).
Here the updated version:


diff --git a/htdocs/gcc-10/changes.html b/htdocs/gcc-10/changes.html
index d6108269e977df2af29bd5c9149cc2136654ce05..45af7fa333cfff2155ff0346fe36855aa6ff940a 100644
--- a/htdocs/gcc-10/changes.html
+++ b/htdocs/gcc-10/changes.html
@@ -140,6 +140,13 @@ a work-in-progress.</p>
     <li>In C2X mode, <code>-fno-fp-int-builtin-inexact</code> is
     enabled by default.</li>
   </ul></li>
+
+  <li>GCC now defaults to <code>-fno-common</code>.  As a result, global
+      variable accesses are more efficient on various targets.  In C, global
+      variables with multiple tentative definitions now result in linker errors.
+      With <code>-fcommon</code> such definitions are silently merged during
+      linking.
+  </li>
 </ul>
 
 <h3 id="cxx">C++</h3>
diff --git a/htdocs/gcc-10/porting_to.html b/htdocs/gcc-10/porting_to.html
index 3256e8a35d00ce1352c169a1c6df6d8f120889ee..7d45a962d014fecece9bd52a13ca1799153672fe 100644
--- a/htdocs/gcc-10/porting_to.html
+++ b/htdocs/gcc-10/porting_to.html
@@ -29,9 +29,25 @@ and provide solutions. Let us know if you have suggestions for improvements!
 <h2 id="cpp">Preprocessor issues</h2>
 -->
 
-<!--
 <h2 id="c">C language issues</h2>
--->
+
+<h3 id="common">Default to <code>-fno-common</code></h3>
+
+<p>
+  A common mistake in C is omitting <code>extern</code> when declaring a global
+  variable in a header file.  If the header is included by several files it
+  results in multiple definitions of the same variable.  In previous GCC
+  versions this error is ignored.  GCC 10 defaults to <code>-fno-common</code>,
+  which means a linker error will now be reported.
+  To fix this, use <code>extern</code> in header files when declaring global
+  variables, and ensure each global is defined in exactly one C file.
+  As a workaround, legacy C code can be compiled with <code>-fcommon</code>.
+</p>
+  <pre><code>
+      int x;  // tentative definition - avoid in header files
+
+      extern int y;  // correct declaration in a header file
+  </code></pre>
 
 <h2 id="fortran">Fortran language issues</h2>
Gerald Pfeifer Jan. 11, 2020, 7:39 a.m. UTC | #4
On Tue, 7 Jan 2020, Wilco Dijkstra wrote:
> Thanks for the suggestions, I've reworded it as:

> +  <li>GCC now defaults to <code>-fno-common</code>.  As a result, global
> +      variable accesses are more efficient on various targets.  In C, global
> +      variables with multiple tentative definitions now result in linker errors.
> +      With <code>-fcommon</code> such definitions are silently merged during
> +      linking.
> +  </li>

Thank you, this patchset is okay (also the other parts).


(Ideally reformat for a bit smaller width since right now the patch
format, which is wider by a few columns, induces line wraps in an 80
column view, but that is optional.)

Thank you,
Gerald
diff mbox series

Patch

diff --git a/htdocs/gcc-10/changes.html b/htdocs/gcc-10/changes.html
index e02966460450b7aad884b2d45190b9ecd8c7a5d8..304e1e8ccd38795104156e86b92062696fa5aa8b 100644
--- a/htdocs/gcc-10/changes.html
+++ b/htdocs/gcc-10/changes.html
@@ -102,6 +102,11 @@  a work-in-progress.</p>
     <li>In C2X mode, <code>-fno-fp-int-builtin-inexact</code> is
     enabled by default.</li>
   </ul></li>
+
+  <li>GCC now defaults to <code>-fno-common</code>.  In C, global variables with
+      multiple tentative definitions will result in linker errors.
+      Global variable accesses are also more efficient on various targets.
+  </li>
 </ul>
 
 <h3 id="cxx">C++</h3>
diff --git a/htdocs/gcc-10/porting_to.html b/htdocs/gcc-10/porting_to.html
index 3256e8a35d00ce1352c169a1c6df6d8f120889ee..e2c7e226a83b7720fe6ed40061cdddbc27659664 100644
--- a/htdocs/gcc-10/porting_to.html
+++ b/htdocs/gcc-10/porting_to.html
@@ -29,9 +29,25 @@  and provide solutions. Let us know if you have suggestions for improvements!
 <h2 id="cpp">Preprocessor issues</h2>
 -->
 
-<!--
 <h2 id="c">C language issues</h2>
--->
+
+<h3 id="complit">Default to <code>-fno-common</code></h3>
+
+<p>
+  A common mistake in C is omitting <code>extern</code> when declaring a global
+  variable in a header file.  If the header is included by several files it
+  results in multiple definitions of the same variable.  In previous GCC
+  versions this error is ignored.  GCC 10 defaults to <code>-fno-common</code>,
+  which means a linker error will now be reported.
+  To fix this, use <code>extern</code> in header files when declaring global
+  variables, and ensure each global is defined in exactly one C file.
+  As a workaround, legacy C code can be compiled with <code>-fcommon</code>.
+</p>
+  <pre><code>
+      int x;  // tentative definition - avoid in header files
+
+      extern int y;  // correct declaration in a header file
+  </code></pre>
 
 <h2 id="fortran">Fortran language issues</h2>