1 //===-- TargetSelect.cpp - Target Chooser Code ----------------------------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This just asks the TargetRegistry for the appropriate JIT to use, and allows 11 // the user to specify a specific one on the commandline with -march=x. Clients 12 // should initialize targets prior to calling createJIT. 13 // 14 //===----------------------------------------------------------------------===// 15 16 #include "llvm/ExecutionEngine/ExecutionEngine.h" 17 #include "llvm/Module.h" 18 #include "llvm/ADT/Triple.h" 19 #include "llvm/MC/SubtargetFeature.h" 20 #include "llvm/Target/TargetMachine.h" 21 #include "llvm/Support/CommandLine.h" 22 #include "llvm/Support/Host.h" 23 #include "llvm/Support/TargetRegistry.h" 24 #include "llvm/Support/raw_ostream.h" 25 using namespace llvm; 26 27 /// selectTarget - Pick a target either via -march or by guessing the native 28 /// arch. Add any CPU features specified via -mcpu or -mattr. 29 TargetMachine *EngineBuilder::selectTarget(Module *Mod, 30 StringRef MArch, 31 StringRef MCPU, 32 const SmallVectorImpl<std::string>& MAttrs, 33 Reloc::Model RM, 34 CodeModel::Model CM, 35 std::string *ErrorStr) { 36 Triple TheTriple(Mod->getTargetTriple()); 37 if (TheTriple.getTriple().empty()) 38 TheTriple.setTriple(sys::getHostTriple()); 39 40 // Adjust the triple to match what the user requested. 41 const Target *TheTarget = 0; 42 if (!MArch.empty()) { 43 for (TargetRegistry::iterator it = TargetRegistry::begin(), 44 ie = TargetRegistry::end(); it != ie; ++it) { 45 if (MArch == it->getName()) { 46 TheTarget = &*it; 47 break; 48 } 49 } 50 51 if (!TheTarget) { 52 *ErrorStr = "No available targets are compatible with this -march, " 53 "see -version for the available targets.\n"; 54 return 0; 55 } 56 57 // Adjust the triple to match (if known), otherwise stick with the 58 // module/host triple. 59 Triple::ArchType Type = Triple::getArchTypeForLLVMName(MArch); 60 if (Type != Triple::UnknownArch) 61 TheTriple.setArch(Type); 62 } else { 63 std::string Error; 64 TheTarget = TargetRegistry::lookupTarget(TheTriple.getTriple(), Error); 65 if (TheTarget == 0) { 66 if (ErrorStr) 67 *ErrorStr = Error; 68 return 0; 69 } 70 } 71 72 if (!TheTarget->hasJIT()) { 73 errs() << "WARNING: This target JIT is not designed for the host you are" 74 << " running. If bad things happen, please choose a different " 75 << "-march switch.\n"; 76 } 77 78 // Package up features to be passed to target/subtarget 79 std::string FeaturesStr; 80 if (!MAttrs.empty()) { 81 SubtargetFeatures Features; 82 for (unsigned i = 0; i != MAttrs.size(); ++i) 83 Features.AddFeature(MAttrs[i]); 84 FeaturesStr = Features.getString(); 85 } 86 87 // Allocate a target... 88 TargetMachine *Target = TheTarget->createTargetMachine(TheTriple.getTriple(), 89 MCPU, FeaturesStr, 90 RM, CM); 91 assert(Target && "Could not allocate target machine!"); 92 return Target; 93 } 94