Sam Ravnborg wrote:We have many places in the kernel that looks like
the following:
#ifdef CONFIG_FOO
...
#endif
Which has the disadvantage that the code denoted '...'
are not even built if CONFIG_FOO is not selected in
the current configuration.
We know that gcc do simple code-elimination for
conditionals which is always true/false and
thus the above code could be turned into:
if (CONFIG_FOO)
...
One line smaller and we follow the normal flow in the program.
The code is always build but we do not waste space as gcc will
do proper code-elimination for us.
Today this is not possible because kconfig will only
define CONFIG_FOO if selected and FOO is not a module.
The following patch implement a new set of defines in
the KCONFIG_* namespace.
For a tristate symbol the following are defined:
FOO not selected: #define KCONFIG_FOO 0
#define KCONFIG_FOO_MODULE 0
FOO is built-in ('y')
#define KCONFIG_FOO 1
#define KCONFIG_FOO_MODULE 0
FOO is a module ('m'):
#define KCONFIG_FOO 1
#define KCONFIG_FOO_MODULE 1
In other words KCONFIG_FOO will say if the
symbol is selected and KCONFIG_FOO_MODULE
will say if it is a module.
With the above included we can now do:
if (KCONFIG_FOO)
...
This is not a replacement for the CONFIG_*
defines but a pleasant supplement.
Using KCONFIG_FOO will also give us a nice
error message the day that FOO is no longer part
of the configuration.
How about rather than defining a pile of new constants, we just define:
#define KCONFIG(x) (x - 0) /* XXX choose better macro name */