File indexing completed on 2026-05-10 08:44:33
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013 #ifndef LLVM_SUPPORT_REGISTRY_H
0014 #define LLVM_SUPPORT_REGISTRY_H
0015
0016 #include "llvm/ADT/STLExtras.h"
0017 #include "llvm/ADT/StringRef.h"
0018 #include "llvm/ADT/iterator_range.h"
0019 #include "llvm/Support/Compiler.h"
0020 #include "llvm/Support/DynamicLibrary.h"
0021 #include <memory>
0022
0023 namespace llvm {
0024
0025
0026 template <typename T>
0027 class SimpleRegistryEntry {
0028 StringRef Name, Desc;
0029 std::unique_ptr<T> (*Ctor)();
0030
0031 public:
0032 SimpleRegistryEntry(StringRef N, StringRef D, std::unique_ptr<T> (*C)())
0033 : Name(N), Desc(D), Ctor(C) {}
0034
0035 StringRef getName() const { return Name; }
0036 StringRef getDesc() const { return Desc; }
0037 std::unique_ptr<T> instantiate() const { return Ctor(); }
0038 };
0039
0040
0041
0042
0043 template <typename T>
0044 class Registry {
0045 public:
0046 typedef T type;
0047 typedef SimpleRegistryEntry<T> entry;
0048
0049 class node;
0050 class iterator;
0051
0052 private:
0053 Registry() = delete;
0054
0055 friend class node;
0056
0057
0058
0059
0060
0061 static node *Head;
0062 static node *Tail;
0063
0064 public:
0065
0066
0067 class node {
0068 friend class iterator;
0069 friend Registry<T>;
0070
0071 node *Next;
0072 const entry& Val;
0073
0074 public:
0075 node(const entry &V) : Next(nullptr), Val(V) {}
0076 };
0077
0078
0079
0080
0081
0082
0083
0084
0085 static void add_node(node *N) {
0086 if (Tail)
0087 Tail->Next = N;
0088 else
0089 Head = N;
0090 Tail = N;
0091 }
0092
0093
0094
0095 class iterator
0096 : public llvm::iterator_facade_base<iterator, std::forward_iterator_tag,
0097 const entry> {
0098 const node *Cur;
0099
0100 public:
0101 explicit iterator(const node *N) : Cur(N) {}
0102
0103 bool operator==(const iterator &That) const { return Cur == That.Cur; }
0104 iterator &operator++() { Cur = Cur->Next; return *this; }
0105 const entry &operator*() const { return Cur->Val; }
0106 };
0107
0108
0109
0110 static iterator begin() { return iterator(Head); }
0111 static iterator end() { return iterator(nullptr); }
0112
0113 static iterator_range<iterator> entries() {
0114 return make_range(begin(), end());
0115 }
0116
0117
0118
0119
0120
0121
0122
0123
0124
0125 template <typename V>
0126 class Add {
0127 entry Entry;
0128 node Node;
0129
0130 static std::unique_ptr<T> CtorFn() { return std::make_unique<V>(); }
0131
0132 public:
0133 Add(StringRef Name, StringRef Desc)
0134 : Entry(Name, Desc, CtorFn), Node(Entry) {
0135 add_node(&Node);
0136 }
0137 };
0138 };
0139
0140 }
0141
0142 #ifdef _WIN32
0143
0144 #define LLVM_INSTANTIATE_REGISTRY(REGISTRY_CLASS) \
0145 namespace llvm { \
0146 template <typename T> \
0147 typename Registry<T>::node *Registry<T>::Head = nullptr; \
0148 template <typename T> \
0149 typename Registry<T>::node *Registry<T>::Tail = nullptr; \
0150 template class LLVM_ABI_EXPORT Registry<REGISTRY_CLASS::type>; \
0151 }
0152 #else
0153 #define LLVM_INSTANTIATE_REGISTRY(REGISTRY_CLASS) \
0154 namespace llvm { \
0155 template <typename T> \
0156 typename Registry<T>::node *Registry<T>::Head = nullptr; \
0157 template <typename T> \
0158 typename Registry<T>::node *Registry<T>::Tail = nullptr; \
0159 template class Registry<REGISTRY_CLASS::type>; \
0160 }
0161 #endif
0162
0163 #endif