[llvm-commits] [llvm] r58066 - in /llvm/trunk: include/llvm/CodeGen/MachineCodeEmitter.h lib/Target/X86/X86CodeEmitter.cpp lib/Target/X86/X86Relocations.h
Chris Lattner
clattner at apple.com
Thu Oct 23 21:13:33 PDT 2008
On Oct 23, 2008, at 6:57 PM, Dan Gohman wrote:
> Author: djg
> Date: Thu Oct 23 20:57:54 2008
> New Revision: 58066
>
> URL: http://llvm.org/viewvc/llvm-project?rev=58066&view=rev
> Log:
> Fix constant-offset emission for x86-64 absolute addresses. This
> fixes a bunch of test-suite JIT failures on x86-64 in
> -relocation-model=static mode.
Hi Dan,
Does this potentially help with any of the linux/x86-64 jit
regressions that we're seeing in the 2.4 release branch?
-Chris
>
>
> Modified:
> llvm/trunk/include/llvm/CodeGen/MachineCodeEmitter.h
> llvm/trunk/lib/Target/X86/X86CodeEmitter.cpp
> llvm/trunk/lib/Target/X86/X86Relocations.h
>
> Modified: llvm/trunk/include/llvm/CodeGen/MachineCodeEmitter.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/MachineCodeEmitter.h?rev=58066&r1=58065&r2=58066&view=diff
>
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- llvm/trunk/include/llvm/CodeGen/MachineCodeEmitter.h (original)
> +++ llvm/trunk/include/llvm/CodeGen/MachineCodeEmitter.h Thu Oct 23
> 20:57:54 2008
> @@ -125,6 +125,42 @@
> }
> }
>
> + /// emitDWordLE - This callback is invoked when a 64-bit word
> needs to be
> + /// written to the output stream in little-endian format.
> + ///
> + void emitDWordLE(uint64_t W) {
> + if (CurBufferPtr+8 <= BufferEnd) {
> + *CurBufferPtr++ = (unsigned char)(W >> 0);
> + *CurBufferPtr++ = (unsigned char)(W >> 8);
> + *CurBufferPtr++ = (unsigned char)(W >> 16);
> + *CurBufferPtr++ = (unsigned char)(W >> 24);
> + *CurBufferPtr++ = (unsigned char)(W >> 32);
> + *CurBufferPtr++ = (unsigned char)(W >> 40);
> + *CurBufferPtr++ = (unsigned char)(W >> 48);
> + *CurBufferPtr++ = (unsigned char)(W >> 56);
> + } else {
> + CurBufferPtr = BufferEnd;
> + }
> + }
> +
> + /// emitDWordBE - This callback is invoked when a 64-bit word
> needs to be
> + /// written to the output stream in big-endian format.
> + ///
> + void emitDWordBE(uint64_t W) {
> + if (CurBufferPtr+8 <= BufferEnd) {
> + *CurBufferPtr++ = (unsigned char)(W >> 56);
> + *CurBufferPtr++ = (unsigned char)(W >> 48);
> + *CurBufferPtr++ = (unsigned char)(W >> 40);
> + *CurBufferPtr++ = (unsigned char)(W >> 32);
> + *CurBufferPtr++ = (unsigned char)(W >> 24);
> + *CurBufferPtr++ = (unsigned char)(W >> 16);
> + *CurBufferPtr++ = (unsigned char)(W >> 8);
> + *CurBufferPtr++ = (unsigned char)(W >> 0);
> + } else {
> + CurBufferPtr = BufferEnd;
> + }
> + }
> +
> /// emitAlignment - Move the CurBufferPtr pointer up the the
> specified
> /// alignment (saturated to BufferEnd of course).
> void emitAlignment(unsigned Alignment) {
>
> Modified: llvm/trunk/lib/Target/X86/X86CodeEmitter.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86CodeEmitter.cpp?rev=58066&r1=58065&r2=58066&view=diff
>
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- llvm/trunk/lib/Target/X86/X86CodeEmitter.cpp (original)
> +++ llvm/trunk/lib/Target/X86/X86CodeEmitter.cpp Thu Oct 23 20:57:54
> 2008
> @@ -72,10 +72,10 @@
> private:
> void emitPCRelativeBlockAddress(MachineBasicBlock *MBB);
> void emitGlobalAddress(GlobalValue *GV, unsigned Reloc,
> - int Disp = 0, intptr_t PCAdj = 0,
> + intptr_t Disp = 0, intptr_t PCAdj = 0,
> bool NeedStub = false, bool IsLazy =
> false);
> void emitExternalSymbolAddress(const char *ES, unsigned Reloc);
> - void emitConstPoolAddress(unsigned CPI, unsigned Reloc, int
> Disp = 0,
> + void emitConstPoolAddress(unsigned CPI, unsigned Reloc,
> intptr_t Disp = 0,
> intptr_t PCAdj = 0);
> void emitJumpTableAddress(unsigned JTI, unsigned Reloc,
> intptr_t PCAdj = 0);
> @@ -152,7 +152,8 @@
> /// this is part of a "take the address of a global" instruction.
> ///
> void Emitter::emitGlobalAddress(GlobalValue *GV, unsigned Reloc,
> - int Disp /* = 0 */, intptr_t PCAdj /
> * = 0 */,
> + intptr_t Disp /* = 0 */,
> + intptr_t PCAdj /* = 0 */,
> bool NeedStub /* = false */,
> bool isLazy /* = false */) {
> intptr_t RelocCST = 0;
> @@ -166,9 +167,11 @@
> : MachineRelocation::getGV(MCE.getCurrentPCOffset(), Reloc,
> GV, RelocCST, NeedStub);
> MCE.addRelocation(MR);
> + // The relocated value will be added to the displacement
> if (Reloc == X86::reloc_absolute_dword)
> - MCE.emitWordLE(0);
> - MCE.emitWordLE(Disp); // The relocated value will be added to the
> displacement
> + MCE.emitDWordLE(Disp);
> + else
> + MCE.emitWordLE((int32_t)Disp);
> }
>
> /// emitExternalSymbolAddress - Arrange for the address of an
> external symbol to
> @@ -179,15 +182,16 @@
>
> MCE
> .addRelocation(MachineRelocation::getExtSym(MCE.getCurrentPCOffset(),
> Reloc, ES,
> RelocCST));
> if (Reloc == X86::reloc_absolute_dword)
> + MCE.emitDWordLE(0);
> + else
> MCE.emitWordLE(0);
> - MCE.emitWordLE(0);
> }
>
> /// emitConstPoolAddress - Arrange for the address of an constant pool
> /// to be emitted to the current location in the function, and allow
> it to be PC
> /// relative.
> void Emitter::emitConstPoolAddress(unsigned CPI, unsigned Reloc,
> - int Disp /* = 0 */,
> + intptr_t Disp /* = 0 */,
> intptr_t PCAdj /* = 0 */) {
> intptr_t RelocCST = 0;
> if (Reloc == X86::reloc_picrel_word)
> @@ -196,9 +200,11 @@
> RelocCST = PCAdj;
>
> MCE
> .addRelocation
> (MachineRelocation::getConstPool(MCE.getCurrentPCOffset(),
> Reloc, CPI,
> RelocCST));
> + // The relocated value will be added to the displacement
> if (Reloc == X86::reloc_absolute_dword)
> - MCE.emitWordLE(0);
> - MCE.emitWordLE(Disp); // The relocated value will be added to the
> displacement
> + MCE.emitDWordLE(Disp);
> + else
> + MCE.emitWordLE((int32_t)Disp);
> }
>
> /// emitJumpTableAddress - Arrange for the address of a jump table to
> @@ -213,9 +219,11 @@
> RelocCST = PCAdj;
>
> MCE
> .addRelocation
> (MachineRelocation::getJumpTable(MCE.getCurrentPCOffset(),
> Reloc, JTI,
> RelocCST));
> + // The relocated value will be added to the displacement
> if (Reloc == X86::reloc_absolute_dword)
> + MCE.emitDWordLE(0);
> + else
> MCE.emitWordLE(0);
> - MCE.emitWordLE(0); // The relocated value will be added to the
> displacement
> }
>
> unsigned Emitter::getX86RegNum(unsigned RegNo) const {
> @@ -554,7 +562,7 @@
> TM.getSubtarget<X86Subtarget>().isTargetDarwin())) ||
> Opcode == X86::TAILJMPd;
> emitGlobalAddress(MO.getGlobal(), X86::reloc_pcrel_word,
> - 0, 0, NeedStub);
> + MO.getOffset(), 0, NeedStub);
> } else if (MO.isSymbol()) {
> emitExternalSymbolAddress(MO.getSymbolName(),
> X86::reloc_pcrel_word);
> } else if (MO.isImm()) {
>
> Modified: llvm/trunk/lib/Target/X86/X86Relocations.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86Relocations.h?rev=58066&r1=58065&r2=58066&view=diff
>
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- llvm/trunk/lib/Target/X86/X86Relocations.h (original)
> +++ llvm/trunk/lib/Target/X86/X86Relocations.h Thu Oct 23 20:57:54
> 2008
> @@ -18,6 +18,9 @@
>
> namespace llvm {
> namespace X86 {
> + /// RelocationType - An enum for the x86 relocation codes. Note
> that
> + /// the terminology here doesn't follow x86 convention - word
> means
> + /// 32-bit and dword means 64-bit.
> enum RelocationType {
> // reloc_pcrel_word - PC relative relocation, add the
> relocated value to
> // the value already in memory, after we adjust it for where
> the PC is.
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list