Martin MaD Douda writes:
> On Tue, 5 Sep 2000, Alexander Viro wrote:
> >     The _real_ problem is preprocessor abuse. BTW, could we schedule for
> > 2.5 the following?
> >     * things like CONFIG_FOO are _always_ defined. As 0 or 1, that is.
> >     * #ifdef CONFIG_FOO => if (CONFIG_FOO) in *.c. gcc will kill the unused
> > branches just fine.
> >     * Yes, Virginia, it means that controlflow-affecting expansion has to
> > go. Good riddance, IMO.
> > 
> >     Goal: making sure that every bloody line of the files we choose to
> > compile goes through the parser. Will do wonders with test coverage and will
> > make analysis tools like tags viable. Then we can just use the gcc frontend
> > output as input for such beasts.
> 
> I can understand advantages the if(CONFIG_FOO) approach has, but I'm not
> sure it is worth compilation slowdown.

In response to Al (I don't think I've got his mail, still got 150 emails
to look at since last night):

Been there, done that, maybe you'd like to look at the ARM code which contains
the machine_is_xxx()?  These essentially reduce down to one of three possible
values:

1. (0)
2. (MACH_TYPE_ASSABET == MACH_TYPE_ASSABET)
3. (__machine_type == MACH_TYPE_ASSABET)

The relevent definition is chosen by a set of pre-processor generated out of
arch/arm/tools/gen-mach-types.

Whilst it is good to remove redunant code, you still need #ifdefs...#endifs,
so I wouldn't recommend this style of configuration management for the
generic kernel.

Think about this:

struct bar foo_specific = {
        ...
};

struct bar *goo()
{
        if (CONFIG_FOO)
                return &foo_specific;
        else
                return NULL;
}

Unfortunately, the compiler always generates dataspace for both structures,
even if CONFIG_FOO is 0.  So, how do we get rid of them?  Simple, surround
them with #if CONFIG_FOO...#endif.  Oh dear, the symbol is now undefined.
I guess we must add #if CONFIG_FOO around the if (CONFIG_FOO) as well.  Ug,
I suppose we might as well just do:

struct bar *goo()
{
#if CONFIG_FOO
        return &foo_specific;
#else
        return NULL;
#endif
}

and be done with it.

Yes, I'd agree a good idea, and may apply to some small bits of code, but
not as a general kernel-wide thing.  And converting the #ifdefs all to #ifs
is going to be a nightmarish large patch (before even thinking of making
configure produce the "define CONFIG_FOO as 0 or 1" you have first got to
make sure that there are no #ifdef CONFIG_FOO statements in existance.

(Note that the reason we do it on the ARM is NOT because we have a never
or always condition, but because we have never, maybe or always conditions,
and this is the easiest way to fix them up.  But.  We still need #ifdefs
#endifs).
   _____
  |_____| ------------------------------------------------- ---+---+-
  |   |         Russell King        [EMAIL PROTECTED]      --- ---
  | | | | http://www.arm.linux.org.uk/personal/aboutme.html   /  /  |
  | +-+-+                                                     --- -+-
  /   |               THE developer of ARM Linux              |+| /|\
 /  | | |                                                     ---  |
    +-+-+ -------------------------------------------------  /\\\  |
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
Please read the FAQ at http://www.tux.org/lkml/

Reply via email to