When building the kernel with Clang with defconfig and CONFIG_64BIT disabled, vmlinux fails to link because of the BUILD_BUG in _print_param. ld: drivers/gpu/drm/i915/i915_params.o: in function `i915_params_dump': i915_params.c:(.text+0x56): undefined reference to `__compiletime_assert_191' This function is semantically invalid unless the code is first inlined then constant folded, which doesn't work for Clang because semantic analysis happens before optimization/inlining. Converting this function to a macro avoids this problem and allows Clang to properly remove the BUILD_BUG during optimization. The output of 'objdump -D' is identically before and after this change for GCC regardless of if CONFIG_64BIT is set and allows Clang to link the kernel successfully with or without CONFIG_64BIT set. Link: https://github.com/ClangBuiltLinux/linux/issues/191 Suggested-by: Nick Desaulniers <ndesaulniers@xxxxxxxxxx> Signed-off-by: Nathan Chancellor <natechancellor@xxxxxxxxx> --- drivers/gpu/drm/i915/i915_params.c | 29 +++++++++++++---------------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/drivers/gpu/drm/i915/i915_params.c b/drivers/gpu/drm/i915/i915_params.c index 295e981e4a39..a0f20b9b6f2d 100644 --- a/drivers/gpu/drm/i915/i915_params.c +++ b/drivers/gpu/drm/i915/i915_params.c @@ -174,22 +174,19 @@ i915_param_named(enable_dpcd_backlight, bool, 0600, i915_param_named(enable_gvt, bool, 0400, "Enable support for Intel GVT-g graphics virtualization host support(default:false)"); -static __always_inline void _print_param(struct drm_printer *p, - const char *name, - const char *type, - const void *x) -{ - if (!__builtin_strcmp(type, "bool")) - drm_printf(p, "i915.%s=%s\n", name, yesno(*(const bool *)x)); - else if (!__builtin_strcmp(type, "int")) - drm_printf(p, "i915.%s=%d\n", name, *(const int *)x); - else if (!__builtin_strcmp(type, "unsigned int")) - drm_printf(p, "i915.%s=%u\n", name, *(const unsigned int *)x); - else if (!__builtin_strcmp(type, "char *")) - drm_printf(p, "i915.%s=%s\n", name, *(const char **)x); - else - BUILD_BUG(); -} +#define _print_param(p, name, type, x) \ +do { \ + if (!__builtin_strcmp(type, "bool")) \ + drm_printf(p, "i915.%s=%s\n", name, yesno(*(const bool *)x)); \ + else if (!__builtin_strcmp(type, "int")) \ + drm_printf(p, "i915.%s=%d\n", name, *(const int *)x); \ + else if (!__builtin_strcmp(type, "unsigned int")) \ + drm_printf(p, "i915.%s=%u\n", name, *(const unsigned int *)x); \ + else if (!__builtin_strcmp(type, "char *")) \ + drm_printf(p, "i915.%s=%s\n", name, *(const char **)x); \ + else \ + BUILD_BUG(); \ +} while (0) /** * i915_params_dump - dump i915 modparams -- 2.19.0 _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/dri-devel