kern/99979: Get Ready for Kernel Module in C++

mag at intron.ac mag at intron.ac
Tue Jul 11 10:05:14 UTC 2006


Dag-Erling  [iso-8859-1] Sm  grav wrote:

> mag at intron.ac writes:
>> But prior to long-term discussion, please commit my 4 patches
>> firstly.  They are nearly CPP-independent and do no harm to current
>> FreeBSD kernel.
> 
> We don't do the kind of changes you propose without discussion.
> 
>> --- kern.mk.orig	Fri Jun 30 05:15:25 2006
>> +++ kern.mk	Mon Jul 10 18:42:43 2006
>> @@ -88,7 +88,7 @@
>>  .if ${CC} == "icc"
>>  CFLAGS+=	-nolib_inline
>>  .else
>> -CFLAGS+=	-ffreestanding
>> +CFLAGS+=	-fno-builtin
>>  .endif
> 
> Are you sure this is correct?  I'm pretty certain it isn't.  The
> kernel's C environment is not a hosted implementation.

GCC manual page gcc(1) says:

   -ffreestanding
       Compile for a freestanding environment; this implies the  `-fno-
       builtin'  option,  and implies that main has no special require-
       ments.

GCC manual says:
(http://gcc.gnu.org/onlinedocs/gcc-4.1.1/gcc/C-Dialect-Options.html)

   -ffreestanding
       Assert that compilation takes place in a freestanding environment.
       This implies -fno-builtin. A freestanding environment is one in
       which the standard library may not exist, and program startup may
       not necessarily be at main. The most obvious example is an OS
       kernel. This is equivalent to -fno-hosted.

But "-ffreestanding" doesn't work with C++. According to above
explanation, "-fno-builtin" is a subset of "-ffreestanding" and it's
enough for kernel.

In /usr/src/contrib/gcc/c-opts.c, "-ffreestanding" is recognized as:


     case OPT_ffreestanding:
       value = !value;
       /* Fall through....  */
     case OPT_fhosted:
       flag_hosted = value;
       flag_no_builtin = !value;
       /* warn_main will be 2 if set by -Wall, 1 if set by -Wmain */
       if (!value && warn_main == 2)
	warn_main = 0;
       break;


In /usr/src/contrib/gcc/c-decl.c, "-ffreestanding" takes effects as:


   if (MAIN_NAME_P (DECL_NAME (fndecl)) && flag_hosted)
     {
       if (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (fndecl)))
	  != integer_type_node)
	{
	  /* If warn_main is 1 (-Wmain) or 2 (-Wall), we have already warned.
	     If warn_main is -1 (-Wno-main) we don't want to be warned.  */
	  if (!warn_main)
	    pedwarn ("%Jreturn type of '%D' is not `int'", fndecl, fndecl);
	}
       else
	{
#ifdef DEFAULT_MAIN_RETURN
	  /* Make it so that `main' always returns success by default.  */
	  DEFAULT_MAIN_RETURN;
#else
	  if (flag_isoc99)
	    c_expand_return (integer_zero_node);
#endif
	}
     }


>From above code we can conclude that "-ffreestanding" can affect only
something about main() more than "-fno-builtin".

I have compiled the whole FreeBSD kernel with "-fno-builtin" and met
no problems. Now I am running the kernel with "-fno-builtin" to write
to you with Linux ABI Mozilla-GTK1 1.7.12 and NVIDIA X11 driver 1.0-8762.

> 
>> --- systm.h.orig	Mon Jul 10 05:42:58 2006
>> +++ systm.h	Mon Jul 10 18:44:01 2006
>> @@ -203,7 +203,7 @@
>>  int	suword16(void *base, int word);
>>  int	suword32(void *base, int32_t word);
>>  int	suword64(void *base, int64_t word);
>> -intptr_t casuptr(intptr_t *p, intptr_t old, intptr_t new);
>> +intptr_t casuptr(intptr_t *p, intptr_t old, intptr_t __new__);
> 
> This is a namespace violation.  A simpler solution is to leave out
> argument names entirely.

If the code style permits, I agree with you.

GCC support library usually uses "namespace" to add various prefixes
to its built-in functions/variables in order to avoid conflicts against
user code. In ELF binary file, built-in functions/variables' names are
much longer than "__new__". See files in
/usr/src/contrib/libstdc++/libsupc++/.


------------------------------------------------------------------------
                                                From Beijing, China



More information about the freebsd-hackers mailing list