diff options
Diffstat (limited to 'lib/Target/X86/X86Subtarget.h')
-rw-r--r-- | lib/Target/X86/X86Subtarget.h | 28 |
1 files changed, 23 insertions, 5 deletions
diff --git a/lib/Target/X86/X86Subtarget.h b/lib/Target/X86/X86Subtarget.h index 423e2cb743..c52979711d 100644 --- a/lib/Target/X86/X86Subtarget.h +++ b/lib/Target/X86/X86Subtarget.h @@ -14,6 +14,7 @@ #ifndef X86SUBTARGET_H #define X86SUBTARGET_H +#include "llvm/GlobalValue.h" #include "llvm/Target/TargetSubtarget.h" #include <string> @@ -64,7 +65,7 @@ public: enum { isELF, isCygwin, isDarwin, isWindows } TargetType; - + /// This constructor initializes the data members to match that /// of the specified module. /// @@ -80,8 +81,8 @@ public: /// instruction. This is only used if the src / dst alignment is not DWORD /// aligned. unsigned getMinRepStrSizeThreshold() const { return MinRepStrSizeThreshold; } - - /// ParseSubtargetFeatures - Parses features string setting specified + + /// ParseSubtargetFeatures - Parses features string setting specified /// subtarget options. Definition of function is auto generated by tblgen. void ParseSubtargetFeatures(const std::string &FS, const std::string &CPU); @@ -97,14 +98,31 @@ public: bool hasSSE3() const { return X86SSELevel >= SSE3; } bool has3DNow() const { return X863DNowLevel >= ThreeDNow; } bool has3DNowA() const { return X863DNowLevel >= ThreeDNowA; } - + bool isFlavorAtt() const { return AsmFlavor == att; } bool isFlavorIntel() const { return AsmFlavor == intel; } bool isTargetDarwin() const { return TargetType == isDarwin; } bool isTargetELF() const { return TargetType == isELF; } bool isTargetWindows() const { return TargetType == isWindows; } - bool isTargetCygwin() const { return TargetType == isCygwin; } + bool isTargetCygwin() const { return TargetType == isCygwin; } + + /// True if accessing the GV requires an extra load. For Windows, dllimported + /// 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 + { + if (isTargetDarwin()) { + return (!isDirectCall && + (GV->hasWeakLinkage() || GV->hasLinkOnceLinkage() || + (GV->isExternal() && !GV->hasNotBeenReadFromBytecode()))); + } else if (isTargetCygwin() || isTargetWindows()) { + return (GV->hasDLLImportLinkage()); + } + + return false; + } }; namespace X86 { |