Skip to content

Commit 658bd2d

Browse files
serge-sans-paille-qbbogner
authored andcommitted
Type safe version of MachinePassRegistry
Previous version used type erasure through a `void* (*)()` pointer, which triggered gcc warning and implied a lot of reinterpret_cast. This version should make it harder to hit ourselves in the foot. Differential revision: https://reviews.llvm.org/D54203 (cherry picked from commit 86f8b70f1b7c3f92266197d580f6d86414650997)
1 parent b05a11a commit 658bd2d

File tree

8 files changed

+91
-116
lines changed

8 files changed

+91
-116
lines changed

include/llvm/CodeGen/MachinePassRegistry.h

Lines changed: 58 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -23,71 +23,59 @@
2323

2424
namespace llvm {
2525

26-
typedef void *(*MachinePassCtor)();
27-
28-
2926
//===----------------------------------------------------------------------===//
3027
///
3128
/// MachinePassRegistryListener - Listener to adds and removals of nodes in
3229
/// registration list.
3330
///
3431
//===----------------------------------------------------------------------===//
35-
class MachinePassRegistryListener {
36-
virtual void anchor();
32+
template <class PassCtorTy> class MachinePassRegistryListener {
33+
virtual void anchor() {}
34+
3735
public:
3836
MachinePassRegistryListener() {}
3937
virtual ~MachinePassRegistryListener() {}
40-
virtual void NotifyAdd(const char *N, MachinePassCtor C, const char *D) = 0;
38+
virtual void NotifyAdd(const char *N, PassCtorTy C, const char *D) = 0;
4139
virtual void NotifyRemove(const char *N) = 0;
4240
};
4341

44-
4542
//===----------------------------------------------------------------------===//
4643
///
4744
/// MachinePassRegistryNode - Machine pass node stored in registration list.
4845
///
4946
//===----------------------------------------------------------------------===//
50-
class MachinePassRegistryNode {
51-
47+
template <typename PassCtorTy> class MachinePassRegistryNode {
5248
private:
5349

5450
MachinePassRegistryNode *Next; // Next function pass in list.
5551
const char *Name; // Name of function pass.
5652
const char *Description; // Description string.
57-
MachinePassCtor Ctor; // Function pass creator.
53+
PassCtorTy Ctor; // Pass creator.
5854

5955
public:
60-
61-
MachinePassRegistryNode(const char *N, const char *D, MachinePassCtor C)
62-
: Next(nullptr)
63-
, Name(N)
64-
, Description(D)
65-
, Ctor(C)
66-
{}
56+
MachinePassRegistryNode(const char *N, const char *D, PassCtorTy C)
57+
: Next(nullptr), Name(N), Description(D), Ctor(C) {}
6758

6859
// Accessors
6960
MachinePassRegistryNode *getNext() const { return Next; }
7061
MachinePassRegistryNode **getNextAddress() { return &Next; }
7162
const char *getName() const { return Name; }
7263
const char *getDescription() const { return Description; }
73-
MachinePassCtor getCtor() const { return Ctor; }
64+
PassCtorTy getCtor() const { return Ctor; }
7465
void setNext(MachinePassRegistryNode *N) { Next = N; }
75-
7666
};
7767

78-
7968
//===----------------------------------------------------------------------===//
8069
///
8170
/// MachinePassRegistry - Track the registration of machine passes.
8271
///
8372
//===----------------------------------------------------------------------===//
84-
class MachinePassRegistry {
85-
73+
template <typename PassCtorTy> class MachinePassRegistry {
8674
private:
87-
88-
MachinePassRegistryNode *List; // List of registry nodes.
89-
MachinePassCtor Default; // Default function pass creator.
90-
MachinePassRegistryListener* Listener;// Listener for list adds are removes.
75+
MachinePassRegistryNode<PassCtorTy> *List; // List of registry nodes.
76+
PassCtorTy Default; // Default function pass creator.
77+
MachinePassRegistryListener<PassCtorTy>
78+
*Listener; // Listener for list adds are removes.
9179

9280
public:
9381

@@ -96,32 +84,59 @@ class MachinePassRegistry {
9684

9785
// Accessors.
9886
//
99-
MachinePassRegistryNode *getList() { return List; }
100-
MachinePassCtor getDefault() { return Default; }
101-
void setDefault(MachinePassCtor C) { Default = C; }
102-
void setDefault(StringRef Name);
103-
void setListener(MachinePassRegistryListener *L) { Listener = L; }
87+
MachinePassRegistryNode<PassCtorTy> *getList() { return List; }
88+
PassCtorTy getDefault() { return Default; }
89+
void setDefault(PassCtorTy C) { Default = C; }
90+
/// setDefault - Set the default constructor by name.
91+
void setDefault(StringRef Name) {
92+
PassCtorTy Ctor = nullptr;
93+
for (MachinePassRegistryNode<PassCtorTy> *R = getList(); R;
94+
R = R->getNext()) {
95+
if (R->getName() == Name) {
96+
Ctor = R->getCtor();
97+
break;
98+
}
99+
}
100+
assert(Ctor && "Unregistered pass name");
101+
setDefault(Ctor);
102+
}
103+
void setListener(MachinePassRegistryListener<PassCtorTy> *L) { Listener = L; }
104104

105105
/// Add - Adds a function pass to the registration list.
106106
///
107-
void Add(MachinePassRegistryNode *Node);
107+
void Add(MachinePassRegistryNode<PassCtorTy> *Node) {
108+
Node->setNext(List);
109+
List = Node;
110+
if (Listener)
111+
Listener->NotifyAdd(Node->getName(), Node->getCtor(),
112+
Node->getDescription());
113+
}
108114

109115
/// Remove - Removes a function pass from the registration list.
110116
///
111-
void Remove(MachinePassRegistryNode *Node);
112-
117+
void Remove(MachinePassRegistryNode<PassCtorTy> *Node) {
118+
for (MachinePassRegistryNode<PassCtorTy> **I = &List; *I;
119+
I = (*I)->getNextAddress()) {
120+
if (*I == Node) {
121+
if (Listener)
122+
Listener->NotifyRemove(Node->getName());
123+
*I = (*I)->getNext();
124+
break;
125+
}
126+
}
127+
}
113128
};
114129

115-
116130
//===----------------------------------------------------------------------===//
117131
///
118132
/// RegisterPassParser class - Handle the addition of new machine passes.
119133
///
120-
// //
121-
///////////////////////////////////////////////////////////////////////////////
122-
template<class RegistryClass>
123-
class RegisterPassParser : public MachinePassRegistryListener,
124-
public cl::parser<typename RegistryClass::FunctionPassCtor> {
134+
//===----------------------------------------------------------------------===//
135+
template <class RegistryClass>
136+
class RegisterPassParser
137+
: public MachinePassRegistryListener<
138+
typename RegistryClass::FunctionPassCtor>,
139+
public cl::parser<typename RegistryClass::FunctionPassCtor> {
125140
public:
126141
RegisterPassParser(cl::Option &O)
127142
: cl::parser<typename RegistryClass::FunctionPassCtor>(O) {}
@@ -144,15 +159,15 @@ class RegisterPassParser : public MachinePassRegistryListener,
144159

145160
// Implement the MachinePassRegistryListener callbacks.
146161
//
147-
void NotifyAdd(const char *N, MachinePassCtor C, const char *D) override {
148-
this->addLiteralOption(N, (typename RegistryClass::FunctionPassCtor)C, D);
162+
void NotifyAdd(const char *N, typename RegistryClass::FunctionPassCtor C,
163+
const char *D) override {
164+
this->addLiteralOption(N, C, D);
149165
}
150166
void NotifyRemove(const char *N) override {
151167
this->removeLiteralOption(N);
152168
}
153169
};
154170

155-
156171
} // end namespace llvm
157172

158173
#endif

include/llvm/CodeGen/MachineScheduler.h

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -114,17 +114,19 @@ struct MachineSchedContext {
114114

115115
/// MachineSchedRegistry provides a selection of available machine instruction
116116
/// schedulers.
117-
class MachineSchedRegistry : public MachinePassRegistryNode {
117+
class MachineSchedRegistry
118+
: public MachinePassRegistryNode<
119+
ScheduleDAGInstrs *(*)(MachineSchedContext *)> {
118120
public:
119121
typedef ScheduleDAGInstrs *(*ScheduleDAGCtor)(MachineSchedContext *);
120122

121123
// RegisterPassParser requires a (misnamed) FunctionPassCtor type.
122124
typedef ScheduleDAGCtor FunctionPassCtor;
123125

124-
static MachinePassRegistry Registry;
126+
static MachinePassRegistry<ScheduleDAGCtor> Registry;
125127

126128
MachineSchedRegistry(const char *N, const char *D, ScheduleDAGCtor C)
127-
: MachinePassRegistryNode(N, D, (MachinePassCtor)C) {
129+
: MachinePassRegistryNode(N, D, C) {
128130
Registry.Add(this);
129131
}
130132
~MachineSchedRegistry() { Registry.Remove(this); }
@@ -137,7 +139,8 @@ class MachineSchedRegistry : public MachinePassRegistryNode {
137139
static MachineSchedRegistry *getList() {
138140
return (MachineSchedRegistry *)Registry.getList();
139141
}
140-
static void setListener(MachinePassRegistryListener *L) {
142+
143+
static void setListener(MachinePassRegistryListener<FunctionPassCtor> *L) {
141144
Registry.setListener(L);
142145
}
143146
};

include/llvm/CodeGen/RegAllocRegistry.h

Lines changed: 11 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -23,23 +23,19 @@ namespace llvm {
2323
///
2424
/// RegisterRegAlloc class - Track the registration of register allocators.
2525
///
26-
// //
27-
///////////////////////////////////////////////////////////////////////////////
28-
class RegisterRegAlloc : public MachinePassRegistryNode {
29-
26+
//===----------------------------------------------------------------------===//
27+
class RegisterRegAlloc : public MachinePassRegistryNode<FunctionPass *(*)()> {
3028
public:
3129

3230
typedef FunctionPass *(*FunctionPassCtor)();
3331

34-
static MachinePassRegistry Registry;
32+
static MachinePassRegistry<FunctionPassCtor> Registry;
3533

3634
RegisterRegAlloc(const char *N, const char *D, FunctionPassCtor C)
37-
: MachinePassRegistryNode(N, D, (MachinePassCtor)C)
38-
{
39-
Registry.Add(this);
35+
: MachinePassRegistryNode(N, D, C) {
36+
Registry.Add(this);
4037
}
4138
~RegisterRegAlloc() { Registry.Remove(this); }
42-
4339

4440
// Accessors.
4541
//
@@ -49,16 +45,14 @@ class RegisterRegAlloc : public MachinePassRegistryNode {
4945
static RegisterRegAlloc *getList() {
5046
return (RegisterRegAlloc *)Registry.getList();
5147
}
52-
static FunctionPassCtor getDefault() {
53-
return (FunctionPassCtor)Registry.getDefault();
54-
}
55-
static void setDefault(FunctionPassCtor C) {
56-
Registry.setDefault((MachinePassCtor)C);
57-
}
58-
static void setListener(MachinePassRegistryListener *L) {
48+
49+
static FunctionPassCtor getDefault() { return Registry.getDefault(); }
50+
51+
static void setDefault(FunctionPassCtor C) { Registry.setDefault(C); }
52+
53+
static void setListener(MachinePassRegistryListener<FunctionPassCtor> *L) {
5954
Registry.setListener(L);
6055
}
61-
6256
};
6357

6458
} // end namespace llvm

include/llvm/CodeGen/SchedulerRegistry.h

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -32,16 +32,19 @@ class ScheduleDAGSDNodes;
3232
class SelectionDAG;
3333
class MachineBasicBlock;
3434

35-
class RegisterScheduler : public MachinePassRegistryNode {
35+
class RegisterScheduler
36+
: public MachinePassRegistryNode<
37+
ScheduleDAGSDNodes *(*)(SelectionDAGISel *, CodeGenOpt::Level)> {
3638
public:
3739
typedef ScheduleDAGSDNodes *(*FunctionPassCtor)(SelectionDAGISel*,
3840
CodeGenOpt::Level);
3941

40-
static MachinePassRegistry Registry;
42+
static MachinePassRegistry<FunctionPassCtor> Registry;
4143

4244
RegisterScheduler(const char *N, const char *D, FunctionPassCtor C)
43-
: MachinePassRegistryNode(N, D, (MachinePassCtor)C)
44-
{ Registry.Add(this); }
45+
: MachinePassRegistryNode(N, D, C) {
46+
Registry.Add(this);
47+
}
4548
~RegisterScheduler() { Registry.Remove(this); }
4649

4750

@@ -53,13 +56,8 @@ class RegisterScheduler : public MachinePassRegistryNode {
5356
static RegisterScheduler *getList() {
5457
return (RegisterScheduler *)Registry.getList();
5558
}
56-
static FunctionPassCtor getDefault() {
57-
return (FunctionPassCtor)Registry.getDefault();
58-
}
59-
static void setDefault(FunctionPassCtor C) {
60-
Registry.setDefault((MachinePassCtor)C);
61-
}
62-
static void setListener(MachinePassRegistryListener *L) {
59+
60+
static void setListener(MachinePassRegistryListener<FunctionPassCtor> *L) {
6361
Registry.setListener(L);
6462
}
6563
};

lib/CodeGen/MachinePassRegistry.cpp

Lines changed: 0 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -15,41 +15,3 @@
1515
#include "llvm/CodeGen/MachinePassRegistry.h"
1616

1717
using namespace llvm;
18-
19-
void MachinePassRegistryListener::anchor() { }
20-
21-
/// setDefault - Set the default constructor by name.
22-
void MachinePassRegistry::setDefault(StringRef Name) {
23-
MachinePassCtor Ctor = nullptr;
24-
for(MachinePassRegistryNode *R = getList(); R; R = R->getNext()) {
25-
if (R->getName() == Name) {
26-
Ctor = R->getCtor();
27-
break;
28-
}
29-
}
30-
assert(Ctor && "Unregistered pass name");
31-
setDefault(Ctor);
32-
}
33-
34-
/// Add - Adds a function pass to the registration list.
35-
///
36-
void MachinePassRegistry::Add(MachinePassRegistryNode *Node) {
37-
Node->setNext(List);
38-
List = Node;
39-
if (Listener) Listener->NotifyAdd(Node->getName(),
40-
Node->getCtor(),
41-
Node->getDescription());
42-
}
43-
44-
45-
/// Remove - Removes a function pass from the registration list.
46-
///
47-
void MachinePassRegistry::Remove(MachinePassRegistryNode *Node) {
48-
for (MachinePassRegistryNode **I = &List; *I; I = (*I)->getNextAddress()) {
49-
if (*I == Node) {
50-
if (Listener) Listener->NotifyRemove(Node->getName());
51-
*I = (*I)->getNext();
52-
break;
53-
}
54-
}
55-
}

lib/CodeGen/MachineScheduler.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,8 @@ void PostMachineScheduler::getAnalysisUsage(AnalysisUsage &AU) const {
190190
MachineFunctionPass::getAnalysisUsage(AU);
191191
}
192192

193-
MachinePassRegistry MachineSchedRegistry::Registry;
193+
MachinePassRegistry<MachineSchedRegistry::ScheduleDAGCtor>
194+
MachineSchedRegistry::Registry;
194195

195196
/// A dummy default scheduler factory indicates whether the scheduler
196197
/// is overridden on the command line.

lib/CodeGen/Passes.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -648,7 +648,8 @@ bool TargetPassConfig::getOptimizeRegAlloc() const {
648648
}
649649

650650
/// RegisterRegAlloc's global Registry tracks allocator registration.
651-
MachinePassRegistry RegisterRegAlloc::Registry;
651+
MachinePassRegistry<RegisterRegAlloc::FunctionPassCtor>
652+
RegisterRegAlloc::Registry;
652653

653654
/// A dummy default pass factory indicates whether the register allocator is
654655
/// overridden on the command line.

lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,8 @@ static const bool ViewDAGCombine1 = false,
228228
/// RegisterScheduler class - Track the registration of instruction schedulers.
229229
///
230230
//===---------------------------------------------------------------------===//
231-
MachinePassRegistry RegisterScheduler::Registry;
231+
MachinePassRegistry<RegisterScheduler::FunctionPassCtor>
232+
RegisterScheduler::Registry;
232233

233234
//===---------------------------------------------------------------------===//
234235
///

0 commit comments

Comments
 (0)