• Ingo Molnar's avatar
    jump_labels: Mark __jump_label_transform() as __always_inlined to work around... · e48a12e5
    Ingo Molnar authored
    jump_labels: Mark __jump_label_transform() as __always_inlined to work around aggressive compiler un-inlining
    
    In randconfig testing, certain UBSAN and CC Kconfig combinations
    with GCC 10.3.0:
    
      CONFIG_X86_32=y
    
      CONFIG_CC_OPTIMIZE_FOR_SIZE=y
    
      CONFIG_UBSAN=y
      # CONFIG_UBSAN_TRAP is not set
      # CONFIG_UBSAN_BOUNDS is not set
      CONFIG_UBSAN_SHIFT=y
      # CONFIG_UBSAN_DIV_ZERO is not set
      CONFIG_UBSAN_UNREACHABLE=y
      CONFIG_UBSAN_BOOL=y
      # CONFIG_UBSAN_ENUM is not set
      # CONFIG_UBSAN_ALIGNMENT is not set
      # CONFIG_UBSAN_SANITIZE_ALL is not set
    
    ... produce this build warning (and build error if
    CONFIG_SECTION_MISMATCH_WARN_ONLY=y is set):
    
      WARNING: modpost: vmlinux.o(.text+0x4c1cc): Section mismatch in reference from the function __jump_label_transform() to the function .init.text:text_poke_early()
      The function __jump_label_transform() references
      the function __init text_poke_early().
      This is often because __jump_label_transform lacks a __init
      annotation or the annotation of text_poke_early is wrong.
    
      ERROR: modpost: Section mismatches detected.
    
    The problem is that __jump_label_transform() gets uninlined by GCC,
    despite there being only a single local scope user of the 'static inline'
    function.
    
    Mark the function __always_inline instead, to work around this compiler
    bug/artifact.
    Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
    e48a12e5
jump_label.c 3.87 KB