• Josh Poimboeuf's avatar
    objtool: Improve detection of BUG() and other dead ends · d1091c7f
    Josh Poimboeuf authored
    The BUG() macro's use of __builtin_unreachable() via the unreachable()
    macro tells gcc that the instruction is a dead end, and that it's safe
    to assume the current code path will not execute past the previous
    instruction.
    
    On x86, the BUG() macro is implemented with the 'ud2' instruction.  When
    objtool's branch analysis sees that instruction, it knows the current
    code path has come to a dead end.
    
    Peter Zijlstra has been working on a patch to change the WARN macros to
    use 'ud2'.  That patch will break objtool's assumption that 'ud2' is
    always a dead end.
    
    Generally it's best for objtool to avoid making those kinds of
    assumptions anyway.  The more ignorant it is of kernel code internals,
    the better.
    
    So create a more generic way for objtool to detect dead ends by adding
    an annotation to the unreachable() macro.  The annotation stores a
    pointer to the end of the unreachable code path in an '__unreachable'
    section.  Objtool can read that section to find the dead ends.
    Tested-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
    Signed-off-by: default avatarJosh Poimboeuf <jpoimboe@redhat.com>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Link: http://lkml.kernel.org/r/41a6d33971462ebd944a1c60ad4bf5be86c17b77.1487712920.git.jpoimboe@redhat.comSigned-off-by: default avatarIngo Molnar <mingo@kernel.org>
    d1091c7f
builtin-check.c 31 KB