| Chris Lattner | 4d326fa | 2003-12-20 01:46:27 +0000 | [diff] [blame] | 1 | //===-- TargetSelect.cpp - Target Chooser Code ----------------------------===// | 
| Misha Brukman | f976c85 | 2005-04-21 22:55:34 +0000 | [diff] [blame] | 2 | // | 
| Chris Lattner | 4d326fa | 2003-12-20 01:46:27 +0000 | [diff] [blame] | 3 | //                     The LLVM Compiler Infrastructure | 
|  | 4 | // | 
| Chris Lattner | 4ee451d | 2007-12-29 20:36:04 +0000 | [diff] [blame] | 5 | // This file is distributed under the University of Illinois Open Source | 
|  | 6 | // License. See LICENSE.TXT for details. | 
| Misha Brukman | f976c85 | 2005-04-21 22:55:34 +0000 | [diff] [blame] | 7 | // | 
| Chris Lattner | 4d326fa | 2003-12-20 01:46:27 +0000 | [diff] [blame] | 8 | //===----------------------------------------------------------------------===// | 
|  | 9 | // | 
| Chris Lattner | beff74f | 2004-07-11 08:24:02 +0000 | [diff] [blame] | 10 | // This just asks the TargetMachineRegistry for the appropriate JIT to use, and | 
|  | 11 | // allows the user to specify a specific one on the commandline with -march=x. | 
| Chris Lattner | 4d326fa | 2003-12-20 01:46:27 +0000 | [diff] [blame] | 12 | // | 
|  | 13 | //===----------------------------------------------------------------------===// | 
|  | 14 |  | 
|  | 15 | #include "JIT.h" | 
|  | 16 | #include "llvm/Module.h" | 
|  | 17 | #include "llvm/ModuleProvider.h" | 
| Dan Gohman | ee335e3 | 2008-05-23 20:40:06 +0000 | [diff] [blame^] | 18 | #include "llvm/Support/Streams.h" | 
| Jim Laskey | b1e1180 | 2005-09-01 21:38:21 +0000 | [diff] [blame] | 19 | #include "llvm/Target/SubtargetFeature.h" | 
| Chris Lattner | 4d326fa | 2003-12-20 01:46:27 +0000 | [diff] [blame] | 20 | #include "llvm/Target/TargetMachine.h" | 
| Chris Lattner | d5e1d9d | 2004-07-11 04:02:06 +0000 | [diff] [blame] | 21 | #include "llvm/Target/TargetMachineRegistry.h" | 
| Chris Lattner | 4d326fa | 2003-12-20 01:46:27 +0000 | [diff] [blame] | 22 | using namespace llvm; | 
|  | 23 |  | 
| Gordon Henriksen | 4b2b940 | 2007-10-17 21:28:48 +0000 | [diff] [blame] | 24 | static cl::opt<const TargetMachineRegistry::entry*, false, | 
|  | 25 | TargetMachineRegistry::Parser> | 
| Chris Lattner | d5e1d9d | 2004-07-11 04:02:06 +0000 | [diff] [blame] | 26 | MArch("march", cl::desc("Architecture to generate assembly for:")); | 
| Chris Lattner | 4d326fa | 2003-12-20 01:46:27 +0000 | [diff] [blame] | 27 |  | 
| Jim Laskey | b1e1180 | 2005-09-01 21:38:21 +0000 | [diff] [blame] | 28 | static cl::opt<std::string> | 
|  | 29 | MCPU("mcpu", | 
| Chris Lattner | 667eeca | 2005-10-23 22:39:01 +0000 | [diff] [blame] | 30 | cl::desc("Target a specific cpu type (-mcpu=help for details)"), | 
| Jim Laskey | b1e1180 | 2005-09-01 21:38:21 +0000 | [diff] [blame] | 31 | cl::value_desc("cpu-name"), | 
|  | 32 | cl::init("")); | 
|  | 33 |  | 
|  | 34 | static cl::list<std::string> | 
|  | 35 | MAttrs("mattr", | 
|  | 36 | cl::CommaSeparated, | 
| Chris Lattner | 667eeca | 2005-10-23 22:39:01 +0000 | [diff] [blame] | 37 | cl::desc("Target specific attributes (-mattr=help for details)"), | 
|  | 38 | cl::value_desc("a1,+a2,-a3,...")); | 
| Jim Laskey | b1e1180 | 2005-09-01 21:38:21 +0000 | [diff] [blame] | 39 |  | 
| Chris Lattner | 34c9433 | 2007-12-06 01:34:04 +0000 | [diff] [blame] | 40 | /// createInternal - Create an return a new JIT compiler if there is one | 
|  | 41 | /// available for the current target.  Otherwise, return null. | 
| Chris Lattner | 4d326fa | 2003-12-20 01:46:27 +0000 | [diff] [blame] | 42 | /// | 
| Chris Lattner | 34c9433 | 2007-12-06 01:34:04 +0000 | [diff] [blame] | 43 | ExecutionEngine *JIT::createJIT(ModuleProvider *MP, std::string *ErrorStr, | 
|  | 44 | JITMemoryManager *JMM) { | 
| Gordon Henriksen | 4b2b940 | 2007-10-17 21:28:48 +0000 | [diff] [blame] | 45 | const TargetMachineRegistry::entry *TheArch = MArch; | 
| Chris Lattner | 108ec4b | 2007-04-20 22:57:20 +0000 | [diff] [blame] | 46 | if (TheArch == 0) { | 
| Chris Lattner | d5e1d9d | 2004-07-11 04:02:06 +0000 | [diff] [blame] | 47 | std::string Error; | 
| Chris Lattner | 108ec4b | 2007-04-20 22:57:20 +0000 | [diff] [blame] | 48 | TheArch = TargetMachineRegistry::getClosestTargetForJIT(Error); | 
|  | 49 | if (TheArch == 0) { | 
| Reid Spencer | d4c0e62 | 2007-03-03 18:19:18 +0000 | [diff] [blame] | 50 | if (ErrorStr) | 
|  | 51 | *ErrorStr = Error; | 
|  | 52 | return 0; | 
|  | 53 | } | 
| Chris Lattner | 108ec4b | 2007-04-20 22:57:20 +0000 | [diff] [blame] | 54 | } else if (TheArch->JITMatchQualityFn() == 0) { | 
| Bill Wendling | 832171c | 2006-12-07 20:04:42 +0000 | [diff] [blame] | 55 | cerr << "WARNING: This target JIT is not designed for the host you are" | 
|  | 56 | << " running.  If bad things happen, please choose a different " | 
|  | 57 | << "-march switch.\n"; | 
| Chris Lattner | 4d326fa | 2003-12-20 01:46:27 +0000 | [diff] [blame] | 58 | } | 
| Chris Lattner | 4d326fa | 2003-12-20 01:46:27 +0000 | [diff] [blame] | 59 |  | 
| Jim Laskey | b1e1180 | 2005-09-01 21:38:21 +0000 | [diff] [blame] | 60 | // Package up features to be passed to target/subtarget | 
|  | 61 | std::string FeaturesStr; | 
|  | 62 | if (MCPU.size() || MAttrs.size()) { | 
|  | 63 | SubtargetFeatures Features; | 
|  | 64 | Features.setCPU(MCPU); | 
|  | 65 | for (unsigned i = 0; i != MAttrs.size(); ++i) | 
|  | 66 | Features.AddFeature(MAttrs[i]); | 
|  | 67 | FeaturesStr = Features.getString(); | 
|  | 68 | } | 
|  | 69 |  | 
| Chris Lattner | 4d326fa | 2003-12-20 01:46:27 +0000 | [diff] [blame] | 70 | // Allocate a target... | 
| Chris Lattner | 108ec4b | 2007-04-20 22:57:20 +0000 | [diff] [blame] | 71 | TargetMachine *Target = TheArch->CtorFn(*MP->getModule(), FeaturesStr); | 
| Chris Lattner | 4d326fa | 2003-12-20 01:46:27 +0000 | [diff] [blame] | 72 | assert(Target && "Could not allocate target machine!"); | 
|  | 73 |  | 
|  | 74 | // If the target supports JIT code generation, return a new JIT now. | 
|  | 75 | if (TargetJITInfo *TJ = Target->getJITInfo()) | 
| Chris Lattner | 34c9433 | 2007-12-06 01:34:04 +0000 | [diff] [blame] | 76 | return new JIT(MP, *Target, *TJ, JMM); | 
| Reid Spencer | d4c0e62 | 2007-03-03 18:19:18 +0000 | [diff] [blame] | 77 |  | 
|  | 78 | if (ErrorStr) | 
|  | 79 | *ErrorStr = "target does not support JIT code generation"; | 
| Chris Lattner | 4d326fa | 2003-12-20 01:46:27 +0000 | [diff] [blame] | 80 | return 0; | 
|  | 81 | } |