summaryrefslogtreecommitdiffstats
path: root/contrib/llvm/lib/Support/TargetRegistry.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/llvm/lib/Support/TargetRegistry.cpp')
-rw-r--r--contrib/llvm/lib/Support/TargetRegistry.cpp53
1 files changed, 23 insertions, 30 deletions
diff --git a/contrib/llvm/lib/Support/TargetRegistry.cpp b/contrib/llvm/lib/Support/TargetRegistry.cpp
index f691883..eefef8a 100644
--- a/contrib/llvm/lib/Support/TargetRegistry.cpp
+++ b/contrib/llvm/lib/Support/TargetRegistry.cpp
@@ -10,7 +10,6 @@
#include "llvm/Support/TargetRegistry.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/StringRef.h"
-#include "llvm/Support/Host.h"
#include "llvm/Support/raw_ostream.h"
#include <cassert>
#include <vector>
@@ -19,8 +18,8 @@ using namespace llvm;
// Clients are responsible for avoid race conditions in registration.
static Target *FirstTarget = nullptr;
-TargetRegistry::iterator TargetRegistry::begin() {
- return iterator(FirstTarget);
+iterator_range<TargetRegistry::iterator> TargetRegistry::targets() {
+ return make_range(iterator(FirstTarget), iterator());
}
const Target *TargetRegistry::lookupTarget(const std::string &ArchName,
@@ -31,19 +30,17 @@ const Target *TargetRegistry::lookupTarget(const std::string &ArchName,
// name, because it might be a backend that has no mapping to a target triple.
const Target *TheTarget = nullptr;
if (!ArchName.empty()) {
- for (TargetRegistry::iterator it = TargetRegistry::begin(),
- ie = TargetRegistry::end(); it != ie; ++it) {
- if (ArchName == it->getName()) {
- TheTarget = &*it;
- break;
- }
- }
+ auto I =
+ std::find_if(targets().begin(), targets().end(),
+ [&](const Target &T) { return ArchName == T.getName(); });
- if (!TheTarget) {
+ if (I == targets().end()) {
Error = "error: invalid target '" + ArchName + "'.\n";
return nullptr;
}
+ TheTarget = &*I;
+
// Adjust the triple to match (if known), otherwise stick with the
// given triple.
Triple::ArchType Type = Triple::getArchTypeForLLVMName(ArchName);
@@ -67,30 +64,28 @@ const Target *TargetRegistry::lookupTarget(const std::string &ArchName,
const Target *TargetRegistry::lookupTarget(const std::string &TT,
std::string &Error) {
// Provide special warning when no targets are initialized.
- if (begin() == end()) {
+ if (targets().begin() == targets().end()) {
Error = "Unable to find target for this triple (no targets are registered)";
return nullptr;
}
- const Target *Matching = nullptr;
- Triple::ArchType Arch = Triple(TT).getArch();
- for (iterator it = begin(), ie = end(); it != ie; ++it) {
- if (it->ArchMatchFn(Arch)) {
- if (Matching) {
- Error = std::string("Cannot choose between targets \"") +
- Matching->Name + "\" and \"" + it->Name + "\"";
- return nullptr;
- }
- Matching = &*it;
- }
- }
+ Triple::ArchType Arch = Triple(TT).getArch();
+ auto ArchMatch = [&](const Target &T) { return T.ArchMatchFn(Arch); };
+ auto I = std::find_if(targets().begin(), targets().end(), ArchMatch);
- if (!Matching) {
+ if (I == targets().end()) {
Error = "No available targets are compatible with this triple, "
"see -version for the available targets.";
return nullptr;
}
- return Matching;
+ auto J = std::find_if(std::next(I), targets().end(), ArchMatch);
+ if (J != targets().end()) {
+ Error = std::string("Cannot choose between targets \"") + I->Name +
+ "\" and \"" + J->Name + "\"";
+ return nullptr;
+ }
+
+ return &*I;
}
void TargetRegistry::RegisterTarget(Target &T,
@@ -124,10 +119,8 @@ static int TargetArraySortFn(const std::pair<StringRef, const Target *> *LHS,
void TargetRegistry::printRegisteredTargetsForVersion() {
std::vector<std::pair<StringRef, const Target*> > Targets;
size_t Width = 0;
- for (TargetRegistry::iterator I = TargetRegistry::begin(),
- E = TargetRegistry::end();
- I != E; ++I) {
- Targets.push_back(std::make_pair(I->getName(), &*I));
+ for (const auto &T : TargetRegistry::targets()) {
+ Targets.push_back(std::make_pair(T.getName(), &T));
Width = std::max(Width, Targets.back().first.size());
}
array_pod_sort(Targets.begin(), Targets.end(), TargetArraySortFn);
OpenPOWER on IntegriCloud