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@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits