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

Evan Cheng evan.cheng at apple.com
Tue Dec 19 21:46:59 PST 2006


Let me clarify. It's important for llc and lli to behave exactly the  
same up to the final code emission pass. With your patch, the two  
would behave differently and that means we can no longer use llc to  
reproduce jit codegen bug.

Evan
On Dec 19, 2006, at 6:35 PM, Evan Cheng wrote:

> 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
>
> _______________________________________________
> 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