linux/tools/objtool
Josh Poimboeuf f5caf621ee x86/asm: Fix inline asm call constraints for Clang
For inline asm statements which have a CALL instruction, we list the
stack pointer as a constraint to convince GCC to ensure the frame
pointer is set up first:

  static inline void foo()
  {
	register void *__sp asm(_ASM_SP);
	asm("call bar" : "+r" (__sp))
  }

Unfortunately, that pattern causes Clang to corrupt the stack pointer.

The fix is easy: convert the stack pointer register variable to a global
variable.

It should be noted that the end result is different based on the GCC
version.  With GCC 6.4, this patch has exactly the same result as
before:

	defconfig	defconfig-nofp	distro		distro-nofp
 before	9820389		9491555		8816046		8516940
 after	9820389		9491555		8816046		8516940

With GCC 7.2, however, GCC's behavior has changed.  It now changes its
behavior based on the conversion of the register variable to a global.
That somehow convinces it to *always* set up the frame pointer before
inserting *any* inline asm.  (Therefore, listing the variable as an
output constraint is a no-op and is no longer necessary.)  It's a bit
overkill, but the performance impact should be negligible.  And in fact,
there's a nice improvement with frame pointers disabled:

	defconfig	defconfig-nofp	distro		distro-nofp
 before	9796316		9468236		9076191		8790305
 after	9796957		9464267		9076381		8785949

So in summary, while listing the stack pointer as an output constraint
is no longer necessary for newer versions of GCC, it's still needed for
older versions.

Suggested-by: Andrey Ryabinin <aryabinin@virtuozzo.com>
Reported-by: Matthias Kaehlcke <mka@chromium.org>
Signed-off-by: Josh Poimboeuf <jpoimboe@redhat.com>
Cc: Alexander Potapenko <glider@google.com>
Cc: Andy Lutomirski <luto@kernel.org>
Cc: Arnd Bergmann <arnd@arndb.de>
Cc: Dmitriy Vyukov <dvyukov@google.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Miguel Bernal Marin <miguel.bernal.marin@linux.intel.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Link: http://lkml.kernel.org/r/3db862e970c432ae823cf515c52b54fec8270e0e.1505942196.git.jpoimboe@redhat.com
Signed-off-by: Ingo Molnar <mingo@kernel.org>
2017-09-23 15:06:20 +02:00
..
arch/x86 objtool: Handle another GCC stack pointer adjustment bug 2017-09-23 15:06:19 +02:00
Documentation x86/asm: Fix inline asm call constraints for Clang 2017-09-23 15:06:20 +02:00
.gitignore objtool: Add 'fixdep' to objtool/.gitignore 2016-07-27 11:07:11 +02:00
arch.h objtool: Assume unannotated UD2 instructions are dead ends 2017-07-28 08:33:32 +02:00
Build objtool: Add ORC unwind table generation 2017-07-18 10:57:43 +02:00
builtin-check.c objtool: Fix gcov check for older versions of GCC 2017-07-25 11:12:45 +02:00
builtin-orc.c objtool: Fix gcov check for older versions of GCC 2017-07-25 11:12:45 +02:00
builtin.h objtool: Add ORC unwind table generation 2017-07-18 10:57:43 +02:00
cfi.h objtool: Handle GCC stack pointer adjustment bug 2017-08-30 10:48:41 +02:00
check.c objtool: Handle another GCC stack pointer adjustment bug 2017-09-23 15:06:19 +02:00
check.h objtool: Handle GCC stack pointer adjustment bug 2017-08-30 10:48:41 +02:00
elf.c objtool: Fix object file corruption 2017-09-15 11:31:57 +02:00
elf.h objtool: Add ORC unwind table generation 2017-07-18 10:57:43 +02:00
Makefile objtool: Disable GCC '-Wpacked' warnings 2017-07-28 08:33:32 +02:00
objtool.c objtool: Add ORC unwind table generation 2017-07-18 10:57:43 +02:00
orc_dump.c objtool: Add ORC unwind table generation 2017-07-18 10:57:43 +02:00
orc_gen.c objtool: Add ORC unwind table generation 2017-07-18 10:57:43 +02:00
orc_types.h objtool, x86: Add facility for asm code to provide unwind hints 2017-07-18 10:57:44 +02:00
orc.h objtool: Add ORC unwind table generation 2017-07-18 10:57:43 +02:00
special.c objtool: Implement stack validation 2.0 2017-06-30 10:19:19 +02:00
special.h
warn.h objtool: Implement stack validation 2.0 2017-06-30 10:19:19 +02:00