[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