diff options
author | Dale Johannesen <dalej@apple.com> | 2008-08-11 23:46:25 +0000 |
---|---|---|
committer | Dale Johannesen <dalej@apple.com> | 2008-08-11 23:46:25 +0000 |
commit | dafdbf77b315961fedc959e9ea732fa3f5cbee67 (patch) | |
tree | 15ab3561938181add7ce138708c3339bf9a317bf /llvm/lib/Target/X86/X86CodeEmitter.cpp | |
parent | b56e07e73689ee9edd918d01918640539382dab8 (diff) | |
download | bcm5719-llvm-dafdbf77b315961fedc959e9ea732fa3f5cbee67.tar.gz bcm5719-llvm-dafdbf77b315961fedc959e9ea732fa3f5cbee67.zip |
Some fixes for x86-64 JIT. Make it use small code
model, except for external calls; this makes
addressing modes PC-relative. Incomplete.
The assertion at the top of Emitter::runOnMachineFunction
was obviously bogus (always true) so I removed it.
If someone knows what the correct test should be to cover
all the various targets, please fix.
llvm-svn: 54656
Diffstat (limited to 'llvm/lib/Target/X86/X86CodeEmitter.cpp')
-rw-r--r-- | llvm/lib/Target/X86/X86CodeEmitter.cpp | 20 |
1 files changed, 8 insertions, 12 deletions
diff --git a/llvm/lib/Target/X86/X86CodeEmitter.cpp b/llvm/lib/Target/X86/X86CodeEmitter.cpp index 1b2d5ffc3e6..c0d051fcefe 100644 --- a/llvm/lib/Target/X86/X86CodeEmitter.cpp +++ b/llvm/lib/Target/X86/X86CodeEmitter.cpp @@ -106,10 +106,7 @@ FunctionPass *llvm::createX86CodeEmitterPass(X86TargetMachine &TM, } bool Emitter::runOnMachineFunction(MachineFunction &MF) { - assert((MF.getTarget().getRelocationModel() != Reloc::Default || - MF.getTarget().getRelocationModel() != Reloc::Static) && - "JIT relocation model must be set to static or default!"); - + MCE.setModuleInfo(&getAnalysis<MachineModuleInfo>()); II = TM.getInstrInfo(); @@ -517,11 +514,16 @@ void Emitter::emitInstruction(const MachineInstr &MI, if (CurOp != NumOps) { const MachineOperand &MO = MI.getOperand(CurOp++); +DOUT << "RawFrm CurOp " << CurOp << "\n"; +DOUT << "isMachineBasicBlock " << MO.isMachineBasicBlock() << "\n"; +DOUT << "isGlobalAddress " << MO.isGlobalAddress() << "\n"; +DOUT << "isExternalSymbol " << MO.isExternalSymbol() << "\n"; +DOUT << "isImmediate " << MO.isImmediate() << "\n"; if (MO.isMachineBasicBlock()) { emitPCRelativeBlockAddress(MO.getMBB()); } else if (MO.isGlobalAddress()) { - bool NeedStub = (Is64BitMode && TM.getCodeModel() == CodeModel::Large) - || Opcode == X86::TAILJMPd; + // Assume undefined functions may be outside the Small codespace. + bool NeedStub = Is64BitMode || Opcode == X86::TAILJMPd; emitGlobalAddress(MO.getGlobal(), X86::reloc_pcrel_word, 0, 0, NeedStub); } else if (MO.isExternalSymbol()) { @@ -545,8 +547,6 @@ void Emitter::emitInstruction(const MachineInstr &MI, else { unsigned rt = Is64BitMode ? X86::reloc_pcrel_word : (IsPIC ? X86::reloc_picrel_word : X86::reloc_absolute_word); - if (Opcode == X86::MOV64ri) - rt = X86::reloc_absolute_dword; // FIXME: add X86II flag? if (MO1.isGlobalAddress()) { bool NeedStub = isa<Function>(MO1.getGlobal()); bool isLazy = gvNeedsLazyPtr(MO1.getGlobal()); @@ -617,8 +617,6 @@ void Emitter::emitInstruction(const MachineInstr &MI, else { unsigned rt = Is64BitMode ? X86::reloc_pcrel_word : (IsPIC ? X86::reloc_picrel_word : X86::reloc_absolute_word); - if (Opcode == X86::MOV64ri32) - rt = X86::reloc_absolute_word; // FIXME: add X86II flag? if (MO1.isGlobalAddress()) { bool NeedStub = isa<Function>(MO1.getGlobal()); bool isLazy = gvNeedsLazyPtr(MO1.getGlobal()); @@ -654,8 +652,6 @@ void Emitter::emitInstruction(const MachineInstr &MI, else { unsigned rt = Is64BitMode ? X86::reloc_pcrel_word : (IsPIC ? X86::reloc_picrel_word : X86::reloc_absolute_word); - if (Opcode == X86::MOV64mi32) - rt = X86::reloc_absolute_word; // FIXME: add X86II flag? if (MO.isGlobalAddress()) { bool NeedStub = isa<Function>(MO.getGlobal()); bool isLazy = gvNeedsLazyPtr(MO.getGlobal()); |