System headers with clang?

Dimitry Andric dim at FreeBSD.org
Tue Oct 11 12:00:49 UTC 2011


On 2011-10-09 19:32, Larry Rosenman wrote:
> I had gotten a PR about sysutils/lsof not compiling with clang.  I had
> Vic Abell check it out, and the problem is NOT with lsof per se, but
> with the system headers.
>
> Is there a project afoot to update the system headers to make them clang
> compilable?

The problem isn't that clang can't compile the system headers, but
normally these don't get included from userspace.  And they certainly
won't work as expected when you define _KERNEL in userspace, as the lsof
port foolishly does.  It probably can't be avoided in such a tool, though.


...
> In file included from ckkv.c:43:
> In file included from ./../lsof.h:195:
> In file included from ./../dlsof.h:190:
> In file included from /usr/src/sys/ufs/ufs/ufsmount.h:36:
> /usr/src/sys/sys/buf.h:388:2: warning: implicit declaration of function 'KASSERT' is invalid in C99
> [-Wimplicit-function-declaration]
>           KASSERT(bp->b_bufobj != NULL, ("bwrite: no bufobj bp=%p", bp));
>           ^
> /usr/src/sys/sys/buf.h:388:33: warning: expression result unused [-Wunused-value]
>           KASSERT(bp->b_bufobj != NULL, ("bwrite: no bufobj bp=%p", bp));
>                                          ^~~~~~~~~~~~~~~~~~~~~~~~~

These are more or less harmless warnings, as long as nobody calls a
function that uses KASSERT.  They occur because lsof's headers don't
include <sys/param.h> and <sys/systm.h> before <sys/ufs/ufs/ufsmount.h>.

...
> In file included from ckkv.c:43:
> In file included from ./../lsof.h:195:
> In file included from ./../dlsof.h:432:
> In file included from /usr/include/string.h:45:
> /usr/include/strings.h:47:6: error: conflicting types for '__builtin_ffs'
> int      ffs(int) __pure2;
>            ^
> /usr/include/machine/cpufunc.h:140:24: note: expanded from:
> #define        ffs(x)  __builtin_ffs(x)
>                          ^
> /usr/include/strings.h:47:6: note: '__builtin_ffs' is a builtin with type 'int (unsigned int)'

This is because the amd64 system headers redefine ffs to __builtin_ffs,
after which it conflicts with the declaration in /usr/include/strings.h.
On i386, ffs is not redefined, but I have no idea why.

In any case, gcc does not complain about the incompatible redeclaration,
which may be a bug, or just stupid luck, depending on your POV. :)

I've attached a fix for the lsof port, which also makes it build on
10.0-CURRENT (this was easy to fix here, as lsof uses its own
hand-rolled configuration script).  Let me know if it works for you.
-------------- next part --------------
Index: sysutils/lsof/files/patch-Configure
===================================================================
RCS file: sysutils/lsof/files/patch-Configure
diff -N sysutils/lsof/files/patch-Configure
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ sysutils/lsof/files/patch-Configure	11 Oct 2011 11:44:44 -0000
@@ -0,0 +1,72 @@
+--- Configure.orig	2011-08-15 18:15:56.000000000 +0200
++++ Configure	2011-10-11 13:30:37.000000000 +0200
+@@ -1428,7 +1428,7 @@
+       3.5*)
+ 	LSOF_VERS=3050
+ 	;;
+-      3*)
++      3.*)
+ 	LSOF_VERS=3050
+ 	echo "!!!WARNING!!!  Unsupported FreeBSD version: $LSOF_VSTR"
+ 	echo "!!!WARNING!!!  Configuring for FreeBSD 3.5"
+@@ -1481,7 +1481,7 @@
+ 	LSOF_TSTBIGF=" "
+ 	LSOF_VERS=4110
+ 	;;
+-      4*)
++      4.*)
+ 	LSOF_VERS=4100
+ 	echo "!!!WARNING!!!  Unsupported FreeBSD version: $LSOF_VSTR"
+ 	echo "!!!WARNING!!!  Configuring for FreeBSD 4.10"
+@@ -1510,7 +1510,7 @@
+ 	LSOF_TSTBIGF=" "
+ 	LSOF_VERS=5050
+ 	;;
+-      5*)
++      5.*)
+ 	LSOF_VERS=5050
+ 	echo "!!!WARNING!!!  Unsupported FreeBSD version: $LSOF_VSTR"
+ 	echo "!!!WARNING!!!  Configuring for FreeBSD 5.5"
+@@ -1535,7 +1535,7 @@
+ 	LSOF_TSTBIGF=" "
+ 	LSOF_VERS=6040
+ 	;;
+-      6*)
++      6.*)
+ 	LSOF_VERS=6000
+ 	echo "!!!WARNING!!!  Unsupported FreeBSD version: $LSOF_VSTR"
+ 	echo "!!!WARNING!!!  Configuring for FreeBSD 6.0"
+@@ -1560,7 +1560,7 @@
+ 	LSOF_TSTBIGF=" "
+ 	LSOF_VERS=7040
+ 	;;
+-      7*)
++      7.*)
+ 	LSOF_VERS=7000
+ 	echo "!!!WARNING!!!  Unsupported FreeBSD version: $LSOF_VSTR"
+ 	echo "!!!WARNING!!!  Configuring for FreeBSD 7.0"
+@@ -1577,10 +1577,14 @@
+ 	LSOF_TSTBIGF=" "
+ 	LSOF_VERS=8020
+ 	;;
+-      9*)
++      9.*)
+ 	LSOF_TSTBIGF=" "
+ 	LSOF_VERS=9000
+ 	;;
++      10.*)
++	LSOF_TSTBIGF=" "
++	LSOF_VERS=10000
++	;;
+       *)
+ 	echo Unknown FreeBSD release: `uname -r`
+ 	echo Assuming FreeBSD 2.x
+@@ -1684,7 +1688,7 @@
+ 	LSOF_CFGF="$LSOF_CFGF -DHASVMLOCKH"
+       fi	# }
+       ;;
+-    4000|4010|4020|4030|4040|4050|4060|4070|4080|4090|4100|4110|5000|5010|5020|5030|5040|5050|6000|6010|6020|6030|6040|7000|7010|7020|7030|7040|8000|8010|8020|9000)
++    4000|4010|4020|4030|4040|4050|4060|4070|4080|4090|4100|4110|5000|5010|5020|5030|5040|5050|6000|6010|6020|6030|6040|7000|7010|7020|7030|7040|8000|8010|8020|9000|10000)
+       if test -r ${LSOF_INCLUDE}/nfs/rpcv2.h	# {
+       then
+ 	LSOF_CFGF="$LSOF_CFGF -DHASRPCV2H"
Index: sysutils/lsof/files/patch-dialects-freebsd-dlsof.h
===================================================================
RCS file: sysutils/lsof/files/patch-dialects-freebsd-dlsof.h
diff -N sysutils/lsof/files/patch-dialects-freebsd-dlsof.h
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ sysutils/lsof/files/patch-dialects-freebsd-dlsof.h	11 Oct 2011 11:44:44 -0000
@@ -0,0 +1,12 @@
+--- dialects/freebsd/dlsof.h.orig	2011-08-15 18:15:57.000000000 +0200
++++ dialects/freebsd/dlsof.h	2011-10-11 13:34:59.000000000 +0200
+@@ -88,6 +88,9 @@
+ #  endif	/* defined(NEEDS_BOOLEAN_T) */
+ 
+ #include <sys/conf.h>
++#ifdef ffs
++#undef ffs
++#endif
+ 
+ #  if	defined(HAS_VM_MEMATTR_T)
+ #undef	vm_memattr_t


More information about the freebsd-current mailing list