Skip to content
  • Masahiro Yamada's avatar
    kbuild: allow Clang to find unused static inline functions for W=1 build · 6863f564
    Masahiro Yamada authored
    GCC and Clang have different policy for -Wunused-function; GCC does not
    warn unused static inline functions at all whereas Clang does if they
    are defined in source files instead of included headers although it has
    been suppressed since commit abb2ea7d ("compiler, clang: suppress
    warning for unused static inline functions").
    
    We often miss to delete unused functions where 'static inline' is used
    in *.c files since there is no tool to detect them. Unused code remains
    until somebody notices. For example, commit 075ddd75 ("regulator:
    core: remove unused rdev_get_supply()").
    
    Let's remove __maybe_unused from the inline macro to allow Clang to
    start finding unused static inline functions. For now, we do this only
    for W=1 build since it is not a good idea to sprinkle warnings for the
    normal build (e.g. 35 warnings for arch/x86/configs/x86_64_defconfig).
    
    My initial attempt was to add -Wno-unused-function for no W= build
    (https://lore.kernel.org/patchwork/patch/1120594/
    
    )
    
    Nathan Chancellor pointed out that would weaken Clang's checks since
    we would no longer get -Wunused-function without W=1. It is true GCC
    would catch unused static non-inline functions, but it would weaken
    Clang as a standalone compiler, at least.
    
    Hence, here is a counter implementation. The current problem is, W=...
    only controls compiler flags, which are globally effective. There is
    no way to address only 'static inline' functions.
    
    This commit defines KBUILD_EXTRA_WARN[123] corresponding to W=[123].
    When KBUILD_EXTRA_WARN1 is defined, __maybe_unused is omitted from
    the 'inline' macro.
    
    The new macro __inline_maybe_unused makes the code a bit uglier, so I
    hope we can remove it entirely after fixing most of the warnings.
    
    If you contribute to code clean-up, please run "make CC=clang W=1"
    and check -Wunused-function warnings. You will find lots of unused
    functions.
    
    Some of them are false-positives because the call-sites are disabled
    by #ifdef. I do not like to abuse the inline keyword for suppressing
    unused-function warnings because it is intended to be a hint for the
    compiler optimization. I prefer #ifdef around the definition, or
    __maybe_unused if #ifdef would make the code too ugly.
    
    Signed-off-by: default avatarMasahiro Yamada <yamada.masahiro@socionext.com>
    Reviewed-by: default avatarNathan Chancellor <natechancellor@gmail.com>
    Tested-by: default avatarNathan Chancellor <natechancellor@gmail.com>
    6863f564