Added preliminary x86 subtarget support.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@25645 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Target/X86/X86Subtarget.cpp b/lib/Target/X86/X86Subtarget.cpp
index 80f12b0..e523f14 100644
--- a/lib/Target/X86/X86Subtarget.cpp
+++ b/lib/Target/X86/X86Subtarget.cpp
@@ -13,11 +13,64 @@
 
 #include "X86Subtarget.h"
 #include "llvm/Module.h"
+#include "X86GenSubtarget.inc"
 using namespace llvm;
 
+#if defined(__APPLE__)
+#include <mach/mach.h>
+#include <mach/mach_host.h>
+#include <mach/host_info.h>
+#include <mach/machine.h>
+
+/// GetCurrentX86CPU - Returns the current CPUs features.
+static const char *GetCurrentX86CPU() {
+  host_basic_info_data_t hostInfo;
+  mach_msg_type_number_t infoCount;
+
+  infoCount = HOST_BASIC_INFO_COUNT;
+  host_info(mach_host_self(), HOST_BASIC_INFO, (host_info_t)&hostInfo, 
+            &infoCount);
+            
+  if (hostInfo.cpu_type != CPU_TYPE_I386) return "generic";
+
+  switch(hostInfo.cpu_subtype) {
+  case CPU_SUBTYPE_386:            return "i386";
+  case CPU_SUBTYPE_486:
+  case CPU_SUBTYPE_486SX:          return "i486";
+  case CPU_SUBTYPE_PENT:           return "pentium";
+  case CPU_SUBTYPE_PENTPRO:        return "pentiumpro";
+  case CPU_SUBTYPE_PENTII_M3:      return "pentium2";
+  case CPU_SUBTYPE_PENTII_M5:      return "pentium2";
+  case CPU_SUBTYPE_CELERON:
+  case CPU_SUBTYPE_CELERON_MOBILE: return "celeron";
+  case CPU_SUBTYPE_PENTIUM_3:      return "pentium3";
+  case CPU_SUBTYPE_PENTIUM_3_M:    return "pentium3m";
+  case CPU_SUBTYPE_PENTIUM_3_XEON: return "pentium3";   // FIXME: not sure.
+  case CPU_SUBTYPE_PENTIUM_M:      return "pentium-m";
+  case CPU_SUBTYPE_PENTIUM_4:      return "pentium4";
+  case CPU_SUBTYPE_PENTIUM_4_M:    return "pentium4m";
+  // FIXME: prescott, yonah? Check CPU_THREADTYPE_INTEL_HTT?
+  case CPU_SUBTYPE_XEON:
+  case CPU_SUBTYPE_XEON_MP:        return "nocona";
+  default: ;
+  }
+  
+  return "generic";
+}
+#endif
+
 X86Subtarget::X86Subtarget(const Module &M, const std::string &FS)
   : stackAlignment(8), indirectExternAndWeakGlobals(false) {
       
+  // Determine default and user specified characteristics
+  std::string CPU = "generic";
+#if defined(__APPLE__)
+  CPU = GetCurrentX86CPU();
+#endif
+
+  // Parse features string.
+  ParseSubtargetFeatures(FS, CPU);
+
   // Default to ELF unless otherwise specified.
   TargetType = isELF;