This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

November 2016 GNU Toolchain Update


Hi Guys,

  Long time, no post.  Sorry about that.  So, in order to make up for
  it, here is an extra long update on the state of the GNU toolchain:

  In GCC land, 6.2 has now been released and GCC 7 is almost ready to
  branch.  Here are the new features that you can expect to find in
  GCC 7:

  * LRA is now the default register allocator for new targets and most
    of the major targets now use it.

  * Suggestions for corrections to misspelt identifiers has been
    expanded to include function names, macro names, enum values, type
    names and preprocessor directives.

  * The output from -fverbose-asm has been extended to add comments
    showing the source lines that correspond to the assembly.  For
    example:

      # example.c:4:   int total = 0;
           xorl    %eax, %eax      # <retval>
      # example.c:6:   for (i = 0; i < n; i++)
           xorl    %edx, %edx      # i
      .L2:
      # example.c:6:   for (i = 0; i < n; i++)
           cmpl    %edi, %edx      # n, i
           jge     .L5             #
      # example.c:7:     total += i * i;
           movl    %edx, %ecx      # i, tmp92
           imull   %edx, %ecx      # i, tmp92
      # example.c:6:   for (i = 0; i < n; i++)
           incl    %edx            # i
      # example.c:7:     total += i * i;
           addl    %ecx, %eax      # tmp92, <retval>
           jmp     .L2             #

   * Attributes can now be set on null statements.  For example:

       case 1:
         bar (1);
         __attribute__((fallthrough));
       case 2:

     (The fallthrough attribute is also new.  Its use should be
     obvious).

   * Built-in functions have been added to allow access to the PowerPC
     ISA 3.0 instructions.

  * Experimental support for C++17 has been added.  This includes:

    + A command line option -faligned-new enables support for
      allocating memory for types that require more alignment than
      void*::operator new(std::size_t) provides.  A numeric argument
      such as -faligned-new=32 can be used to specify how much
      alignment (in bytes) is provided by that function, but few users
      will need to override the default of alignof(std::max_align_t).

    + The option -fnew-inheriting-ctors which enables the P0136
       adjustment to the semantics of C++11 constructor inheritance.

  * Some new warnings have been added as well:
  
    + -Wregister which warns when the register keyword is used as a
      storage class specifier, (except when it is part of the GNU
      Explicit Register Variables extension).  The use of the
      register keyword as storage class specifier has been deprecated
      in C++11 and removed in C++17. 

    + -Wformat-length (or -Wformat-length=<level>) warns about calls
      to formatted input/output functions such as sprintf that might
      overflow the destination buffer, or about bounded functions such
      as snprintf that might result in output truncation.

      When the exact number of bytes written by a format directive
      cannot be determined at compile-time it is estimated based on
      heuristics that depend on the <level> argument and on the
      optimization level in use.

      -Wformat-length=1 employs a conservative approach that warns
      only about calls that most likely overflow the buffer or result
      in output truncation.  For example, this call to sprintf below
      would be diagnosed:

           extern int a, b;
           char buf [12];
           sprintf (buf, "a = %i, b = %i\n", a, b);

      Increasing the buffer size by 1 however would stop the warning
      from being generated as it is possible that overflow will not
      occur if both a and b are small.

      -Wformat-length=2 also warns about calls where numeric arguments
      with maximal values would overflow.  So in the example above the
      warning will be generated unless the buffer is at least 34 bytes
      long in order to allow for both a and b having a value of
      INT_MAX.

    + -Wimplicit-fallthrough (or -Wimplicit-fallthrough=<level>) warns
       when a switch case falls through.  For example: 

         switch (cond)
         {
         case 1: a = 1; break;
         case 2: a = 2;
         case 3: a = 3; break;
         }

      This warning does not warn when the last statement of a case
      cannot fall through, e.g. when there is a return statement or a
      call to function declared with the noreturn attribute.

      Since there are occasions where a switch case fall through is
      desirable, GCC provides an attribute, __attribute__((fallthrough)),
      that is to be used along with a null statement to suppress this
      warning that would normally occur.  C++17 also provides a
      standard way to suppress the -Wimplicit-fallthrough warning
      using [[fallthrough]]; instead of the GNU attribute.

      Instead of the these attributes, it is also possible to add a
      fallthrough comment to silence the warning.  The whole body of
      the C or C++ style comment should match the given regular
      expressions listed below.  The option argument <level> specifies
      what kind of comments are accepted:

      . -Wimplicit-fallthrough=0 disables the warning altogether.

      . -Wimplicit-fallthrough=1 matches ".*" regular expression. i.e.
        any comment is used as fallthrough comment. 

      . -Wimplicit-fallthrough=2 case insensitively matches the
        ".*falls?[ \t-]*thr(ough|u).*" regular expression.

      . -Wimplicit-fallthrough=3 case sensitively matches one of the
        following regular expressions:

          -fallthrough
	  @fallthrough@
	  lint -fallthrough[ \t]*
	  [ \t.!]*(ELSE,? |INTENTIONAL(LY)? )?@*FALL(S | |-)?THR(OUGH|U)[ \t.!]*(-[^\n\r]*)?
	  [ \t.!]*(Else,? |Intentional(ly)? )?@*Fall((s | |-)[Tt]|t)hr(ough|u)[ \t.!]*(-[^\n\r]*)?
	  [ \t.!]*([Ee]lse,? |[Ii]ntentional(ly)? )?@*fall(s | |-)?thr(ough|u)[ \t.!]*(-[^\n\r]*)?

      . -Wimplicit-fallthrough=4 case sensitively matches one of the
        following regular expressions:

          -fallthrough
	  @fallthrough@
	  lint -fallthrough[ \t]*
	  [ \t]*FALLTHR(OUGH|U)[ \t]*

      . -Wimplicit-fallthrough=5 doesn't recognize any comments as
        fallthrough comments, only attributes disable the warning.

    + -Walloca warns when alloca is used anywhere in the source.

    + -Walloca-larger-than=<N> warns when a call to alloca is
      unbounded or greater than <N>.  Note that even seemingly
      correct code involving signed integers can cause a warning.
      For example:

           extern signed int n;
           if (n < 500) p = alloca (n);

      This option also warns when alloca is used in a loop.

    + -Wvla-larger-than=<N> warns on uses of variable-length arrays
      where the size is either unbounded, or bounded by an argument
      that can be larger than <N> bytes.  Note that GCC may optimize
      small variable-length arrays of a known value into plain arrays,
      so this warning may not get triggered for such arrays.

      These last two warnings are not enabled by -Wall, and are only
      active when the -ftree-vrp optimization is active (which by
      default is when -O2 or higher is in use).

    + -Wbool-operation warns about suspicious operations on
      expressions of a boolean type.  For instance, bitwise negation
      of a boolean is very likely a bug in the program.  For C, this
      warning also warns about incrementing or decrementing a boolean,
      which rarely makes sense.

    + -Waligned-new warns about a new-expression of a type that
      requires greater alignment than the alignof(std::max_align_t)
      but which uses an allocation function without an explicit
      alignment parameter.

    + -Wint-in-bool-context warns about suspicious use of integer
      values where boolean values are expected, such as conditional
      expressions (?:) using non-boolean integer constants in boolean
      context:

         if (a <= b ? 2 : 3)

      Or left shifting of signed integers in a boolean context;

         for (a = 0; 1 << a; a++)

   * Some new optimizations have been added as well:

    + -fstore-merging  This combines narrow stores to consecutive
      memory addresses into larger, word sized stores.

    + -fsplit-loops splits a loop into two if it contains a condition
      that's always true for one side of the iteration space and false
      for the other.

    + -fprintf-return-value substitutes constants for known return
      values of formatted output functions such as sprintf etc.  This
      transformation allows GCC to optimize or even eliminate branches
      based on the known return value of these functions.  For
      example, both the branch and the body of the if statement (but
      not the call to snprintf) can be optimized away in this snippet,
      provided that the variable "i" is a 32-bit or smaller integer.

          char buf[9];
          if (snprintf (buf, "%08x", i) >= sizeof buf)


  * Lastly, but certainly not leastly, the ARM backend has added the
    option -mpure-code which stops constant data from being placed in
    code sections.  Additionally, when compiling for ELF object format
    it gives all code sections the ELF processor-specific section
    attribute SHF_ARM_PURECODE.



A new release of GLIBC is unlikely to happen before the new year, but
in the meantime lots of new features have been added to the
development sources:

  * Support for the ISO/IEC TS 18661-1:2014 has been added including:

    - Adding the fesetexcept function to libm.

    - New <math.h> features:
 
      . Signalling NaN macros: SNANF, SNAN, SNANL.
      . Comparison macros: iseqsig.
      . Classification macros: iscanonical, issubnormal, iszero.
      . Total order functions: totalorder, totalorderf, totalorderl,
        totalordermag, totalordermagf, totalordermagl.
      . Canonicalize functions: canonicalize, canonicalizef, canonicalizel.
      . NaN functions: getpayload, getpayloadf, getpayloadl.

    - New libc functions: strfromd, strfromf, and strfroml.

  * The <sys/quota.h> header now includes the <linux/quota.h> header.
    Support for the Linux quota interface which pre-dates kernel
    version 2.4.22 has been removed.

  * The malloc_get_state and malloc_set_state functions have been removed.
    Already-existing binaries that dynamically link to these functions
    will get a hidden implementation in which malloc_get_state is a
    stub.

  * The “ip6-dotint” and “no-ip6-dotint” resolver options, and the
    corresponding RES_NOIP6DOTINT flag from <resolv.h> have been removed.
    “no-ip6-dotint” had already been the default, and support for the
    “ip6-dotint” option was removed from the Internet in 2006.
 
  * The "ip6-bytestring" resolver option and the corresponding
    RES_NOIP6DOTINT flag from <resolv.h> have been removed.

  * DNSSEC-related declarations and definitions have been removed from
    the <arpa/nameser.h> header file, and libresolv will no longer
    attempt to decode the data part of DNSSEC record types.

  * The resource record type classification macros ns_t_qt_p,
    ns_t_mrr_p, ns_t_rr_p, ns_t_udp_p, ns_t_xfr_p have been removed
    from the <arpa/nameser.h> header file because the distinction
    between RR types and meta-RR types is not officially standardized,
    subject to revision, and thus not suitable for encoding in a macro.

  * The types res_sendhookact, res_send_qhook, re_send_rhook, and the
    qhook and rhook members of the res_state type in <resolv.h> have
    been removed.

 
GDB 7.12 is now out (really this time).  In addition the development
sources has a nice new feature for MS-Windows developers:

  * Native debugging on MS-Windows supports command-line redirection

    Command-line arguments used for starting programs on MS-Windows
    can now include redirection symbols supported by native Windows
    shells, such as '<', '>', '>>', '2>&1', etc.  This affects GDB
    commands such as "run", "start", and "set args", as well as the
    corresponding MI features.
 

And lastly the binutils development sources have a couple of new
tricks up its sleaves:

  * Support has been added for the RISC-V architecture.
  
  * The nm program has a new command lien option
    (--with-version-strings) which will display a symbol's version
    information, if any, after the symbol's name.

  * The EXCLUDE_FILE linker script construct can now be applied
    outside of the section list in order for the exclusions to apply
    over all input sections in the list.

  * The command line option --no-eh-frame-hdr can now be used in ELF
    based linkers to disable the automatic generation of .eh_frame_hdr
    sections. 

  * The ARM linker now supports --in-implib=<infile> to enable
    specifying a set of Secure Gateway veneers that must exist in the
    output import library specified by --out-implib=<outfile> and the
    address they must have.


That's all for now.  Hopefully the next update will be a bit sooner in
arriving.

Cheers
  Nick


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]