summaryrefslogtreecommitdiff
path: root/debian/NEWS.html
blob: 6519297f662de939885c635fae281ac0cd60b765 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
<?xml version="1.0" encoding="utf-8"?>
  <!DOCTYPE html
            PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
            "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 


 










     <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  
  
   <head>
 
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <link rev="made" href="mailto:gcc@gcc.gnu.org" />
    <link rel="stylesheet" type="text/css" href="https://gcc.gnu.org/gcc.css" />
  
 <title>
GCC 6 Release Series &mdash; Changes, New Features, and Fixes
- GNU Project - Free Software Foundation (FSF)</title>
   </head>
 

<!-- GCC maintainers, please do not hesitate to update/contribute entries
     concerning those part of GCC you maintain!  2002-03-23, Gerald.
-->

<body>



<h1>GCC 6 Release Series<br />Changes, New Features, and Fixes</h1>

<p>
This page is a brief summary of some of the huge number of improvements in GCC 6.
For more information, see the
<a href="porting_to.html">Porting to GCC 6</a> page and the
<a href="../onlinedocs/index.html#current">full GCC documentation</a>.
</p>

<!-- .................................................................. -->
<h2>Caveats</h2>
  <ul>
    <li>The default mode for C++ is now <code>-std=gnu++14</code> instead of
        <code>-std=gnu++98</code>.</li>

    <li><p>Support for a number of older systems and recently
    unmaintained or untested target ports of GCC has been declared
    obsolete in GCC 6.  Unless there is activity to revive them, the
    next release of GCC will have their sources permanently
    <strong>removed</strong>.</p>

    <p>The following ports for individual systems on
    particular architectures have been obsoleted:</p>

    <ul>
	  <li>SH5 / SH64 (sh64-*-*) as announced
	  <a href="https://gcc.gnu.org/ml/gcc/2015-08/msg00101.html">
	      here</a>.</li>
    </ul>
    </li>

  </ul>

<!-- .................................................................. -->
<h2 id="general">General Optimizer Improvements</h2>
  <ul>
    <li>UndefinedBehaviorSanitizer gained a new sanitization option,
	<code>-fsanitize=bounds-strict</code>, which enables strict checking
	of array bounds.  In particular, it enables
	<code>-fsanitize=bounds</code> as well as instrumentation of
	flexible array member-like arrays.</li>
    <li>Type-based alias analysis now disambiguates accesses to different
	pointers. This improves precision of the alias oracle by about 20-30%
	on higher-level C++ programs. Programs doing invalid type punning
	of pointer types may now need <code>-fno-strict-aliasing</code>
	to work correctly.</li>
    <li>Alias analysis now correctly supports <code>weakref</code> and
	<code>alias</code> attributes. This makes it possible to access
	both a variable and its alias in one translation unit which is common
	with link-time optimization.</li>
    <li>Value range propagation now assumes that the <code>this</code> pointer
	of C++ member functions is non-null.  This eliminates
	common null pointer checks
	but also breaks some non-conforming code-bases (such as Qt-5, Chromium,
	KDevelop). As a temporary work-around
	<code>-fno-delete-null-pointer-checks</code> can be used. Wrong
	code can be identified by using <code>-fsanitize=undefined</code>.</li>
    <li>Link-time optimization improvements:
    <ul>
      <li><code>warning</code> and <code>error</code> attributes are now
	  correctly preserved by declaration linking and thus
	  <code>-D_FORTIFY_SOURCE=2</code> is now supported with <code>-flto</code>.</li>
      <li><p>Type merging was fixed to handle C and Fortran interoperability
	  rules as defined by the Fortran 2008 language standard.</p>
	  <p>
	  As an exception, <code>CHARACTER(KIND=C_CHAR)</code> is not inter-operable
	  with <code>char</code> in all cases because it is an array while
	  <code>char</code> is scalar.
	  <code>INTEGER(KIND=C_SIGNED_CHAR)</code> should be used instead.
	  In general, this inter-operability cannot be implemented, for
	  example, on targets where function passing conventions of arrays
	  differs from scalars.</p></li>
      <li>More type information is now preserved at link time reducing
	  the loss of accuracy of the type based alias analysis compared
	  to builds without link-time optimization.</li>
      <li>Invalid type punning on global variables and declarations is now
	  reported with <code>-Wodr-type-mismatch</code>.</li>
      <li>The size of LTO object files was reduced by about 11% (measured
	  by compiling Firefox 46.0).</li>
      <li>Link-time parallelization (enabled using <code>-flto=n</code>)
	  was significantly improved by decreasing the size of streamed
	  data when partitioning programs.  The size of streamed
	  IL while compiling Firefox 46.0 was reduced by 66%.</li>
      <li><p>The linker plugin was extended to pass information about type of
	  binary produced to GCC back end (that can be also manually controlled
	  by <code>-flinker-output</code>).  This makes it possible to
	  properly configure the code generator and support incremental
	  linking. Incremental linking of LTO objects by <code>gcc -r</code> is
	  now supported on plugin-enabled setups.</p>
	  <p>There are two ways to perform incremental linking:</p>
	  <ol>
	     <li>Linking by <code>ld -r</code> will result in an object file
	     with all sections from individual object files mechanically merged.
	     This delays the actual link time optimization to final linking step
	     and thus permits whole program optimization.  Linking final binary
	     with such object files is however slower.</li>
	     <li>Linking by <code>gcc -r</code> will lead to link time optimization
	     and produce final binary into the object file.  Linking such object
	     file is fast but avoids any benefits from whole program optimization.</li>
	  </ol>
	  GCC 7 will support incremental link-time optimization with <code>gcc -r</code>.</li>
    </ul></li>
    <li>Inter-procedural optimization improvements:
    <ul>
      <li>Basic jump threading is now performed before profile construction
	  and inline analysis, resulting in more realistic size and time estimates
	  that drive the heuristics of the of inliner and function cloning passes.</li>
      <li>Function cloning now more aggressively eliminates unused function
	  parameters.</li>
    </ul></li>
  </ul>

<!-- .................................................................. -->
<h2 id="languages">New Languages and Language specific improvements</h2>

<!-- <ul>
  <li> -->Compared to GCC 5, the GCC 6 release series includes a much improved
    implementation of the <a href="http://www.openacc.org/">OpenACC 2.0a
      specification</a>.  Highlights are:
    <ul>
      <li>In addition to single-threaded host-fallback execution, offloading is
	supported for nvptx (Nvidia GPUs) on x86_64 and PowerPC 64-bit
	little-endian GNU/Linux host systems.  For nvptx offloading, with the
	OpenACC parallel construct, the execution model allows for an arbitrary
	number of gangs, up to 32 workers, and 32 vectors.</li>
      <li>Initial support for parallelized execution of OpenACC kernels
	constructs:
	<ul>
	  <li>Parallelization of a kernels region is switched on
	    by <code>-fopenacc</code> combined with <code>-O2</code> or
	    higher.</li>
	  <li>Code is offloaded onto multiple gangs, but executes with just one
	    worker, and a vector length of 1.</li>
	  <li>Directives inside a kernels region are not supported.</li>
	  <li>Loops with reductions can be parallelized.</li>
	  <li>Only kernels regions with one loop nest are parallelized.</li>
	  <li>Only the outer-most loop of a loop nest can be parallelized.</li>
	  <li>Loop nests containing sibling loops are not parallelized.</li>
	</ul>
	Typically, using the OpenACC parallel construct gives much better
	performance, compared to the initial support of the OpenACC kernels
	construct.</li>
      <li>The <code>device_type</code> clause is not supported.
	The <code>bind</code> and <code>nohost</code> clauses are not
	supported.  The <code>host_data</code> directive is not supported in
	Fortran.</li>
      <li>Nested parallelism (cf. CUDA dynamic parallelism) is not
	supported.</li>
      <li>Usage of OpenACC constructs inside multithreaded contexts (such as
	created by OpenMP, or pthread programming) is not supported.</li>
      <li>If a call to the <code>acc_on_device</code> function has a
	compile-time constant argument, the function call evaluates to a
	compile-time constant value only for C and C++ but not for
	Fortran.</li>
    </ul>
    See the <a href="https://gcc.gnu.org/wiki/OpenACC">OpenACC</a>
    and <a href="https://gcc.gnu.org/wiki/Offloading">Offloading</a> wiki pages
    for further information.
  <!-- </li>
</ul> -->

<!-- <h3 id="ada">Ada</h3> -->

<h3 id="c-family">C family</h3>
  <ul>
    <li>Version 4.5 of the <a href="http://openmp.org/wp/openmp-specifications/"
	>OpenMP specification</a> is now supported in the C and C++ compilers.</li>

    <li>The C and C++ compilers now support attributes on enumerators.  For instance,
	it is now possible to mark enumerators as deprecated:
<blockquote><pre>
enum {
  newval,
  oldval __attribute__ ((deprecated ("too old")))
};
</pre></blockquote></li>
<li>Source locations for the C and C++ compilers are now tracked as ranges,
  rather than just points, making it easier to identify the subexpression
  of interest within a complicated expression.
  For example:
<blockquote><pre>
<b>test.cc:</b> In function <b>'int test(int, int, foo, int, int)'</b>:
<b>test.cc:5:16:</b> <span class="boldred">error:</span> no match for <b>'operator*'</b> (operand types are <b>'int'</b> and <b>'foo'</b>)
   return p + <span class="boldred">q * r</span> * s + t;
              <span class="boldred">~~^~~</span>
</pre></blockquote>
In addition, there is now initial support for precise diagnostic locations
within strings:
<blockquote><pre>
<b>format-strings.c:3:14:</b> <span class="boldmagenta">warning:</span> field width specifier <b>'*'</b> expects a matching <b>'int'</b> argument [<span class="boldmagenta">-Wformat=</span>]
   printf("%*d");
            <span class="boldmagenta">^</span>
</pre></blockquote></li>
    <li>Diagnostics can now contain "fix-it hints", which are displayed
      in context underneath the relevant source code.  For example:
      <!-- this is currently the only example in the tree; various others are pending  -->
<blockquote><pre>
<b>fixits.c:</b> In function <b>'bad_deref'</b>:
<b>fixits.c:11:13:</b> <span class="boldred">error:</span> <b>'ptr'</b> is a pointer; did you mean to use <b>'->'</b>?
   return ptr<span class="boldred">.</span>x;
             <span class="boldred">^</span>
             <span class="boldred">-&gt;</span>
</pre></blockquote></li>
    <li>The C and C++ compilers now offer suggestions for misspelled field names:
<blockquote><pre>
<b>spellcheck-fields.cc:52:13:</b> <span class="boldred">error:</span> <b>'struct s'</b> has no member named <b>'colour'</b>; did you mean <b>'color'</b>?
   return ptr-&gt;<span class="boldred">colour</span>;
               <span class="boldred">^~~~~~</span>
</pre></blockquote></li>
    <!-- also, pending patch to add fix-it hints to the above -->
    <li>New command-line options have been added for the C and C++ compilers:
      <ul>
        <li><code>-Wshift-negative-value</code> warns about left shifting a
          negative value.</li>
        <li><code>-Wshift-overflow</code> warns about left shift overflows.
          This warning is enabled by default.
          <code>-Wshift-overflow=2</code> also warns about left-shifting 1 into
          the sign bit.</li>
        <li><code>-Wtautological-compare</code> warns if a self-comparison
          always evaluates to true or false.  This warning is enabled by
          <code>-Wall</code>.</li>
        <li><code>-Wnull-dereference</code> warns if the compiler detects paths
          that trigger erroneous or undefined behavior due to dereferencing a
          null pointer. This option is only active when
          <code>-fdelete-null-pointer-checks</code> is active, which is enabled
          by optimizations in most targets. The precision of the warnings
          depends on the optimization options used.</li>
        <li><code>-Wduplicated-cond</code> warns about duplicated conditions
	  in an if-else-if chain.</li>
        <li><code>-Wmisleading-indentation</code> warns about places where the
          indentation of the code gives a misleading idea of the block
          structure of the code to a human reader.  For example, given
          <a href="https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-1266">CVE-2014-1266</a>:
<blockquote><pre>
<b>sslKeyExchange.c:</b> In function <b>'SSLVerifySignedServerKeyExchange'</b>:
<b>sslKeyExchange.c:629:3:</b> <span class="boldmagenta">warning:</span> this <b>'if'</b> clause does not guard... [<span class="boldmagenta">-Wmisleading-indentation</span>]
    <span class="boldcyan">if</span> ((err = SSLHashSHA1.update(&amp;hashCtx, &amp;signedParams)) != 0)
    <span class="boldcyan">^~</span>
<b>sslKeyExchange.c:631:5:</b> <span class="boldcyan">note:</span> ...this statement, but the latter is misleadingly indented as if it is guarded by the <b>'if'</b>
        <span class="boldmagenta">goto</span> fail;
        <span class="boldmagenta">^~~~</span>
</pre></blockquote>
          This warning is enabled by <code>-Wall</code>.</li>
      </ul>
    </li>
    <li>The C and C++ compilers now emit saner error messages if
      merge-conflict markers are present in a source file.
<blockquote><pre>
<b>test.c:3:1:</b> <span class="boldred">error:</span> version control conflict marker in file
 <span class="boldred">&lt;&lt;&lt;&lt;&lt;&lt;&lt;</span> HEAD
 <span class="boldred">^~~~~~~</span>
</pre></blockquote></li>
  </ul>

<h3 id="c">C</h3>
  <ul>
    <li>It is possible to disable warnings when an initialized field of
	a structure or a union with side effects is being overridden when
	using designated initializers via a new warning option
	<code>-Woverride-init-side-effects</code>.</li>
   <li>A new type attribute <code>scalar_storage_order</code> applying to
       structures and unions has been introduced.  It specifies the storage
       order (aka endianness) in memory of scalar fields in structures
       or unions.</li>
  </ul>

<h3 id="cxx">C++</h3>
  <ul>
    <li>The default mode has been changed to <code>-std=gnu++14</code>.</li>
    <li><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4377.pdf">C++
	Concepts</a> are now supported when compiling with
        <code>-fconcepts</code>.</li>
    <li><code>-flifetime-dse</code> is more
    aggressive in dead-store elimination in situations where
    a memory store to a location precedes a constructor to the
    memory location.</li>
    <li>G++ now supports
        <a href="https://gcc.gnu.org/projects/cxx-status.html#cxx1z.html">C++17</a>
        fold expressions, <code>u8</code> character literals,
        extended <code>static_assert</code>, and nested namespace definitions.</li>
    <li>G++ now allows constant evaluation for all non-type template arguments.</li>
    <li>G++ now supports C++ Transactional Memory when compiling with
        <code>-fgnu-tm</code>. </li>
  </ul>

<h4 id="libstdcxx">Runtime Library (libstdc++)</h4>
  <ul>
    <li>Extensions to the C++ Library to support mathematical special
        functions (ISO/IEC 29124:2010), thanks to Edward Smith-Rowland. </li>
    <li>Experimental support for C++17, including the following
      new features:
      <ul>
        <li><code>std::uncaught_exceptions</code> function (this is also
            available for <tt>-std=gnu++NN</tt> modes); </li>
        <li>new member functions <code>try_emplace</code> and
            <code>insert_or_assign</code> for unique_key maps;</li>
        <li>non-member functions <code>std::size</code>,
            <code>std::empty</code>, and <code>std::data</code> for
            accessing containers and arrays;</li>
        <li><code>std::invoke</code>;</li>
        <li><code>std::shared_mutex</code>;</li>
        <li><code>std::void_t</code> and <code>std::bool_constant</code>
            metaprogramming utilities. </li>
      </ul>
      Thanks to Ville Voutilainen for contributing many of the C++17 features.
    </li>
    <li>An experimental implementation of the File System TS.</li>
    <li>Experimental support for most features of the second version of the
        Library Fundamentals TS. This includes polymorphic memory resources
        and array support in <code>shared_ptr</code>, thanks to Fan You.</li>
    <li>Some assertions checked by Debug Mode can now also be enabled by
        <code>_GLIBCXX_ASSERTIONS</code>. The subset of checks enabled by
        the new macro have less run-time overhead than the full
        <code>_GLIBCXX_DEBUG</code> checks and don't affect the library
        ABI, so can be enabled per-translation unit.
    </li>
    <li>Timed mutex types are supported on more targets, including Darwin.
    </li>
    <li>Improved <code>std::locale</code> support for DragonFly and FreeBSD,
        thanks to John Marino and Andreas Tobler.
    </li>
  </ul>


<h3 id="fortran">Fortran</h3>
  <ul>
    <li>The <code>MATMUL</code> intrinsic is now inlined for straightforward
      cases if front-end optimization is active.  The maximum size for
      inlining can be set to <code>n</code> with the
      <code>-finline-matmul-limit=n</code> option and turned off
      with <code>-finline-matmul-llimit=0</code>.</li>
    <li>The <code>-Wconversion-extra</code> option will warn about
      <code>REAL</code> constants which have excess precision for
      their kind.</li>
    <li>The <code>-Winteger-division</code> option has been added, which
      warns about divisions of integer constants which are truncated.
      This option is included in <code>-Wall</code> by default.</li>
  </ul>

<!-- <h3 id="go">Go</h3> -->

<!-- <h3 id="java">Java (GCJ)</h3> -->


<!-- .................................................................. -->
<h2 id="jit">libgccjit</h2>
  <ul>
    <li>The driver code is now run in-process within libgccjit,
      providing a small speed-up of the compilation process.</li>
    <li>The API has gained entrypoints for
      <ul>
        <li><a href="https://gcc.gnu.org/onlinedocs/gcc-6.1.0/jit/topics/performance.html">timing how long was spent in different parts of code</a>,</li>
        <li><a href="https://gcc.gnu.org/onlinedocs/gcc-6.1.0/jit/topics/functions.html#gcc_jit_block_end_with_switch">creating switch statements</a>,</li>
        <li><a href="https://gcc.gnu.org/onlinedocs/gcc-6.1.0/jit/topics/contexts.html#gcc_jit_context_set_bool_allow_unreachable_blocks">allowing unreachable basic blocks in a function</a>, and</li>
        <li><a href="https://gcc.gnu.org/onlinedocs/gcc-6.1.0/jit/topics/contexts.html#gcc_jit_context_add_command_line_option">adding arbitrary command-line options to a compilation</a>.</li>
      </ul>
    </li>
  </ul>

<!-- .................................................................. -->
<h2 id="targets">New Targets and Target Specific Improvements</h2>

<h3 id="aarch64">AArch64</h3>
   <ul>
     <li>
       The new command line options <code>-march=native</code>,
       <code>-mcpu=native</code> and <code>-mtune=native</code> are now
       available on native AArch64 GNU/Linux systems.  Specifying
       these options will cause GCC to auto-detect the host CPU and
       rewrite these options to the optimal setting for that system.
       If GCC is unable to detect the host CPU these options have no effect.
     </li>
     <li>
       <code>-fpic</code> is now supported by the AArch64 target when generating
       code for the small code model (<code>-mcmodel=small</code>).  The size of
       the global offset table (GOT) is limited to 28KiB under the LP64 SysV ABI
       , and 15KiB under the ILP32 SysV ABI.
     </li>
     <li>
       The AArch64 port now supports target attributes and pragmas.  Please
       refer to the <a href="https://gcc.gnu.org/onlinedocs/gcc-6.1.0/gcc/AArch64-Function-Attributes.html#AArch64-Function-Attributes">
       documentation</a> for details of available attributes and
       pragmas as well as usage instructions.
     </li>
     <li>
       Link-time optimization across translation units with different
       target-specific options is now supported.
     </li>
   </ul>

<h3 id="arm">ARM</h3>
   <ul>
     <li>
       Support for revisions of the ARM architecture prior to ARMv4t has
       been deprecated and will be removed in a future GCC release.
       The <code>-mcpu</code> and <code>-mtune</code> values that are
       deprecated are:
       <code>arm2, arm250, arm3, arm6, arm60, arm600, arm610, arm620, arm7,
       arm7d, arm7di, arm70, arm700, arm700i, arm710, arm720, arm710c,
       arm7100, arm7500, arm7500fe, arm7m, arm7dm, arm7dmi, arm8, arm810,
       strongarm, strongarm110, strongarm1100, strongarm1110, fa526,
       fa626</code>.  The value
       <code>arm7tdmi</code> is still supported.
       The values of <code>-march</code> that are deprecated are:
       <code>armv2,armv2a,armv3,armv3m,armv4</code>.
     </li>
     <li>
       The ARM port now supports target attributes and pragmas.  Please
       refer to the <a href="https://gcc.gnu.org/onlinedocs/gcc-6.1.0/gcc/ARM-Function-Attributes.html#ARM-Function-Attributes">
       documentation</a> for details of available attributes and
       pragmas as well as usage instructions.
     </li>
     <li>
       Support has been added for the following processors
       (GCC identifiers in parentheses): ARM Cortex-A32
       (<code>cortex-a32</code>), ARM Cortex-A35 (<code>cortex-a35</code>).
       The GCC identifiers can be used
       as arguments to the <code>-mcpu</code> or <code>-mtune</code> options,
       for example: <code>-mcpu=cortex-a32</code> or
       <code>-mtune=cortex-a35</code>.
     </li>
   </ul>
<!-- <h3 id="avr">AVR</h3> -->

<h3 id="hsa">Heterogeneous Systems Architecture</h3>
   <ul>
     <li><p>GCC can now generate HSAIL (Heterogeneous System Architecture
       Intermediate Language) for simple OpenMP device constructs if
       configured with <code>--enable-offload-targets=hsa</code>.  A new
       libgomp plugin then runs the HSA GPU kernels implementing these
       constructs on HSA capable GPUs via a standard HSA run time.</p>
       
       <p>If the HSA compilation back end determines it cannot output HSAIL
       for a particular input, it gives a warning by default.  These
       warnings can be suppressed with <code>-Wno-hsa</code>.  To give a few
       examples, the HSA back end does not implement compilation of code
       using function pointers, automatic allocation of variable sized
       arrays, functions with variadic arguments as well as a number of
       other less common programming constructs.</p>

       <p>When compilation for HSA is enabled, the compiler attempts to
       compile composite OpenMP constructs</p>
	 <blockquote><pre>
#pragma omp target teams distribute parallel for</pre></blockquote>
       <p>into parallel HSA GPU kernels.</p>
     </li>
   </ul>

<h3 id="x86">IA-32/x86-64</h3>
   <ul>
     <li>GCC now supports the Intel CPU named Skylake with AVX-512 extensions
      through <code>-march=skylake-avx512</code>. The switch enables the following
      ISA extensions: AVX-512F, AVX512VL, AVX-512CD, AVX-512BW, AVX-512DQ.
     </li>
     <li>
       Support for new AMD instructions <code>monitorx</code> and
       <code>mwaitx</code> has been added. This includes new intrinsic
       and built-in support. It is enabled through option <code>-mmwaitx</code>.
       The instructions <code>monitorx</code> and <code>mwaitx</code>
       implement the same functionality as the old <code>monitor</code>
       and <code>mwait</code> instructions. In addition <code>mwaitx</code>
       adds a configurable timer. The timer value is received as third
       argument and stored in register <code>%ebx</code>.
     </li>
     <li>
       x86-64 targets now allow stack realignment from a word-aligned stack
       pointer using the command-line option <code>-mstackrealign</code> or
       <code>__attribute__ ((force_align_arg_pointer))</code>.  This allows
       functions compiled with a vector-aligned stack to be invoked from
       objects that keep only word-alignment.
     </li>
     <li>
       Support for address spaces <code>__seg_fs</code>, <code>__seg_gs</code>,
       and <code>__seg_tls</code>.  These can be used to access data via the
       <code>%fs</code> and <code>%gs</code> segments without having to
       resort to inline assembly.
       Please refer to the <a href="https://gcc.gnu.org/onlinedocs/gcc-6.1.0/gcc/Named-Address-Spaces.html#Named-Address-Spaces">
       documentation</a> for usage instructions.
     </li>
     <li>
      Support for AMD Zen (family 17h) processors is now available through
      the <code>-march=znver1</code> and <code>-mtune=znver1</code> options.
     </li>
   </ul>
<!-- <h3 id="mips">MIPS</h3> -->

<h3 id="mep">MeP</h3>
  <ul>
    <li><p>Support for the MeP (mep-elf) architecture has been
      deprecated and will be removed in a future GCC release.</p>
    </li>
  </ul>

<h3 id="msp430">MSP430</h3>
  <ul>
    <li><p>The MSP430 compiler now has the ability to automatically distribute code
      and data between low memory (addresses below 64K) and high memory.  This only
      applies to parts that actually have both memory regions and only if the
      linker script for the part has been specifically set up to support this
      feature.</p>

      <p>A new attribute of <code>either</code> can be applied to both functions
      and data, and this tells the compiler to place the object into low memory
      if there is room and into high memory otherwise.  Two other new attributes
      - <code>lower</code> and <code>upper</code> - can be used to explicitly
      state that an object should be placed in the specified memory region.  If
      there is not enough left in that region the compilation will fail.</p>

      <p>Two new command-line options - <code>-mcode-region=[lower|upper|either]</code>
      and <code>-mdata-region=[lower|upper|either]</code> - can be used to tell
      the compiler what to do with objects that do not have one of these new
      attributes.</p></li>
  </ul>

<!-- <h3 id="nds32">NDS32</h3> -->

<h3 id="powerpc">PowerPC / PowerPC64 / RS6000</h3>
  <ul>
    <li><p>PowerPC64 now supports IEEE 128-bit floating-point using the
	__float128 data type.  In GCC 6, this is NOT enabled by default,
	but you can enable it with -mfloat128.  The IEEE 128-bit
	floating-point support requires the use of the VSX instruction
	set.  IEEE 128-bit floating-point values are passed and returned
	as a single vector value.  The software emulator for IEEE 128-bit
	floating-point support is only built on PowerPC Linux systems
	where the default cpu is at least power7.  On future ISA 3.0
	systems (power9 and later), you will be able to use the
	-mfloat128-hardware option to use the ISA 3.0 instructions
	that support IEEE 128-bit floating-point.  An additional type
	(__ibm128) has been added to refer to the IBM extended double
	type that normally implements long double.  This will allow
	for a future transition to implementing long double with IEEE
	128-bit floating-point.</p></li>
    <li><p>Basic support has been added for POWER9 hardware that will use the
	recently published OpenPOWER ISA 3.0 instructions.  The following
	new switches are available:</p>
	<ul>
	  <li><p><u>-mcpu=power9</u>:  Implement all of the ISA 3.0
	      instructions supported by the compiler.</p></li>
	  <li><p><u>-mtune=power9</u>:  In the future, apply tuning for
	      POWER9 systems.  Currently, POWER8 tunings are used.</p></li>
	  <li><p><u>-mmodulo</u>:  Generate code using the ISA 3.0
	      integer instructions (modulus, count trailing zeros, array
	      index support, integer multiply/add).</p></li>
	  <li><p><u>-mpower9-fusion</u>:  Generate code to suitably fuse
	      instruction sequences for a POWER9 system.</p></li>
	  <li><p><u>-mpower9-dform</u>:  Generate code to use the new D-form
	      (register +offset) memory instructions for the vector
	      registers.</p></li>
	  <li><p><u>-mpower9-vector</u>:  Generate code using the new ISA
	      3.0 vector (VSX or Altivec) instructions.</p></li>
	  <li><p><u>-mpower9-minmax</u>:  Reserved for future development.
	  </p></li>
	  <li><p><u>-mtoc-fusion</u>:  Keep TOC entries together to provide
	      more fusion opportunities.</p></li>
	</ul></li>
    <li><p>New constraints have been added to support IEEE 128-bit
	floating-point and ISA 3.0 instructions:</p>
	<ul>
	  <li><p><u>wb</u>:  Altivec register if -mpower9-dform is
	      enabled.</p></li>
	  <li><p><u>we</u>:  VSX register if -mpower9-vector is enabled
	      for 64-bit code generation.</p></li>
	  <li><p><u>wo</u>:  VSX register if -mpower9-vector is
	      enabled.</p></li>
	  <li><p><u>wp</u>:  Reserved for future use if long double
	      is implemented with IEEE 128-bit floating-point instead
	      of IBM extended double.</p></li>
	  <li><p><u>wq</u>:  VSX register if -mfloat128 is enabled.</p></li>
	  <li><p><u>wF</u>:  Memory operand suitable for POWER9 fusion
	      load/store.</p></li>
	  <li><p><u>wG</u>:  Memory operand suitable for TOC fusion memory
	      references.</p></li>
	  <li><p><u>wL</u>:  Integer constant identifying the element
	      number mfvsrld accesses within a vector.</p></li>
	</ul></li>
    <li><p>Support has been added for __builtin_cpu_is () and
	__builtin_cpu_supports (), allowing for very fast access to
	AT_PLATFORM, AT_HWCAP, and AT_HWCAP2 values.  This requires
	use of glibc 2.23 or later.</p></li>
    <li><p>All hardware transactional memory builtins now correctly
	behave as memory barriers.  Programmers can use #ifdef __TM_FENCE__
	to determine whether their "old" compiler treats the builtins
	as barriers.</p></li>
    <li><p>Split-stack support has been added for gccgo on PowerPC64
	for both big- and little-endian (but NOT for 32-bit).  The gold
	linker from at least binutils 2.25.1 must be available in the PATH
	when configuring and building gccgo to enable split stack.  (The
	requirement for binutils 2.25.1 applies to PowerPC64 only.)  The
	split-stack feature allows a small initial stack size to be
	allocated for each goroutine, which increases as needed.</p></li>
    <li><p>GCC on PowerPC now supports the standard lround function.</p></li>
    <li><p>A new configuration option -<code>--with-advance-toolchain=at</code>
    was added for PowerPC 64-bit GNU/Linux systems to use the header files, library
    files, and the dynamic linker from a specific Advance Toolchain release
    instead of the default versions that are provided by the GNU/Linux
    distribution.  In general, this option is intended for the developers of
    GCC, and it is not intended for general use.</p></li>
    <li><p>The "q", "S", "T", and "t" asm-constraints have been
    removed.</p></li>
    <li><p>The "b", "B", "m", "M", and "W" format modifiers have
    been removed.</p></li>
  </ul>

<h3 id="s390">S/390, System z, IBM z Systems</h3>
  <ul>
    <li>Support for the IBM z13 processor has been added.  When using
      the <code>-march=z13</code> option, the compiler will generate
      code making use of the new instructions and registers introduced
      with the vector extension facility.  The <code>-mtune=z13</code>
      option enables z13 specific instruction scheduling without
      making use of new instructions.<br/>

      Compiling code with <code>-march=z13</code> reduces the default
      alignment of vector types bigger than 8 bytes to 8.  This is an
      ABI change and care must be taken when linking modules compiled
      with different arch levels which interchange variables
      containing vector type values.  For newly compiled code the GNU
      linker will emit a warning.</li>

    <li>The <code>-mzvector</code> option enables a C/C++ language
      extension.  This extension provides a new
      keyword <code>vector</code> which can be used to define vector
      type variables.  (Note: This is not available when
      enforcing strict standard compliance
      e.g. with <code>-std=c99</code>.  Either enable GNU extensions
      with e.g. <code>-std=gnu99</code> or use
      <code>__vector</code> instead of <code>vector</code>.)<br/>

      Additionally a set of overloaded builtins is provided which is
      partially compatible to the PowerPC Altivec builtins.  In order
      to make use of these builtins the <code>vecintrin.h</code>
      header file needs to be included.</li>

    <li>The new command line options <code>-march=native</code>,
      and <code>-mtune=native</code> are now available on native IBM
      z Systems.  Specifying these options will cause GCC to
      auto-detect the host CPU and rewrite these options to the
      optimal setting for that system.  If GCC is unable to detect
      the host CPU these options have no effect.</li>

    <li>The IBM z Systems port now supports target attributes and
      pragmas.  Please refer to the
      <a href="https://gcc.gnu.org/onlinedocs/gcc-6.1.0/gcc/S_002f390-Function-Attributes.html#S_002f390-Function-Attributes">
	documentation</a> for details of available attributes and
      pragmas as well as usage instructions.
    </li>

    <li><code>-fsplit-stack</code> is now supported as part of the IBM
      z Systems port.  This feature requires a recent gold linker to
      be used.</li>

    <li>Support for the <code>g5</code> and <code>g6
      -march=/-mtune=</code> CPU level switches has been deprecated
      and will be removed in a future GCC release. <code>-m31</code>
      from now on defaults to <code>-march=z900</code> if not
      specified otherwise.  <code>-march=native</code> on a g5/g6
      machine will default to <code>-march=z900</code>.</li>
  </ul>

<!-- <h3 id="rx">RX</h3> -->

<h3 id="sh">SH</h3>
  <ul>
    <li>Support for SH5 / SH64 has been declared obsolete and will be removed
    in future releases.</li>

    <li>Support for the FDPIC ABI has been added.  It can be enabled using the
    new <code>-mfdpic</code> target option and <code>--enable-fdpic</code>
    configure option.</li>
  </ul>

<h3 id="sparc">SPARC</h3>
  <ul>
    <li>An ABI bug has been fixed in 64-bit mode.  Unfortunately, this change
    will break binary compatibility with earlier releases for code it affects,
    but this should be pretty rare in practice.  The conditions are: a 16-byte
    structure containing a <code>double</code> or a 8-byte vector in the second
    half is passed to a subprogram in slot #15, for example as 16th parameter
    if the first 15 ones have at most 8 bytes.  The <code>double</code> or
    vector was wrongly passed in floating-point register <code>%d32</code>
    in lieu of on the stack as per the SPARC calling conventions.</li>
  </ul>

<!-- .................................................................. -->
<h2 id="os">Operating Systems</h2>

<!-- <h3 id="dragonfly">DragonFly BSD</h3> -->

<!-- <h3 id="freebsd">FreeBSD</h3> -->

<h3 id="linux">Linux</h3>
  <ul>
    <li>Support for the <a href="http://www.musl-libc.org">musl C library</a>
    was added for the AArch64, ARM, MicroBlaze, MIPS, MIPS64, PowerPC,
    PowerPC64, SH, i386, x32 and x86_64 targets.  It can be selected using the
    new <code>-mmusl</code> option in case musl is not the default libc.  GCC
    defaults to musl libc if it is built with a target triplet matching the
    <code>*-linux-musl*</code> pattern.</li>
  </ul>

<h3 id="rtems">RTEMS</h3>
  <ul>
    <li>The RTEMS thread model implementation changed.  Mutexes now
    use self-contained objects defined in Newlib &lt;sys/lock.h&gt;
    instead of Classic API semaphores.  The keys for thread specific data and
    the <code>once</code> function are directly defined via &lt;pthread.h&gt;.
    Self-contained condition variables are provided via Newlib
    &lt;sys/lock.h&gt;.  The RTEMS thread model also supports C++11
    threads.</li>

    <li>OpenMP support now uses self-contained objects provided by Newlib
    &lt;sys/lock.h&gt; and offers a significantly better performance compared
    to the POSIX configuration of <code>libgomp</code>.  It is possible to
    configure thread pools for each scheduler instance via the environment
    variable <code>GOMP_RTEMS_THREAD_POOLS</code>.</li>
  </ul>

<h3 id="aix">AIX</h3>
  <ul>
    <li>DWARF debugging support for AIX 7.1 has been enabled as an optional
    debugging format.  A more recent Technology Level (TL) and GCC built
    with that level are required for full exploitation of DWARF debugging
    capabilities.</li>
  </ul>

<h3 id="solaris">Solaris</h3>
  <ul>
    <li>Solaris 12 is now fully supported.  Minimal support had already
      been present in GCC 5.3.</li>
    <li>Solaris 12 provides a full set of startup files (<code>crt1.o</code>,
      <code>crti.o</code>, <code>crtn.o</code>), which GCC now prefers over
      its own ones.</li>
    <li>Position independent executables (PIE) are now supported on
      Solaris 12.</li>
    <li>Constructor priority is now supported on Solaris 12 with the system
      linker.</li>
    <li><code>libvtv</code> has been ported to Solaris 11 and up.</li>
  </ul>

<h3 id="windows">Windows</h3>
  <ul>
   <li>The option <code>-mstackrealign</code> is now automatically activated
   in 32-bit mode whenever the use of SSE instructions is requested.</li>
  </ul>
<!-- <h3 id="vxmils">VxWorks MILS</h3> -->


<!-- .................................................................. -->
<!-- <h2>Documentation improvements</h2> -->


<!-- .................................................................. -->
<h2>Other significant improvements</h2>

  <ul>
    <li>The <code>gcc</code> and <code>g++</code> driver programs will now
      provide suggestions for misspelled command line options.
<blockquote><pre>
$ gcc -static-libfortran test.f95
gcc: <span class="boldred">error:</span> unrecognized command line option <b>'-static-libfortran'</b>; did you mean <b>'-static-libgfortran'</b>?
</pre></blockquote></li>
    <li>The <code>--enable-default-pie</code> configure option enables
	generation of PIE by default.</li>
  </ul>




<!-- ==================================================================== -->

<div class="copyright">

<address>For questions related to the use of GCC,
please consult these web pages and the
<a href="https://gcc.gnu.org/onlinedocs/">GCC manuals</a>. If that fails,
the <a href="mailto:gcc-help@gcc.gnu.org">gcc-help@gcc.gnu.org</a>
mailing list might help.
Comments on these web pages and the development of GCC are welcome on our
developer list at <a href="mailto:gcc@gcc.gnu.org">gcc@gcc.gnu.org</a>.
All of <a href="https://gcc.gnu.org/lists.html">our lists</a>
have public archives.
</address>

<p>Copyright (C)
<a href="http://www.fsf.org">Free Software Foundation, Inc.</a>
Verbatim copying and distribution of this entire article is
permitted in any medium, provided this notice is preserved.</p>

<p>These pages are
<a href="https://gcc.gnu.org/about.html">maintained by the GCC team</a>.
Last modified 2016-04-27<!-- IGNORE DIFF
--><a href="http://validator.w3.org/check/referer">.</a></p>

</div>

<!-- ==================================================================== -->

</body>
     </html>