From 603bea32743dc9914a1d32ae36fc64fe497af801 Mon Sep 17 00:00:00 2001 From: Daniel Dunbar Date: Thu, 16 Jul 2009 02:06:09 +0000 Subject: [PATCH] Add registered target list to --version output. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@75889 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Target/TargetRegistry.h | 47 ++++++++++++++++++++++++++++++++++++ lib/Support/CommandLine.cpp | 22 +++++++++++++++-- lib/Support/TargetRegistry.cpp | 37 ++++++++++++++-------------- 3 files changed, 86 insertions(+), 20 deletions(-) diff --git a/include/llvm/Target/TargetRegistry.h b/include/llvm/Target/TargetRegistry.h index 95cf35c4558..02aff1ec857 100644 --- a/include/llvm/Target/TargetRegistry.h +++ b/include/llvm/Target/TargetRegistry.h @@ -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, diff --git a/lib/Support/CommandLine.cpp b/lib/Support/CommandLine.cpp index 34200f76073..ed1ed2d5a09 100644 --- a/lib/Support/CommandLine.cpp +++ b/lib/Support/CommandLine.cpp @@ -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 #include @@ -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) { diff --git a/lib/Support/TargetRegistry.cpp b/lib/Support/TargetRegistry.cpp index 77cf2dd72cf..bf631feb686 100644 --- a/lib/Support/TargetRegistry.cpp +++ b/lib/Support/TargetRegistry.cpp @@ -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; } } -- 2.11.0