x86_64: Fix calls to __morestack under the large code model.
authorPeter Collingbourne <peter@pcc.me.uk>
Tue, 30 Dec 2014 20:05:19 +0000 (20:05 +0000)
committerPeter Collingbourne <peter@pcc.me.uk>
Tue, 30 Dec 2014 20:05:19 +0000 (20:05 +0000)
commitd8ae3e1feec0fa1c06e96e43a80ad2c5e5208461
treed21581db59eb0563981ccf9cc9f77b1d75202e56
parentdd890d5c5e452d6f1247c84056e266bd99fe06b2
x86_64: Fix calls to __morestack under the large code model.

Under the large code model, we cannot assume that __morestack lives within
2^31 bytes of the call site, so we cannot use pc-relative addressing. We
cannot perform the call via a temporary register, as the rax register may
be used to store the static chain, and all other suitable registers may be
either callee-save or used for parameter passing. We cannot use the stack
at this point either because __morestack manipulates the stack directly.

To avoid these issues, perform an indirect call via a read-only memory
location containing the address.

This solution is not perfect, as it assumes that the .rodata section
is laid out within 2^31 bytes of each function body, but this seems to
be sufficient for JIT.

Differential Revision: http://reviews.llvm.org/D6787

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@225003 91177308-0d34-0410-b5e6-96231b3b80d8
include/llvm/CodeGen/MachineModuleInfo.h
lib/CodeGen/AsmPrinter/AsmPrinter.cpp
lib/CodeGen/MachineModuleInfo.cpp
lib/Target/X86/X86FrameLowering.cpp
test/CodeGen/X86/segmented-stacks.ll