blob: c1a4777c63140304bbc2b412e877d967697e5b2f [file] [log] [blame]
Chris Lattnerbf573372004-07-11 02:44:26 +00001//===-- TargetMachineRegistry.cpp - Target Auto Registration Impl ---------===//
Misha Brukmanf976c852005-04-21 22:55:34 +00002//
Chris Lattnerbf573372004-07-11 02:44:26 +00003// The LLVM Compiler Infrastructure
4//
Chris Lattner4ee451d2007-12-29 20:36:04 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Misha Brukmanf976c852005-04-21 22:55:34 +00007//
Chris Lattnerbf573372004-07-11 02:44:26 +00008//===----------------------------------------------------------------------===//
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.
14//
15//===----------------------------------------------------------------------===//
16
17#include "llvm/Target/TargetMachineRegistry.h"
Chris Lattnerd7099bc2004-07-11 04:00:19 +000018#include <algorithm>
Chris Lattnerbf573372004-07-11 02:44:26 +000019using namespace llvm;
20
Chris Lattnerd7099bc2004-07-11 04:00:19 +000021/// 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.
Gordon Henriksen4b2b9402007-10-17 21:28:48 +000024const TargetMachineRegistry::entry *
Chris Lattnerd7099bc2004-07-11 04:00:19 +000025TargetMachineRegistry::getClosestStaticTargetForModule(const Module &M,
26 std::string &Error) {
Gordon Henriksen4b2b9402007-10-17 21:28:48 +000027 std::vector<std::pair<unsigned, const entry *> > UsableTargets;
Gordon Henriksen38ffcc92007-10-18 11:53:05 +000028 for (Registry<TargetMachine>::iterator I = begin(), E = end(); I != E; ++I)
Gordon Henriksen4b2b9402007-10-17 21:28:48 +000029 if (unsigned Qual = I->ModuleMatchQualityFn(M))
30 UsableTargets.push_back(std::make_pair(Qual, &*I));
Chris Lattnerd7099bc2004-07-11 04:00:19 +000031
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;
Misha Brukmanf976c852005-04-21 22:55:34 +000037
Dan Gohman62bdec02008-07-22 00:52:04 +000038 // Otherwise, take the best target, but make sure we don't have two equally
Chris Lattnerd7099bc2004-07-11 04:00:19 +000039 // 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;
46 }
47 return UsableTargets.back().second;
48}
49
Dan Gohmanfb71d382007-07-30 14:58:59 +000050/// 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.
Gordon Henriksen4b2b9402007-10-17 21:28:48 +000053const TargetMachineRegistry::entry *
Chris Lattnerd7099bc2004-07-11 04:00:19 +000054TargetMachineRegistry::getClosestTargetForJIT(std::string &Error) {
Gordon Henriksen4b2b9402007-10-17 21:28:48 +000055 std::vector<std::pair<unsigned, const entry *> > UsableTargets;
Gordon Henriksen38ffcc92007-10-18 11:53:05 +000056 for (Registry<TargetMachine>::iterator I = begin(), E = end(); I != E; ++I)
Gordon Henriksen4b2b9402007-10-17 21:28:48 +000057 if (unsigned Qual = I->JITMatchQualityFn())
58 UsableTargets.push_back(std::make_pair(Qual, &*I));
Chris Lattnerd7099bc2004-07-11 04:00:19 +000059
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;
Misha Brukmanf976c852005-04-21 22:55:34 +000065
Chris Lattnerd7099bc2004-07-11 04:00:19 +000066 // Otherwise, take the best target. If there is a tie, just pick one.
67 unsigned MaxQual = UsableTargets.front().first;
Gordon Henriksen4b2b9402007-10-17 21:28:48 +000068 const entry *MaxQualTarget = UsableTargets.front().second;
Chris Lattnerd7099bc2004-07-11 04:00:19 +000069
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;
74 }
Misha Brukmanf976c852005-04-21 22:55:34 +000075
Chris Lattnerd7099bc2004-07-11 04:00:19 +000076 return MaxQualTarget;
77}
Misha Brukmanf976c852005-04-21 22:55:34 +000078