On Sun, 23 Oct 2011, Dimitry Andric wrote:

On 2011-10-23 18:27, Robert Millan wrote:
Log:
Conditionalize a pair of FreeBSD GCC extensions so that its CFLAGS are only
   used with FreeBSD GCC.

Bug in non-FreeBSD gcc.

Modified: head/sys/conf/kern.mk
==============================================================================
--- head/sys/conf/kern.mk       Sun Oct 23 16:04:07 2011        (r226664)
+++ head/sys/conf/kern.mk       Sun Oct 23 16:27:03 2011        (r226665)
@@ -1,11 +1,21 @@
  # $FreeBSD$

+.if ${CC:T:Mclang} != "clang"
+FREEBSD_GCC!=  ${CC} --version | grep FreeBSD || true
+.endif
+

Runtime tests like this should never be used in central makefiles since
they are slow.  This one doesn't even work.  Use some user-defined-macro
like NON_FREEBSD_GCC.

  #
  # Warning flags for compiling the kernel and components of the kernel:
  #
+.if ${FREEBSD_GCC}
+# FreeBSD extensions, not available in upstream GCC
+format_extensions=     -fformat-extensions
+no_align_long_strings= -mno-align-long-strings
+.endif

How can this help?  Builds should still fail due to -Wformat (-Werror)
errors when the FreeBSD format extensions are used, and kernel code
uses them a lot.  You can turn off -Werror or -Wformat but then the
non-FreeBSD gcc is even more unsuitable for development.

Note: this breaks builds where CC=clang, with:

Kernel build for GENERIC started on Sun Oct 23 22:01:23 CEST 2011
...
make KERNEL=kernel cleandir
"/usr/src/sys/conf/kern.mk", line 10: Malformed conditional (${FREEBSD_GCC})
"/usr/src/sys/conf/kern.mk", line 14: if-less endif
make: fatal errors encountered -- cannot continue
...

Since our base 'clang --version' also has 'FreeBSD' in its output, you
might want to drop the first .if ${CC:T:Mclang} != "clang" test.  E.g.
just unconditionally set the FREEBSD_GCC macro (although it's then no
longer correctly named, but that aside).

clang is broken for -mno-align-long-strings too.  This is worked around
using a static test on ${CC}.

clang also doesn't support -mpreferred-stack-boundary.  This handled
using using a static test on ${MACHINE_CPUARCH}.  This is correct for
clang, since it handles stack alignment better than gcc and uses the
minimal alignment.

clang doesn't properly fail when 1 or both of -mno-align-long-strings
or -mpreferred-stack-boundary.  It prints a diagnostic, but exits
with status 0 even with -Werror, and even if the -mpreferred-stack-
boundary arg is invalid so that it would case a fatal error with gcc.

amd64 never used -preferred-stack-boundary even for gcc.  It is avoided
using the same static test on ${MACHINE_CPUARCH}.  I'm not sure if this
is a bug, of if the ABI requires 16-byte alignment even in the
freestanding case.  Certainly, the hardware only prefers 8-byte alignment
for most args, like it only prefers 4-byte alignment on i386.  Both amd64
and i386 require 16-byte alignment for some SSE args.  This should be
implemented by aligning the stack only if such args exists, like clang
does on i386.

amd64 never used -mno-align-long-strings even for FreeBSD gcc where it is
supported.

Bruce
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to