Changes in directory llvm/lib/Target/X86:
X86ISelLowering.cpp updated: 1.306 -> 1.307 X86Subtarget.cpp updated: 1.45 -> 1.46 X86Subtarget.h updated: 1.23 -> 1.24 X86TargetMachine.cpp updated: 1.132 -> 1.133 --- Log message: Refactored JIT codegen for mingw32. Now we're using standart relocation type for distinguish JIT & non-JIT instead of "dirty" hacks :) --- Diffs of the changes: (+32 -44) X86ISelLowering.cpp | 46 +++++++++++++++++++++++++--------------------- X86Subtarget.cpp | 15 +++------------ X86Subtarget.h | 10 +++------- X86TargetMachine.cpp | 5 +---- 4 files changed, 32 insertions(+), 44 deletions(-) Index: llvm/lib/Target/X86/X86ISelLowering.cpp diff -u llvm/lib/Target/X86/X86ISelLowering.cpp:1.306 llvm/lib/Target/X86/X86ISelLowering.cpp:1.307 --- llvm/lib/Target/X86/X86ISelLowering.cpp:1.306 Thu Dec 14 15:55:39 2006 +++ llvm/lib/Target/X86/X86ISelLowering.cpp Fri Dec 22 16:29:05 2006 @@ -664,8 +664,10 @@ // If the callee is a GlobalAddress node (quite common, every direct call is) // turn it into a TargetGlobalAddress node so that legalize doesn't hack it. if (GlobalAddressSDNode *G = dyn_cast<GlobalAddressSDNode>(Callee)) { - // We should use extra load for direct calls to dllimported functions - if (!Subtarget->GVRequiresExtraLoad(G->getGlobal(), true)) + // We should use extra load for direct calls to dllimported functions in + // non-JIT mode. + if (!Subtarget->GVRequiresExtraLoad(G->getGlobal(), + getTargetMachine(), true)) Callee = DAG.getTargetGlobalAddress(G->getGlobal(), getPointerTy()); } else if (ExternalSymbolSDNode *S = dyn_cast<ExternalSymbolSDNode>(Callee)) Callee = DAG.getTargetExternalSymbol(S->getSymbol(), getPointerTy()); @@ -1201,8 +1203,10 @@ // If the callee is a GlobalAddress node (quite common, every direct call is) // turn it into a TargetGlobalAddress node so that legalize doesn't hack it. if (GlobalAddressSDNode *G = dyn_cast<GlobalAddressSDNode>(Callee)) { - // We should use extra load for direct calls to dllimported functions - if (!Subtarget->GVRequiresExtraLoad(G->getGlobal(), true)) + // We should use extra load for direct calls to dllimported functions in + // non-JIT mode. + if (!Subtarget->GVRequiresExtraLoad(G->getGlobal(), + getTargetMachine(), true)) Callee = DAG.getTargetGlobalAddress(G->getGlobal(), getPointerTy()); } else if (ExternalSymbolSDNode *S = dyn_cast<ExternalSymbolSDNode>(Callee)) Callee = DAG.getTargetExternalSymbol(S->getSymbol(), getPointerTy()); @@ -1698,8 +1702,10 @@ // If the callee is a GlobalAddress node (quite common, every direct call is) // turn it into a TargetGlobalAddress node so that legalize doesn't hack it. if (GlobalAddressSDNode *G = dyn_cast<GlobalAddressSDNode>(Callee)) { - // We should use extra load for direct calls to dllimported functions - if (!Subtarget->GVRequiresExtraLoad(G->getGlobal(), true)) + // We should use extra load for direct calls to dllimported functions in + // non-JIT mode. + if (!Subtarget->GVRequiresExtraLoad(G->getGlobal(), + getTargetMachine(), true)) Callee = DAG.getTargetGlobalAddress(G->getGlobal(), getPointerTy()); } else if (ExternalSymbolSDNode *S = dyn_cast<ExternalSymbolSDNode>(Callee)) Callee = DAG.getTargetExternalSymbol(S->getSymbol(), getPointerTy()); @@ -1996,8 +2002,10 @@ // If the callee is a GlobalAddress node (quite common, every direct call is) // turn it into a TargetGlobalAddress node so that legalize doesn't hack it. if (GlobalAddressSDNode *G = dyn_cast<GlobalAddressSDNode>(Callee)) { - // We should use extra load for direct calls to dllimported functions - if (!Subtarget->GVRequiresExtraLoad(G->getGlobal(), true)) + // We should use extra load for direct calls to dllimported functions in + // non-JIT mode. + if (!Subtarget->GVRequiresExtraLoad(G->getGlobal(), + getTargetMachine(), true)) Callee = DAG.getTargetGlobalAddress(G->getGlobal(), getPointerTy()); } else if (ExternalSymbolSDNode *S = dyn_cast<ExternalSymbolSDNode>(Callee)) Callee = DAG.getTargetExternalSymbol(S->getSymbol(), getPointerTy()); @@ -3868,17 +3876,14 @@ Result = DAG.getNode(ISD::ADD, getPointerTy(), DAG.getNode(X86ISD::GlobalBaseReg, getPointerTy()), Result); - - // For Darwin, external and weak symbols are indirect, so we want to load - // the value at address GV, not the 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. - if (getTargetMachine().getRelocationModel() != Reloc::Static && - Subtarget->GVRequiresExtraLoad(GV, false)) - Result = DAG.getLoad(getPointerTy(), DAG.getEntryNode(), Result, NULL, 0); - } else if (Subtarget->GVRequiresExtraLoad(GV, false)) { - Result = DAG.getLoad(getPointerTy(), DAG.getEntryNode(), Result, NULL, 0); } + + // For Darwin & Mingw32, external and weak symbols are indirect, so we want to + // load the value at address GV, not the 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. Platform check is inside GVRequiresExtraLoad() call + if (Subtarget->GVRequiresExtraLoad(GV, getTargetMachine(), false)) + Result = DAG.getLoad(getPointerTy(), DAG.getEntryNode(), Result, NULL, 0); return Result; } @@ -5010,9 +5015,8 @@ if (Subtarget->is64Bit() && getTargetMachine().getCodeModel() != CodeModel::Small) return false; - Reloc::Model RModel = getTargetMachine().getRelocationModel(); - return (RModel == Reloc::Static) || - !Subtarget->GVRequiresExtraLoad(GV, false); + + return (!Subtarget->GVRequiresExtraLoad(GV, getTargetMachine(), false)); } /// isShuffleMaskLegal - Targets can use this to indicate that they only Index: llvm/lib/Target/X86/X86Subtarget.cpp diff -u llvm/lib/Target/X86/X86Subtarget.cpp:1.45 llvm/lib/Target/X86/X86Subtarget.cpp:1.46 --- llvm/lib/Target/X86/X86Subtarget.cpp:1.45 Wed Dec 20 14:40:30 2006 +++ llvm/lib/Target/X86/X86Subtarget.cpp Fri Dec 22 16:29:05 2006 @@ -15,6 +15,7 @@ #include "X86GenSubtarget.inc" #include "llvm/Module.h" #include "llvm/Support/CommandLine.h" +#include "llvm/Target/TargetMachine.h" using namespace llvm; cl::opt<X86Subtarget::AsmWriterFlavorTy> @@ -31,9 +32,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 X86Subtarget::GVRequiresExtraLoad(const GlobalValue* GV, + const TargetMachine& TM, bool isDirectCall) const { - if (GenerateExtraLoadsForGVs) + if (TM.getRelocationModel() != Reloc::Static) if (isTargetDarwin()) { return (!isDirectCall && (GV->hasWeakLinkage() || GV->hasLinkOnceLinkage() || @@ -208,16 +210,6 @@ } } -/// 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) @@ -226,7 +218,6 @@ // 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.23 llvm/lib/Target/X86/X86Subtarget.h:1.24 --- llvm/lib/Target/X86/X86Subtarget.h:1.23 Tue Dec 19 19:03:20 2006 +++ llvm/lib/Target/X86/X86Subtarget.h Fri Dec 22 16:29:05 2006 @@ -21,6 +21,7 @@ namespace llvm { class Module; class GlobalValue; +class TargetMachine; class X86Subtarget : public TargetSubtarget { public: @@ -61,9 +62,6 @@ /// 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 @@ -114,11 +112,9 @@ /// symbols are indirect, loading the value at address GV rather then the /// 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; + bool GVRequiresExtraLoad(const GlobalValue* GV, const TargetMachine& TM, + 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.132 llvm/lib/Target/X86/X86TargetMachine.cpp:1.133 --- llvm/lib/Target/X86/X86TargetMachine.cpp:1.132 Tue Dec 19 19:03:20 2006 +++ llvm/lib/Target/X86/X86TargetMachine.cpp Fri Dec 22 16:29:05 2006 @@ -115,7 +115,7 @@ Subtarget.getStackAlignment(), Subtarget.is64Bit() ? -8 : -4), InstrInfo(*this), JITInfo(*this), TLInfo(*this) { if (getRelocationModel() == Reloc::Default) - if (Subtarget.isTargetDarwin()) + if (Subtarget.isTargetDarwin() || Subtarget.isTargetCygwin()) setRelocationModel(Reloc::DynamicNoPIC); else setRelocationModel(Reloc::Static); @@ -167,9 +167,6 @@ 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