diff options
author | Evan Cheng <evan.cheng@apple.com> | 2009-09-02 00:19:03 +0000 |
---|---|---|
committer | Evan Cheng <evan.cheng@apple.com> | 2009-09-02 00:19:03 +0000 |
commit | 94f07d8137cf28b7e91f536682da027bf20613e1 (patch) | |
tree | 6f02184fd724e7854c33957cd124929bcf523503 | |
parent | d2a5cfe00db55e3dea99cd804179d30505edc537 (diff) | |
download | external_llvm-94f07d8137cf28b7e91f536682da027bf20613e1.zip external_llvm-94f07d8137cf28b7e91f536682da027bf20613e1.tar.gz external_llvm-94f07d8137cf28b7e91f536682da027bf20613e1.tar.bz2 |
Fix PR4845: r77946 completely broke x86_64 Darwin (or any situation where the
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
-rw-r--r-- | lib/ExecutionEngine/JIT/TargetSelect.cpp | 42 |
1 files changed, 32 insertions, 10 deletions
diff --git a/lib/ExecutionEngine/JIT/TargetSelect.cpp b/lib/ExecutionEngine/JIT/TargetSelect.cpp index c2d5a14..2c10541 100644 --- a/lib/ExecutionEngine/JIT/TargetSelect.cpp +++ b/lib/ExecutionEngine/JIT/TargetSelect.cpp @@ -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()) { |