• J
    objtool: Prevent GCC from merging annotate_unreachable() · 3d1e2360
    Josh Poimboeuf 提交于
    0-day bot reported some new objtool warnings which were caused by the
    new annotate_unreachable() macro:
    
      fs/afs/flock.o: warning: objtool: afs_do_unlk()+0x0: duplicate frame pointer save
      fs/afs/flock.o: warning: objtool: afs_do_unlk()+0x0: frame pointer state mismatch
      fs/btrfs/delayed-inode.o: warning: objtool: btrfs_delete_delayed_dir_index()+0x0: duplicate frame pointer save
      fs/btrfs/delayed-inode.o: warning: objtool: btrfs_delete_delayed_dir_index()+0x0: frame pointer state mismatch
      fs/dlm/lock.o: warning: objtool: _grant_lock()+0x0: duplicate frame pointer save
      fs/dlm/lock.o: warning: objtool: _grant_lock()+0x0: frame pointer state mismatch
      fs/ocfs2/alloc.o: warning: objtool: ocfs2_mv_path()+0x0: duplicate frame pointer save
      fs/ocfs2/alloc.o: warning: objtool: ocfs2_mv_path()+0x0: frame pointer state mismatch
    
    It turns out that, for older versions of GCC, if a function has multiple
    BUG() incantations, GCC will sometimes merge the corresponding
    annotate_unreachable() inline asm statements into a single block.  That
    has the undesirable effect of removing one of the entries in the
    __unreachable section, confusing objtool greatly.
    
    A workaround for this issue is to ensure that each instance of the
    inline asm statement uses a different label, so that GCC sees the
    statements are unique and leaves them alone.  The inline asm ‘%=’ token
    could be used for that, but unfortunately older versions of GCC don't
    support it.  So I implemented a poor man's version of it with the
    __LINE__ macro.
    Reported-by: Nkbuild test robot <fengguang.wu@intel.com>
    Signed-off-by: NJosh Poimboeuf <jpoimboe@redhat.com>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Fixes: d1091c7f ("objtool: Improve detection of BUG() and other dead ends")
    Link: http://lkml.kernel.org/r/0c14b00baf9f68d1b0221ddb6c88b925181c8be8.1487997036.git.jpoimboe@redhat.comSigned-off-by: NIngo Molnar <mingo@kernel.org>
    3d1e2360
compiler-gcc.h 10.2 KB