Correlate stubs with functions in JIT: when emitting a stub, the JIT tells the memory...
[oota-llvm.git] / lib / Target / X86 / X86Subtarget.cpp
index aff36a117a7510c374f88e78c0527bcf588369af..610bf1da432b2b16053368326fad2141b6783ba1 100644 (file)
@@ -26,6 +26,10 @@ AsmWriterFlavor("x86-asm-syntax", cl::init(X86Subtarget::Unset),
     clEnumValN(X86Subtarget::Intel, "intel", "  Emit Intel-style assembly"),
     clEnumValEnd));
 
+cl::opt<unsigned>
+StackAlignment("stack-alignment", cl::init(0),
+               cl::desc("Override default stack alignment"));
+
 
 /// True if accessing the GV requires an extra load. For Windows, dllimported
 /// symbols are indirect, loading the value at address GV rather then the
@@ -53,6 +57,20 @@ bool X86Subtarget::GVRequiresExtraLoad(const GlobalValue* GV,
   return false;
 }
 
+/// This function returns the name of a function which has an interface
+/// like the non-standard bzero function, if such a function exists on
+/// the current subtarget and it is considered prefereable over
+/// memset with zero passed as the second argument. Otherwise it
+/// returns null.
+const char *X86Subtarget::getBZeroEntry() const {
+
+  // Darwin 10 has a __bzero entry point for this purpose.
+  if (getDarwinVers() >= 10)
+    return "__bzero";
+
+  return 0;
+}
+
 /// GetCpuIDAndInfo - Execute the specified cpuid and return the 4 values in the
 /// specified arguments.  If we can't run cpuid on the host, return true.
 bool X86::GetCpuIDAndInfo(unsigned value, unsigned *rEAX, unsigned *rEBX,
@@ -223,6 +241,7 @@ X86Subtarget::X86Subtarget(const Module &M, const std::string &FS, bool is64Bit)
   : AsmFlavor(AsmWriterFlavor)
   , PICStyle(PICStyle::None)
   , X86SSELevel(NoMMXSSE)
+  , X863DNowLevel(NoThreeDNow)
   , HasX86_64(false)
   , DarwinVers(0)
   , stackAlignment(8)
@@ -274,7 +293,7 @@ X86Subtarget::X86Subtarget(const Module &M, const std::string &FS, bool is64Bit)
   } else if (TT.empty()) {
 #if defined(__CYGWIN__)
     TargetType = isCygwin;
-#elif defined(__MINGW32__)
+#elif defined(__MINGW32__) || defined(__MINGW64__)
     TargetType = isMingw;
 #elif defined(__APPLE__)
     TargetType = isDarwin;
@@ -284,7 +303,7 @@ X86Subtarget::X86Subtarget(const Module &M, const std::string &FS, bool is64Bit)
     DarwinVers = 8;  // Minimum supported darwin is Tiger.
 #endif
     
-#elif defined(_WIN32)
+#elif defined(_WIN32) || defined(_WIN64)
     TargetType = isWindows;
 #endif
   }
@@ -299,6 +318,10 @@ X86Subtarget::X86Subtarget(const Module &M, const std::string &FS, bool is64Bit)
   if (TargetType == isDarwin ||
       TargetType == isCygwin ||
       TargetType == isMingw  ||
+      TargetType == isWindows ||
       (TargetType == isELF && Is64Bit))
     stackAlignment = 16;
+
+  if (StackAlignment)
+    stackAlignment = StackAlignment;
 }