tech-kern archive


-current kernel headers vs. MS VC compiler

It looks like changes to the kernel headers over the last couple of months have broken the ability to build things that rely on libsa, etc. with compilers other than GCC & PCC. Specifically, I can no longer build hpcboot.exe with MS eMbedded Visual C++ 4.0 after upgrading my kernel tree to the head of trunk.

The first change that bit me was a change from the old '__attribute__((packed))', which used to be defined away on non-GCC compilers (probably incorrectly, but nonetheless) to using '__packed', in sys/ufs/ffs/fs.h:

        RCS file: /cvsroot/src/sys/ufs/ffs/fs.h,v
        Working file: fs.h
        head: 1.49
        revision 1.49
        date: 2007/12/25 18:33:49;  author: perry;  state: Exp;  lines: +2 -2
        Convert many of the uses of __attribute__ to equivalent
        __packed, __unused and __dead macros from cdefs.h

I've 'fixed' this with the following change, because I don't know how to make the MS compiler #pragma pack fit into the syntax we require (nor was I able to find an MS compiler extension which looked it it might help):

Index: cdefs.h
RCS file: /cvsroot/src/sys/sys/cdefs.h,v
retrieving revision 1.66
diff -u -p -r1.66 cdefs.h
--- cdefs.h     26 Nov 2007 14:52:34 -0000      1.66
+++ cdefs.h     6 Mar 2008 02:07:54 -0000
@@ -207,7 +207,7 @@
 #define        __packed        __attribute__((__packed__))
 #define        __aligned(x)    __attribute__((__aligned__(x)))
 #define        __section(x)    __attribute__((__section__(x)))
-#elif defined(__PCC__)
+#elif defined(__PCC__) || defined(_MSC_VER)
 #define        __packed        /* XXX ignore for now */
 #define        __aligned(x)    /* XXX ignore for now */
 #define        __section(x)    /* XXX ignore for now */

The second change that broke the eVC++ build was the exposing of bintime and the various helpers that operate on it in sys/sys/time.h, because eVC++ 4 doesn't grok the 'LL' suffix on some of the numeric constants used in the bintime-wrangling code.

        RCS file: /cvsroot/src/sys/sys/time.h,v
        Working file: time.h
        head: 1.59
        total revisions: 115;   selected revisions: 115
        revision 1.58
        date: 2007/12/22 01:19:41;  author: yamt;  state: Exp;  lines: +1 -3
        expose bintime for libpthread.

Here, I used a big-stick and simply #ifndef _STANDALONE'd the offending code, like so (it used to be #ifdef _KERNEL):

Index: time.h
retrieving revision 1.59
diff -u -p -r1.59 time.h
--- time.h      8 Jan 2008 20:56:22 -0000       1.59
+++ time.h      6 Mar 2008 02:07:54 -0000
@@ -99,6 +99,7 @@ struct timezone {
                }                                                       \
        } while (/* CONSTCOND */ 0)

+#ifndef _STANDALONE
 struct bintime {
        time_t  sec;
        uint64_t frac;
@@ -188,6 +189,7 @@ timeval2bintime(const struct timeval *tv
        /* 18446744073709 = int(2^64 / 1000000) */
        bt->frac = tv->tv_usec * (uint64_t)18446744073709LL;
+#endif /* !_STANDALONE */

 /* Operations on timespecs. */
#define timespecclear(tsp) (tsp)->tv_sec = (time_t)((tsp)->tv_nsec = 0L)

Any thoughts on what the right thing to do to keep MV eVC++ compatibility without littering the kernel headers with too much #ifdef-ism is in these cases? The first seems like an easy (if slightly wrong solution), but I'm not sure if the second change will cause any collateral damage (I suspect not, but thought I'd pass it by the lists).


Home | Main Index | Thread Index | Old Index