Fix PR4845: r77946 completely broke x86_64 Darwin (or any situation where the
authorEvan Cheng <evan.cheng@apple.com>
Wed, 2 Sep 2009 00:19:03 +0000 (00:19 +0000)
committerEvan Cheng <evan.cheng@apple.com>
Wed, 2 Sep 2009 00:19:03 +0000 (00:19 +0000)
desired triplet is a sub-target, e.g. thumbv7 vs. arm host). Reverting the
patch isn't quite right either since the previous behavior does not allow the
triplet to be overridden with -march.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@80742 91177308-0d34-0410-b5e6-96231b3b80d8

lib/ExecutionEngine/JIT/TargetSelect.cpp

index c2d5a1403e4f2a88555f0539e94637e77904108c..2c105416cc7082e544f687f0f2aec669597f75e3 100644 (file)
@@ -43,19 +43,41 @@ MAttrs("mattr",
 /// selectTarget - Pick a target either via -march or by guessing the native
 /// arch.  Add any CPU features specified via -mcpu or -mattr.
 TargetMachine *JIT::selectTarget(ModuleProvider *MP, std::string *ErrorStr) {
-  Triple TheTriple(sys::getHostTriple());
+  Module &Mod = *MP->getModule();
+
+  Triple TheTriple(Mod.getTargetTriple());
+  if (TheTriple.getTriple().empty())
+    TheTriple.setTriple(sys::getHostTriple());
 
   // Adjust the triple to match what the user requested.
-  if (!MArch.empty())
-    TheTriple.setArch(Triple::getArchTypeForLLVMName(MArch));
+  const Target *TheTarget = 0;
+  if (!MArch.empty()) {
+    for (TargetRegistry::iterator it = TargetRegistry::begin(),
+           ie = TargetRegistry::end(); it != ie; ++it) {
+      if (MArch == it->getName()) {
+        TheTarget = &*it;
+        break;
+      }
+    }
+
+    if (!TheTarget) {
+      errs() << "JIT: error: invalid target '" << MArch << "'.\n";
+      return 0;
+    }
 
-  std::string Error;
-  const Target *TheTarget =
-    TargetRegistry::lookupTarget(TheTriple.getTriple(), Error);
-  if (TheTarget == 0) {
-    if (ErrorStr)
-      *ErrorStr = Error;
-    return 0;
+    // Adjust the triple to match (if known), otherwise stick with the
+    // module/host triple.
+    Triple::ArchType Type = Triple::getArchTypeForLLVMName(MArch);
+    if (Type != Triple::UnknownArch)
+      TheTriple.setArch(Type);
+  } else {
+    std::string Error;
+    TheTarget = TargetRegistry::lookupTarget(TheTriple.getTriple(), Error);
+    if (TheTarget == 0) {
+      if (ErrorStr)
+        *ErrorStr = Error;
+      return 0;
+    }
   }
 
   if (!TheTarget->hasJIT()) {