diff options
author | Evan Cheng <evan.cheng@apple.com> | 2008-01-02 23:38:59 +0000 |
---|---|---|
committer | Evan Cheng <evan.cheng@apple.com> | 2008-01-02 23:38:59 +0000 |
commit | 96334b4e3b41f55466fa29704627cce2c2d27892 (patch) | |
tree | 804e0a9b52be1c458a450d3a2631db676312a45b /llvm/lib | |
parent | 04cd35f88b1da1646b4e45f29fa285391286d849 (diff) | |
download | bcm5719-llvm-96334b4e3b41f55466fa29704627cce2c2d27892.tar.gz bcm5719-llvm-96334b4e3b41f55466fa29704627cce2c2d27892.zip |
X86 PIC JIT bug fix: relocations for constantpool and jumptable.
llvm-svn: 45515
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/Target/X86/X86CodeEmitter.cpp | 13 |
1 files changed, 6 insertions, 7 deletions
diff --git a/llvm/lib/Target/X86/X86CodeEmitter.cpp b/llvm/lib/Target/X86/X86CodeEmitter.cpp index 7e6fb2a62f4..8b8ea0cc7a4 100644 --- a/llvm/lib/Target/X86/X86CodeEmitter.cpp +++ b/llvm/lib/Target/X86/X86CodeEmitter.cpp @@ -246,13 +246,12 @@ void Emitter::emitDisplacementField(const MachineOperand *RelocOp, emitGlobalAddress(RelocOp->getGlobal(), rt, RelocOp->getOffset(), PCAdj, false, IsPIC); } else if (RelocOp->isConstantPoolIndex()) { - // Must be in 64-bit mode. - emitConstPoolAddress(RelocOp->getIndex(), X86::reloc_pcrel_word, + unsigned rt = Is64BitMode ? X86::reloc_pcrel_word : X86::reloc_picrel_word; + emitConstPoolAddress(RelocOp->getIndex(), rt, RelocOp->getOffset(), PCAdj, IsPIC); } else if (RelocOp->isJumpTableIndex()) { - // Must be in 64-bit mode. - emitJumpTableAddress(RelocOp->getIndex(), X86::reloc_pcrel_word, - PCAdj, IsPIC); + unsigned rt = Is64BitMode ? X86::reloc_pcrel_word : X86::reloc_picrel_word; + emitJumpTableAddress(RelocOp->getIndex(), rt, PCAdj, IsPIC); } else { assert(0 && "Unknown value to relocate!"); } @@ -269,14 +268,14 @@ void Emitter::emitMemModRMByte(const MachineInstr &MI, if (Op3.isGlobalAddress()) { DispForReloc = &Op3; } else if (Op3.isConstantPoolIndex()) { - if (Is64BitMode) { + if (Is64BitMode || IsPIC) { DispForReloc = &Op3; } else { DispVal += MCE.getConstantPoolEntryAddress(Op3.getIndex()); DispVal += Op3.getOffset(); } } else if (Op3.isJumpTableIndex()) { - if (Is64BitMode) { + if (Is64BitMode || IsPIC) { DispForReloc = &Op3; } else { DispVal += MCE.getJumpTableEntryAddress(Op3.getIndex()); |