Port-hpcarm archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
-current kernel headers vs. MS VC compiler
Folks:
	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
        description:
        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
===================================================================
RCS file: /cvsroot/src/sys/sys/time.h,v
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).
Thanks,
--rafal
Home |
Main Index |
Thread Index |
Old Index