//===----------------------------------------------------------------------===//
#include "llvm/Target/TargetRegistry.h"
+#include "llvm/System/Host.h"
#include <cassert>
using namespace llvm;
return iterator(FirstTarget);
}
-const Target *
-TargetRegistry::getClosestStaticTargetForTriple(const std::string &TT,
- std::string &Error) {
+const Target *TargetRegistry::lookupTarget(const std::string &TT,
+ std::string &Error) {
// Provide special warning when no targets are initialized.
if (begin() == end()) {
Error = "Unable to find target for this triple (no targets are registered)";
}
if (!Best) {
- Error = "No available targets are compatible with this triple";
+ Error = "No available targets are compatible with this triple, "
+ "see -version for the available targets.";
return 0;
}
return Best;
}
-const Target *
-TargetRegistry::getClosestStaticTargetForModule(const Module &M,
- std::string &Error) {
- // Provide special warning when no targets are initialized.
- if (begin() == end()) {
- Error = "Unable to find target for this module (no targets are registered)";
- return 0;
- }
-
- const Target *Best = 0, *EquallyBest = 0;
- unsigned BestQuality = 0;
- for (iterator it = begin(), ie = end(); it != ie; ++it) {
- if (unsigned Qual = it->ModuleMatchQualityFn(M)) {
- if (!Best || Qual > BestQuality) {
- Best = &*it;
- EquallyBest = 0;
- BestQuality = Qual;
- } else if (Qual == BestQuality)
- EquallyBest = &*it;
- }
- }
-
- if (!Best) {
- Error = "No available targets are compatible with this module";
- return 0;
- }
-
- // Otherwise, take the best target, but make sure we don't have two equally
- // good best targets.
- if (EquallyBest) {
- Error = std::string("Cannot choose between targets \"") +
- Best->Name + "\" and \"" + EquallyBest->Name + "\"";
- return 0;
- }
-
- return Best;
-}
-
-const Target *
-TargetRegistry::getClosestTargetForJIT(std::string &Error) {
- // Provide special warning when no targets are initialized.
- if (begin() == end()) {
- Error = "No JIT is available for this host (no targets are registered)";
- return 0;
- }
-
- const Target *Best = 0, *EquallyBest = 0;
- unsigned BestQuality = 0;
- for (iterator it = begin(), ie = end(); it != ie; ++it) {
- if (unsigned Qual = it->JITMatchQualityFn()) {
- if (!Best || Qual > BestQuality) {
- Best = &*it;
- EquallyBest = 0;
- BestQuality = Qual;
- } else if (Qual == BestQuality)
- EquallyBest = &*it;
- }
- }
-
- if (!Best) {
- Error = "No JIT is available for this host";
- return 0;
- }
-
- // Return the best, ignoring ties.
- return Best;
-}
-
void TargetRegistry::RegisterTarget(Target &T,
const char *Name,
const char *ShortDesc,
Target::TripleMatchQualityFnTy TQualityFn,
- Target::ModuleMatchQualityFnTy MQualityFn,
- Target::JITMatchQualityFnTy JITQualityFn) {
- assert(Name && ShortDesc && TQualityFn && MQualityFn && JITQualityFn &&
+ bool HasJIT) {
+ assert(Name && ShortDesc && TQualityFn &&
"Missing required target information!");
// Check if this target has already been initialized, we allow this as a
T.Name = Name;
T.ShortDesc = ShortDesc;
T.TripleMatchQualityFn = TQualityFn;
- T.ModuleMatchQualityFn = MQualityFn;
- T.JITMatchQualityFn = JITQualityFn;
+ T.HasJIT = HasJIT;
+}
+
+const Target *TargetRegistry::getClosestTargetForJIT(std::string &Error) {
+ const Target *TheTarget = lookupTarget(sys::getHostTriple(), Error);
+
+ if (TheTarget && !TheTarget->hasJIT()) {
+ Error = "No JIT compatible target available for this host";
+ return 0;
+ }
+
+ return TheTarget;
}