aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEvan Cheng <evan.cheng@apple.com>2009-09-02 00:19:03 +0000
committerEvan Cheng <evan.cheng@apple.com>2009-09-02 00:19:03 +0000
commit94f07d8137cf28b7e91f536682da027bf20613e1 (patch)
tree6f02184fd724e7854c33957cd124929bcf523503
parentd2a5cfe00db55e3dea99cd804179d30505edc537 (diff)
downloadexternal_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.cpp42
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()) {