mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-19 03:24:09 +00:00
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
This commit is contained in:
@ -161,6 +161,13 @@ class MachineModuleInfo : public ImmutablePass {
|
||||
/// to _fltused on Windows targets.
|
||||
bool UsesVAFloatArgument;
|
||||
|
||||
/// UsesMorestackAddr - True if the module calls the __morestack function
|
||||
/// indirectly, as is required under the large code model on x86. This is used
|
||||
/// to emit a definition of a symbol, __morestack_addr, containing the
|
||||
/// address. See comments in lib/Target/X86/X86FrameLowering.cpp for more
|
||||
/// details.
|
||||
bool UsesMorestackAddr;
|
||||
|
||||
public:
|
||||
static char ID; // Pass identification, replacement for typeid
|
||||
|
||||
@ -234,6 +241,14 @@ public:
|
||||
UsesVAFloatArgument = b;
|
||||
}
|
||||
|
||||
bool usesMorestackAddr() const {
|
||||
return UsesMorestackAddr;
|
||||
}
|
||||
|
||||
void setUsesMorestackAddr(bool b) {
|
||||
UsesMorestackAddr = b;
|
||||
}
|
||||
|
||||
/// \brief Returns a reference to a list of cfi instructions in the current
|
||||
/// function's prologue. Used to construct frame maps for debug and exception
|
||||
/// handling comsumers.
|
||||
|
Reference in New Issue
Block a user