Fix miscompile of MS inline assembly with stack realignment
authorReid Kleckner <reid@kleckner.net>
Tue, 10 Dec 2013 05:12:23 +0000 (05:12 +0000)
committerReid Kleckner <reid@kleckner.net>
Tue, 10 Dec 2013 05:12:23 +0000 (05:12 +0000)
commitec4d326aad404fa7a6335aadcc21710ecc6a63b0
tree6a359376b8e93694f111bc7edbdc902470b22929
parente15c1079cb4942f8975cf318b5deb87ed31c250a
Fix miscompile of MS inline assembly with stack realignment

For stack frames requiring realignment, three pointers may be needed:
- ebp to address incoming arguments
- esi (could be any callee-saved register) to address locals
- esp to address outgoing arguments

We would use esi unconditionally without verifying that it did not
conflict with inline assembly.

This change doesn't do the verification, it simply emits a fatal error
on functions that use stack realignment, dynamic SP adjustments, and
inline assembly.

Because stack realignment is common on Windows, we also no longer assume
that MS inline assembly clobbers esp.  Instead, we analyze the inline
instructions for implicit definitions and check if esp is there.  If so,
we require the use of a base pointer and consider it in the condition
above.

Mostly fixes PR16830, but we could try harder to find a non-conflicting
base pointer.

Reviewers: sunfish

Differential Revision: http://llvm-reviews.chandlerc.com/D1317

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@196876 91177308-0d34-0410-b5e6-96231b3b80d8
include/llvm/CodeGen/MachineFrameInfo.h
include/llvm/CodeGen/MachineFunction.h
lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
lib/MC/MCParser/AsmParser.cpp
lib/Target/X86/X86FrameLowering.cpp
lib/Target/X86/X86RegisterInfo.cpp
test/CodeGen/X86/inline-asm-stack-realign.ll [new file with mode: 0644]
test/CodeGen/X86/inline-asm-stack-realign2.ll [new file with mode: 0644]
test/CodeGen/X86/ms-inline-asm.ll