[llvm-commits] CVS: llvm/lib/Target/X86/X86Subtarget.cpp X86Subtarget.h X86TargetMachine.cpp

Evan Cheng evan.cheng at apple.com
Tue Dec 19 18:35:34 PST 2006


Anton, I am not sure if this patch is a good idea. It seems hacky to me.

Ideally GV's should not have DLLImpoerLinkage when compiling for JIT.  
But I understand that the frontend cannot make that distinction.

Perhaps you should set up different relocation type for static  
compilation / jit for Windows / Cygwin?

Evan

On Dec 19, 2006, at 5:03 PM, Anton Korobeynikov wrote:

>
>
> Changes in directory llvm/lib/Target/X86:
>
> X86Subtarget.cpp updated: 1.43 -> 1.44
> X86Subtarget.h updated: 1.22 -> 1.23
> X86TargetMachine.cpp updated: 1.131 -> 1.132
> ---
> Log message:
>
> Fixed dllimported symbols support during JIT'ing. JIT on mingw32
> platform should be more or less workable. At least, sim is running  
> fine
> under lli :)
>
>
> ---
> Diffs of the changes:  (+28 -7)
>
>  X86Subtarget.cpp     |   25 ++++++++++++++++++-------
>  X86Subtarget.h       |    7 +++++++
>  X86TargetMachine.cpp |    3 +++
>  3 files changed, 28 insertions(+), 7 deletions(-)
>
>
> Index: llvm/lib/Target/X86/X86Subtarget.cpp
> diff -u llvm/lib/Target/X86/X86Subtarget.cpp:1.43 llvm/lib/Target/ 
> X86/X86Subtarget.cpp:1.44
> --- llvm/lib/Target/X86/X86Subtarget.cpp:1.43	Thu Dec  7 16:21:48 2006
> +++ llvm/lib/Target/X86/X86Subtarget.cpp	Tue Dec 19 19:03:20 2006
> @@ -32,13 +32,14 @@
>  /// or index register of the address, not the GV offset field.
>  bool X86Subtarget::GVRequiresExtraLoad(const GlobalValue* GV, bool  
> isDirectCall) const
>  {
> -  if (isTargetDarwin()) {
> -    return (!isDirectCall &&
> -            (GV->hasWeakLinkage() || GV->hasLinkOnceLinkage() ||
> -             (GV->isExternal() && !GV->hasNotBeenReadFromBytecode 
> ())));
> -  } else if (isTargetCygwin() || isTargetWindows()) {
> -    return (GV->hasDLLImportLinkage());
> -  }
> +  if (GenerateExtraLoadsForGVs)
> +    if (isTargetDarwin()) {
> +      return (!isDirectCall &&
> +              (GV->hasWeakLinkage() || GV->hasLinkOnceLinkage() ||
> +               (GV->isExternal() && !GV->hasNotBeenReadFromBytecode 
> ())));
> +    } else if (isTargetCygwin() || isTargetWindows()) {
> +      return (GV->hasDLLImportLinkage());
> +    }
>
>    return false;
>  }
> @@ -206,6 +207,15 @@
>    }
>  }
>
> +/// SetJITMode - This is called to inform the subtarget info that  
> we are
> +/// producing code for the JIT.
> +void X86Subtarget::SetJITMode() {
> +  // JIT mode doesn't want extra loads for dllimported symbols, it  
> knows exactly
> +  // where everything is.
> +  if (isTargetCygwin())
> +    GenerateExtraLoadsForGVs = false;
> +}
> +
>  X86Subtarget::X86Subtarget(const Module &M, const std::string &FS,  
> bool is64Bit)
>    : AsmFlavor(AsmWriterFlavor)
>    , X86SSELevel(NoMMXSSE)
> @@ -214,6 +224,7 @@
>    // FIXME: this is a known good value for Yonah. How about others?
>    , MinRepStrSizeThreshold(128)
>    , Is64Bit(is64Bit)
> +  , GenerateExtraLoadsForGVs(true)
>    , TargetType(isELF) { // Default to ELF unless otherwise specified.
>
>    // Determine default and user specified characteristics
>
>
> Index: llvm/lib/Target/X86/X86Subtarget.h
> diff -u llvm/lib/Target/X86/X86Subtarget.h:1.22 llvm/lib/Target/X86/ 
> X86Subtarget.h:1.23
> --- llvm/lib/Target/X86/X86Subtarget.h:1.22	Thu Nov 30 16:42:55 2006
> +++ llvm/lib/Target/X86/X86Subtarget.h	Tue Dec 19 19:03:20 2006
> @@ -61,6 +61,9 @@
>    /// pointer size is 64 bit.
>    bool Is64Bit;
>
> +  /// GenerateExtraLoadsForGVs - True if we should generate extra  
> loads for
> +  /// indirect symbols (e.g. dllimported symbols on windows).
> +  bool GenerateExtraLoadsForGVs;
>  public:
>    enum {
>      isELF, isCygwin, isDarwin, isWindows
> @@ -112,6 +115,10 @@
>    /// value of GV itself. This means that the GlobalAddress must  
> be in the base
>    /// or index register of the address, not the GV offset field.
>    bool GVRequiresExtraLoad(const GlobalValue* GV, bool  
> isDirectCall) const;
> +
> +  /// SetJITMode - This is called to inform the subtarget info  
> that we are
> +  /// producing code for the JIT.
> +  void SetJITMode();
>  };
>
>  namespace X86 {
>
>
> Index: llvm/lib/Target/X86/X86TargetMachine.cpp
> diff -u llvm/lib/Target/X86/X86TargetMachine.cpp:1.131 llvm/lib/ 
> Target/X86/X86TargetMachine.cpp:1.132
> --- llvm/lib/Target/X86/X86TargetMachine.cpp:1.131	Tue Dec 19  
> 13:40:09 2006
> +++ llvm/lib/Target/X86/X86TargetMachine.cpp	Tue Dec 19 19:03:20 2006
> @@ -166,6 +166,9 @@
>    // JIT cannot ensure globals are placed in the lower 4G of address.
>    if (Subtarget.is64Bit())
>      setCodeModel(CodeModel::Large);
> +
> +  // Inform the subtarget that we are in JIT mode.
> +  Subtarget.SetJITMode();
>
>    PM.add(createX86CodeEmitterPass(*this, MCE));
>    return false;
>
>
>
> _______________________________________________
> 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