mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-11-02 22:23:10 +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:
@@ -1011,6 +1011,23 @@ bool AsmPrinter::doFinalization(Module &M) {
|
||||
// Emit llvm.ident metadata in an '.ident' directive.
|
||||
EmitModuleIdents(M);
|
||||
|
||||
// Emit __morestack address if needed for indirect calls.
|
||||
if (MMI->usesMorestackAddr()) {
|
||||
const MCSection *ReadOnlySection =
|
||||
getObjFileLowering().getSectionForConstant(SectionKind::getReadOnly(),
|
||||
/*C=*/nullptr);
|
||||
OutStreamer.SwitchSection(ReadOnlySection);
|
||||
|
||||
MCSymbol *AddrSymbol =
|
||||
OutContext.GetOrCreateSymbol(StringRef("__morestack_addr"));
|
||||
OutStreamer.EmitLabel(AddrSymbol);
|
||||
|
||||
const DataLayout &DL = *TM.getSubtargetImpl()->getDataLayout();
|
||||
unsigned PtrSize = DL.getPointerSize(0);
|
||||
OutStreamer.EmitSymbolValue(GetExternalSymbolSymbol("__morestack"),
|
||||
PtrSize);
|
||||
}
|
||||
|
||||
// If we don't have any trampolines, then we don't require stack memory
|
||||
// to be executable. Some targets have a directive to declare this.
|
||||
Function *InitTrampolineIntrinsic = M.getFunction("llvm.init.trampoline");
|
||||
|
||||
Reference in New Issue
Block a user