Add registered target list to --version output.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@75889 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Daniel Dunbar 2009-07-16 02:06:09 +00:00
parent 494d663175
commit 603bea3274
3 changed files with 86 additions and 20 deletions

View File

@ -92,6 +92,12 @@ namespace llvm {
/// JIT.
unsigned getJITMatchQuality() const { return JITMatchQualityFn(); }
/// hasTargetMachine - Check if this target supports code generation.
bool hasTargetMachine() const { return TargetMachineCtorFn != 0; }
/// hasAsmPrinter - Check if this target supports .s printing.
bool hasAsmPrinter() const { return AsmPrinterCtorFn != 0; }
/// createTargetMachine - Create a target specific machine implementation.
TargetMachine *createTargetMachine(const Module &M,
const std::string &Features) const {
@ -114,9 +120,50 @@ namespace llvm {
//
// FIXME: Provide Target* iterator.
struct TargetRegistry {
class iterator {
const Target *Current;
explicit iterator(Target *T) : Current(T) {}
friend class TargetRegistry;
public:
iterator(const iterator &I) : Current(I.Current) {}
iterator() : Current(0) {}
bool operator==(const iterator &x) const {
return Current == x.Current;
}
bool operator!=(const iterator &x) const {
return !operator==(x);
}
// Iterator traversal: forward iteration only
iterator &operator++() { // Preincrement
assert(Current && "Cannot increment end iterator!");
Current = Current->Next;
return *this;
}
iterator operator++(int) { // Postincrement
iterator tmp = *this;
++*this;
return tmp;
}
const Target &operator*() const {
assert(Current && "Cannot dereference end iterator!");
return *Current;
}
const Target *operator->() const {
return &operator*();
}
};
/// @name Registry Access
/// @{
static iterator begin();
static iterator end() { return iterator(); }
/// getClosestStaticTargetForTriple - Given a target triple, pick the most
/// capable target for that triple.
static const Target *getClosestStaticTargetForTriple(const std::string &TT,

View File

@ -23,6 +23,7 @@
#include "llvm/Support/MemoryBuffer.h"
#include "llvm/Support/ManagedStatic.h"
#include "llvm/Support/Streams.h"
#include "llvm/Target/TargetRegistry.h"
#include "llvm/System/Path.h"
#include <algorithm>
#include <functional>
@ -823,8 +824,8 @@ size_t alias::getOptionWidth() const {
// Print out the option for the alias.
void alias::printOptionInfo(size_t GlobalWidth) const {
size_t L = std::strlen(ArgStr);
cout << " -" << ArgStr << std::string(GlobalWidth-L-6, ' ') << " - "
<< HelpStr << "\n";
cerr << " -" << ArgStr << std::string(GlobalWidth-L-6, ' ') << " - "
<< HelpStr << "\n";
}
@ -1140,6 +1141,23 @@ public:
#endif
cout << ".\n";
cout << " Built " << __DATE__ << "(" << __TIME__ << ").\n";
cout << "\n";
cout << " Registered Targets:\n";
size_t Width = 0;
for (TargetRegistry::iterator it = TargetRegistry::begin(),
ie = TargetRegistry::end(); it != ie; ++it)
Width = std::max(Width, ::strlen(it->getName()));
unsigned NumTargets = 0;
for (TargetRegistry::iterator it = TargetRegistry::begin(),
ie = TargetRegistry::end(); it != ie; ++it, ++NumTargets) {
cout << " " << it->getName()
<< std::string(Width - ::strlen(it->getName()), ' ') << " - "
<< it->getShortDescription() << "\n";
}
if (!NumTargets)
cout << " (none)\n";
}
void operator=(bool OptionWasSpecified) {
if (OptionWasSpecified) {

View File

@ -14,20 +14,23 @@ using namespace llvm;
// Clients are responsible for avoid race conditions in registration.
static Target *FirstTarget = 0;
TargetRegistry::iterator TargetRegistry::begin() {
return iterator(FirstTarget);
}
const Target *
TargetRegistry::getClosestStaticTargetForTriple(const std::string &TT,
std::string &Error) {
Target *Best = 0, *EquallyBest = 0;
const Target *Best = 0, *EquallyBest = 0;
unsigned BestQuality = 0;
// FIXME: Use iterator.
for (Target *i = FirstTarget; i; i = i->Next) {
if (unsigned Qual = i->TripleMatchQualityFn(TT)) {
for (iterator it = begin(), ie = end(); it != ie; ++it) {
if (unsigned Qual = it->TripleMatchQualityFn(TT)) {
if (!Best || Qual > BestQuality) {
Best = i;
Best = &*it;
EquallyBest = 0;
BestQuality = Qual;
} else if (Qual == BestQuality)
EquallyBest = i;
EquallyBest = &*it;
}
}
@ -50,17 +53,16 @@ TargetRegistry::getClosestStaticTargetForTriple(const std::string &TT,
const Target *
TargetRegistry::getClosestStaticTargetForModule(const Module &M,
std::string &Error) {
Target *Best = 0, *EquallyBest = 0;
const Target *Best = 0, *EquallyBest = 0;
unsigned BestQuality = 0;
// FIXME: Use iterator.
for (Target *i = FirstTarget; i; i = i->Next) {
if (unsigned Qual = i->ModuleMatchQualityFn(M)) {
for (iterator it = begin(), ie = end(); it != ie; ++it) {
if (unsigned Qual = it->ModuleMatchQualityFn(M)) {
if (!Best || Qual > BestQuality) {
Best = i;
Best = &*it;
EquallyBest = 0;
BestQuality = Qual;
} else if (Qual == BestQuality)
EquallyBest = i;
EquallyBest = &*it;
}
}
@ -82,17 +84,16 @@ TargetRegistry::getClosestStaticTargetForModule(const Module &M,
const Target *
TargetRegistry::getClosestTargetForJIT(std::string &Error) {
Target *Best = 0, *EquallyBest = 0;
const Target *Best = 0, *EquallyBest = 0;
unsigned BestQuality = 0;
// FIXME: Use iterator.
for (Target *i = FirstTarget; i; i = i->Next) {
if (unsigned Qual = i->JITMatchQualityFn()) {
for (iterator it = begin(), ie = end(); it != ie; ++it) {
if (unsigned Qual = it->JITMatchQualityFn()) {
if (!Best || Qual > BestQuality) {
Best = i;
Best = &*it;
EquallyBest = 0;
BestQuality = Qual;
} else if (Qual == BestQuality)
EquallyBest = i;
EquallyBest = &*it;
}
}