• Josh Poimboeuf's avatar
    objtool: Handle GCC stack pointer adjustment bug · dd88a0a0
    Josh Poimboeuf authored
    Arnd Bergmann reported the following warning with GCC 7.1.1:
      fs/fs_pin.o: warning: objtool: pin_kill()+0x139: stack state mismatch: cfa1=7+88 cfa2=7+96
    And the kbuild robot reported the following warnings with GCC 5.4.1:
      fs/fs_pin.o: warning: objtool: pin_kill()+0x182: return with modified stack frame
      fs/quota/dquot.o: warning: objtool: dquot_alloc_inode()+0x140: stack state mismatch: cfa1=7+120 cfa2=7+128
      fs/quota/dquot.o: warning: objtool: dquot_free_inode()+0x11a: stack state mismatch: cfa1=7+112 cfa2=7+120
    Those warnings are caused by an unusual GCC non-optimization where it
    uses an intermediate register to adjust the stack pointer.  It does:
      lea    0x8(%rsp), %rcx
      mov    %rcx, %rsp
    Instead of the obvious:
      add    $0x8, %rsp
    It makes no sense to use an intermediate register, so I opened a GCC bug
    to track it:
    But it's not exactly a high-priority bug and it looks like we'll be
    stuck with this issue for a while.  So for now we have to track register
    values when they're loaded with stack pointer offsets.
    This is kind of a big workaround for a tiny problem, but c'est la vie.
    I hope to eventually create a GCC plugin to implement a big chunk of
    objtool's functionality.  Hopefully at that point we'll be able to
    remove of a lot of these GCC-isms from the objtool code.
    Reported-by: 's avatarArnd Bergmann <arnd@arndb.de>
    Reported-by: 's avatarkbuild test robot <fengguang.wu@intel.com>
    Signed-off-by: 's 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/6a41a96884c725e7f05413bb7df40cfe824b2444.1504028945.git.jpoimboe@redhat.comSigned-off-by: 's avatarIngo Molnar <mingo@kernel.org>