List Info

Thread: -current kernel headers vs. MS VC compiler




-current kernel headers vs. MS VC compiler
user name
2008-03-05 21:11:26
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

[1]

about | contact  Other archives ( Real Estate discussion Medical topics )