Split out the DwarfException class into its own file. No functionality change,
[llvm/msp430.git] / lib / Target / TargetMachineRegistry.cpp
blobc1a4777c63140304bbc2b412e877d967697e5b2f
1 //===-- TargetMachineRegistry.cpp - Target Auto Registration Impl ---------===//
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 file exposes the RegisterTarget class, which TargetMachine
11 // implementations should use to register themselves with the system. This file
12 // also exposes the TargetMachineRegistry class, which allows tools to inspect
13 // all of registered targets.
15 //===----------------------------------------------------------------------===//
17 #include "llvm/Target/TargetMachineRegistry.h"
18 #include <algorithm>
19 using namespace llvm;
21 /// getClosestStaticTargetForModule - Given an LLVM module, pick the best target
22 /// that is compatible with the module. If no close target can be found, this
23 /// returns null and sets the Error string to a reason.
24 const TargetMachineRegistry::entry *
25 TargetMachineRegistry::getClosestStaticTargetForModule(const Module &M,
26 std::string &Error) {
27 std::vector<std::pair<unsigned, const entry *> > UsableTargets;
28 for (Registry<TargetMachine>::iterator I = begin(), E = end(); I != E; ++I)
29 if (unsigned Qual = I->ModuleMatchQualityFn(M))
30 UsableTargets.push_back(std::make_pair(Qual, &*I));
32 if (UsableTargets.empty()) {
33 Error = "No available targets are compatible with this module";
34 return 0;
35 } else if (UsableTargets.size() == 1)
36 return UsableTargets.back().second;
38 // Otherwise, take the best target, but make sure we don't have two equally
39 // good best targets.
40 std::sort(UsableTargets.begin(), UsableTargets.end());
41 if (UsableTargets.back().first ==UsableTargets[UsableTargets.size()-2].first){
42 Error = "Cannot choose between targets \"" +
43 std::string(UsableTargets.back().second->Name) + "\" and \"" +
44 std::string(UsableTargets[UsableTargets.size()-2].second->Name) + "\"";
45 return 0;
47 return UsableTargets.back().second;
50 /// getClosestTargetForJIT - Pick the best target that is compatible with
51 /// the current host. If no close target can be found, this returns null
52 /// and sets the Error string to a reason.
53 const TargetMachineRegistry::entry *
54 TargetMachineRegistry::getClosestTargetForJIT(std::string &Error) {
55 std::vector<std::pair<unsigned, const entry *> > UsableTargets;
56 for (Registry<TargetMachine>::iterator I = begin(), E = end(); I != E; ++I)
57 if (unsigned Qual = I->JITMatchQualityFn())
58 UsableTargets.push_back(std::make_pair(Qual, &*I));
60 if (UsableTargets.empty()) {
61 Error = "No JIT is available for this host";
62 return 0;
63 } else if (UsableTargets.size() == 1)
64 return UsableTargets.back().second;
66 // Otherwise, take the best target. If there is a tie, just pick one.
67 unsigned MaxQual = UsableTargets.front().first;
68 const entry *MaxQualTarget = UsableTargets.front().second;
70 for (unsigned i = 1, e = UsableTargets.size(); i != e; ++i)
71 if (UsableTargets[i].first > MaxQual) {
72 MaxQual = UsableTargets[i].first;
73 MaxQualTarget = UsableTargets[i].second;
76 return MaxQualTarget;