W dniu 29.09.2021 o 20:33, Lucas De Marchi pisze: > Like the IS_ENABLED() counterpart, we can make IS_CONFIG_NONZERO() to > return the right thing when the config is not defined rather than a > build error, with the limitation that it can't be used on preprocessor > context. > > The trick here is that macro names can't start with a number or dash, so > we stringify the argument and check that the first char is a number != 0 > (or starting with a dash to cover negative numbers). Except for -O0 > builds the strings are all eliminated. > > Taking CONFIG_DRM_I915_REQUEST_TIMEOUT in > drivers/gpu/drm/i915/gem/i915_gem_context.c as example, we have the > following output of the preprocessor: > > old: > if (((20000) != 0) && > new: > if (( ("20000"[0] > '0' && "20000"[0] < '9') || "20000"[0] == '-' ) && > > New one looks worse, but is also eliminated from the object: > > $ size drivers/gpu/drm/i915/gem/i915_gem_context.o.* > text data bss dec hex filename > 52021 1070 232 53323 d04b drivers/gpu/drm/i915/gem/i915_gem_context.o.new > 52021 1070 232 53323 d04b drivers/gpu/drm/i915/gem/i915_gem_context.o.old > > Signed-off-by: Lucas De Marchi <lucas.demarchi@xxxxxxxxx> > --- > drivers/gpu/drm/i915/i915_utils.h | 6 +++++- > 1 file changed, 5 insertions(+), 1 deletion(-) > > diff --git a/drivers/gpu/drm/i915/i915_utils.h b/drivers/gpu/drm/i915/i915_utils.h > index 02bbfa4d68d3..436ce612c46a 100644 > --- a/drivers/gpu/drm/i915/i915_utils.h > +++ b/drivers/gpu/drm/i915/i915_utils.h > @@ -28,6 +28,7 @@ > #include <linux/list.h> > #include <linux/overflow.h> > #include <linux/sched.h> > +#include <linux/stringify.h> > #include <linux/types.h> > #include <linux/workqueue.h> > > @@ -469,6 +470,9 @@ static inline bool timer_expired(const struct timer_list *t) > * > * Returns 0 if @config is 0, 1 if set to any value. > */ > -#define IS_CONFIG_NONZERO(config) ((config) != 0) > +#define IS_CONFIG_NONZERO(config) ( \ > + (__stringify_1(config)[0] > '0' && __stringify_1(config)[0] < '9') || \ > + __stringify_1(config)[0] == '-' \ > +) Quite clever trick, but I see two issues: - gcc < 8.1 treats expressions with string indices (ex. "abc"[0]) as non-constant expressions, so they cannot be used everywhere, for example in global variable initializations, - it does not work with hex (0x1) or octal values (01) It is probably OK for private macro, but it can hurt in kconfig.h, especially the 2nd issue Regards Andrzej > > #endif /* !__I915_UTILS_H */