summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Support
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2013-12-13 16:05:32 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2013-12-13 16:05:32 +0000
commitdfc1470d2d69541c010131018272ed6d19bd35d6 (patch)
tree55536778adb6cc3b843470f07d85ea7de7f6322b /llvm/lib/Support
parenta5877505d7f4bd0157a3cbbe12907157c3383c7d (diff)
downloadbcm5719-llvm-dfc1470d2d69541c010131018272ed6d19bd35d6.tar.gz
bcm5719-llvm-dfc1470d2d69541c010131018272ed6d19bd35d6.zip
Fix pr18235.
The cpp backend is not a reasonable fallback for a missing target. It is a very special backend, so it is reasonable to use it only if explicitly requested. While at it, simplify the interface a bit. llvm-svn: 197241
Diffstat (limited to 'llvm/lib/Support')
-rw-r--r--llvm/lib/Support/TargetRegistry.cpp36
1 files changed, 14 insertions, 22 deletions
diff --git a/llvm/lib/Support/TargetRegistry.cpp b/llvm/lib/Support/TargetRegistry.cpp
index 0c90c17fefb..8d91a53c226 100644
--- a/llvm/lib/Support/TargetRegistry.cpp
+++ b/llvm/lib/Support/TargetRegistry.cpp
@@ -71,42 +71,34 @@ const Target *TargetRegistry::lookupTarget(const std::string &TT,
Error = "Unable to find target for this triple (no targets are registered)";
return 0;
}
- const Target *Best = 0, *EquallyBest = 0;
- unsigned BestQuality = 0;
+ const Target *Matching = 0;
+ Triple::ArchType Arch = Triple(TT).getArch();
for (iterator it = begin(), ie = end(); it != ie; ++it) {
- if (unsigned Qual = it->TripleMatchQualityFn(TT)) {
- if (!Best || Qual > BestQuality) {
- Best = &*it;
- EquallyBest = 0;
- BestQuality = Qual;
- } else if (Qual == BestQuality)
- EquallyBest = &*it;
+ if (it->ArchMatchFn(Arch)) {
+ if (Matching) {
+ Error = std::string("Cannot choose between targets \"") +
+ Matching->Name + "\" and \"" + it->Name + "\"";
+ return 0;
+ }
+ Matching = &*it;
}
}
- if (!Best) {
+ if (!Matching) {
Error = "No available targets are compatible with this triple, "
"see -version for the available targets.";
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;
+ return Matching;
}
void TargetRegistry::RegisterTarget(Target &T,
const char *Name,
const char *ShortDesc,
- Target::TripleMatchQualityFnTy TQualityFn,
+ Target::ArchMatchFnTy ArchMatchFn,
bool HasJIT) {
- assert(Name && ShortDesc && TQualityFn &&
+ assert(Name && ShortDesc && ArchMatchFn &&
"Missing required target information!");
// Check if this target has already been initialized, we allow this as a
@@ -120,7 +112,7 @@ void TargetRegistry::RegisterTarget(Target &T,
T.Name = Name;
T.ShortDesc = ShortDesc;
- T.TripleMatchQualityFn = TQualityFn;
+ T.ArchMatchFn = ArchMatchFn;
T.HasJIT = HasJIT;
}
OpenPOWER on IntegriCloud