@@ -63,20 +63,15 @@ class AllocaInst;
63
63
// / The base class for IR Change classes.
64
64
class IRChangeBase {
65
65
protected:
66
- Tracker & Parent;
66
+ friend class Tracker ; // For Parent.
67
67
68
68
public:
69
- IRChangeBase (Tracker &Parent);
70
69
// / This runs when changes get reverted.
71
- virtual void revert () = 0;
70
+ virtual void revert (Tracker &Tracker ) = 0;
72
71
// / This runs when changes get accepted.
73
72
virtual void accept () = 0;
74
73
virtual ~IRChangeBase () = default ;
75
74
#ifndef NDEBUG
76
- // / \Returns the index of this change by iterating over all changes in the
77
- // / tracker. This is only used for debugging.
78
- unsigned getIdx () const ;
79
- void dumpCommon (raw_ostream &OS) const { OS << getIdx () << " . " ; }
80
75
virtual void dump (raw_ostream &OS) const = 0;
81
76
LLVM_DUMP_METHOD virtual void dump () const = 0;
82
77
friend raw_ostream &operator <<(raw_ostream &OS, const IRChangeBase &C) {
@@ -92,15 +87,11 @@ class UseSet : public IRChangeBase {
92
87
Value *OrigV = nullptr ;
93
88
94
89
public:
95
- UseSet (const Use &U, Tracker &Tracker)
96
- : IRChangeBase(Tracker), U(U), OrigV(U.get()) {}
97
- void revert () final { U.set (OrigV); }
90
+ UseSet (const Use &U) : U(U), OrigV(U.get()) {}
91
+ void revert (Tracker &Tracker) final { U.set (OrigV); }
98
92
void accept () final {}
99
93
#ifndef NDEBUG
100
- void dump (raw_ostream &OS) const final {
101
- dumpCommon (OS);
102
- OS << " UseSet" ;
103
- }
94
+ void dump (raw_ostream &OS) const final { OS << " UseSet" ; }
104
95
LLVM_DUMP_METHOD void dump () const final ;
105
96
#endif
106
97
};
@@ -115,14 +106,11 @@ class PHISetIncoming : public IRChangeBase {
115
106
Value,
116
107
Block,
117
108
};
118
- PHISetIncoming (PHINode &PHI, unsigned Idx, What What, Tracker &Tracker );
119
- void revert () final ;
109
+ PHISetIncoming (PHINode &PHI, unsigned Idx, What What);
110
+ void revert (Tracker &Tracker ) final ;
120
111
void accept () final {}
121
112
#ifndef NDEBUG
122
- void dump (raw_ostream &OS) const final {
123
- dumpCommon (OS);
124
- OS << " PHISetIncoming" ;
125
- }
113
+ void dump (raw_ostream &OS) const final { OS << " PHISetIncoming" ; }
126
114
LLVM_DUMP_METHOD void dump () const final ;
127
115
#endif
128
116
};
@@ -134,14 +122,11 @@ class PHIRemoveIncoming : public IRChangeBase {
134
122
BasicBlock *RemovedBB;
135
123
136
124
public:
137
- PHIRemoveIncoming (PHINode &PHI, unsigned RemovedIdx, Tracker &Tracker );
138
- void revert () final ;
125
+ PHIRemoveIncoming (PHINode &PHI, unsigned RemovedIdx);
126
+ void revert (Tracker &Tracker ) final ;
139
127
void accept () final {}
140
128
#ifndef NDEBUG
141
- void dump (raw_ostream &OS) const final {
142
- dumpCommon (OS);
143
- OS << " PHISetIncoming" ;
144
- }
129
+ void dump (raw_ostream &OS) const final { OS << " PHISetIncoming" ; }
145
130
LLVM_DUMP_METHOD void dump () const final ;
146
131
#endif
147
132
};
@@ -151,14 +136,11 @@ class PHIAddIncoming : public IRChangeBase {
151
136
unsigned Idx;
152
137
153
138
public:
154
- PHIAddIncoming (PHINode &PHI, Tracker &Tracker );
155
- void revert () final ;
139
+ PHIAddIncoming (PHINode &PHI);
140
+ void revert (Tracker &Tracker ) final ;
156
141
void accept () final {}
157
142
#ifndef NDEBUG
158
- void dump (raw_ostream &OS) const final {
159
- dumpCommon (OS);
160
- OS << " PHISetIncoming" ;
161
- }
143
+ void dump (raw_ostream &OS) const final { OS << " PHISetIncoming" ; }
162
144
LLVM_DUMP_METHOD void dump () const final ;
163
145
#endif
164
146
};
@@ -169,17 +151,14 @@ class UseSwap : public IRChangeBase {
169
151
Use OtherUse;
170
152
171
153
public:
172
- UseSwap (const Use &ThisUse, const Use &OtherUse, Tracker &Tracker )
173
- : IRChangeBase(Tracker), ThisUse(ThisUse), OtherUse(OtherUse) {
154
+ UseSwap (const Use &ThisUse, const Use &OtherUse)
155
+ : ThisUse(ThisUse), OtherUse(OtherUse) {
174
156
assert (ThisUse.getUser () == OtherUse.getUser () && " Expected same user!" );
175
157
}
176
- void revert () final { ThisUse.swap (OtherUse); }
158
+ void revert (Tracker &Tracker ) final { ThisUse.swap (OtherUse); }
177
159
void accept () final {}
178
160
#ifndef NDEBUG
179
- void dump (raw_ostream &OS) const final {
180
- dumpCommon (OS);
181
- OS << " UseSwap" ;
182
- }
161
+ void dump (raw_ostream &OS) const final { OS << " UseSwap" ; }
183
162
LLVM_DUMP_METHOD void dump () const final ;
184
163
#endif
185
164
};
@@ -203,14 +182,11 @@ class EraseFromParent : public IRChangeBase {
203
182
std::unique_ptr<sandboxir::Value> ErasedIPtr;
204
183
205
184
public:
206
- EraseFromParent (std::unique_ptr<sandboxir::Value> &&IPtr, Tracker &Tracker );
207
- void revert () final ;
185
+ EraseFromParent (std::unique_ptr<sandboxir::Value> &&IPtr);
186
+ void revert (Tracker &Tracker ) final ;
208
187
void accept () final ;
209
188
#ifndef NDEBUG
210
- void dump (raw_ostream &OS) const final {
211
- dumpCommon (OS);
212
- OS << " EraseFromParent" ;
213
- }
189
+ void dump (raw_ostream &OS) const final { OS << " EraseFromParent" ; }
214
190
LLVM_DUMP_METHOD void dump () const final ;
215
191
friend raw_ostream &operator <<(raw_ostream &OS, const EraseFromParent &C) {
216
192
C.dump (OS);
@@ -226,15 +202,12 @@ class RemoveFromParent : public IRChangeBase {
226
202
PointerUnion<Instruction *, BasicBlock *> NextInstrOrBB;
227
203
228
204
public:
229
- RemoveFromParent (Instruction *RemovedI, Tracker &Tracker );
230
- void revert () final ;
205
+ RemoveFromParent (Instruction *RemovedI);
206
+ void revert (Tracker &Tracker ) final ;
231
207
void accept () final {};
232
208
Instruction *getInstruction () const { return RemovedI; }
233
209
#ifndef NDEBUG
234
- void dump (raw_ostream &OS) const final {
235
- dumpCommon (OS);
236
- OS << " RemoveFromParent" ;
237
- }
210
+ void dump (raw_ostream &OS) const final { OS << " RemoveFromParent" ; }
238
211
LLVM_DUMP_METHOD void dump () const final ;
239
212
#endif // NDEBUG
240
213
};
@@ -265,15 +238,11 @@ class GenericSetter final : public IRChangeBase {
265
238
SavedValT OrigVal;
266
239
267
240
public:
268
- GenericSetter (InstrT *I, Tracker &Tracker)
269
- : IRChangeBase(Tracker), I(I), OrigVal((I->*GetterFn)()) {}
270
- void revert () final { (I->*SetterFn)(OrigVal); }
241
+ GenericSetter (InstrT *I) : I(I), OrigVal((I->*GetterFn)()) {}
242
+ void revert (Tracker &Tracker) final { (I->*SetterFn)(OrigVal); }
271
243
void accept () final {}
272
244
#ifndef NDEBUG
273
- void dump (raw_ostream &OS) const final {
274
- dumpCommon (OS);
275
- OS << " GenericSetter" ;
276
- }
245
+ void dump (raw_ostream &OS) const final { OS << " GenericSetter" ; }
277
246
LLVM_DUMP_METHOD void dump () const final {
278
247
dump (dbgs ());
279
248
dbgs () << " \n " ;
@@ -287,14 +256,11 @@ class CallBrInstSetIndirectDest : public IRChangeBase {
287
256
BasicBlock *OrigIndirectDest;
288
257
289
258
public:
290
- CallBrInstSetIndirectDest (CallBrInst *CallBr, unsigned Idx, Tracker &Tracker );
291
- void revert () final ;
259
+ CallBrInstSetIndirectDest (CallBrInst *CallBr, unsigned Idx);
260
+ void revert (Tracker &Tracker ) final ;
292
261
void accept () final {}
293
262
#ifndef NDEBUG
294
- void dump (raw_ostream &OS) const final {
295
- dumpCommon (OS);
296
- OS << " CallBrInstSetIndirectDest" ;
297
- }
263
+ void dump (raw_ostream &OS) const final { OS << " CallBrInstSetIndirectDest" ; }
298
264
LLVM_DUMP_METHOD void dump () const final ;
299
265
#endif
300
266
};
@@ -307,14 +273,11 @@ class MoveInstr : public IRChangeBase {
307
273
PointerUnion<Instruction *, BasicBlock *> NextInstrOrBB;
308
274
309
275
public:
310
- MoveInstr (sandboxir::Instruction *I, Tracker &Tracker );
311
- void revert () final ;
276
+ MoveInstr (sandboxir::Instruction *I);
277
+ void revert (Tracker &Tracker ) final ;
312
278
void accept () final {}
313
279
#ifndef NDEBUG
314
- void dump (raw_ostream &OS) const final {
315
- dumpCommon (OS);
316
- OS << " MoveInstr" ;
317
- }
280
+ void dump (raw_ostream &OS) const final { OS << " MoveInstr" ; }
318
281
LLVM_DUMP_METHOD void dump () const final ;
319
282
#endif // NDEBUG
320
283
};
@@ -323,14 +286,11 @@ class InsertIntoBB final : public IRChangeBase {
323
286
Instruction *InsertedI = nullptr ;
324
287
325
288
public:
326
- InsertIntoBB (Instruction *InsertedI, Tracker &Tracker );
327
- void revert () final ;
289
+ InsertIntoBB (Instruction *InsertedI);
290
+ void revert (Tracker &Tracker ) final ;
328
291
void accept () final {}
329
292
#ifndef NDEBUG
330
- void dump (raw_ostream &OS) const final {
331
- dumpCommon (OS);
332
- OS << " InsertIntoBB" ;
333
- }
293
+ void dump (raw_ostream &OS) const final { OS << " InsertIntoBB" ; }
334
294
LLVM_DUMP_METHOD void dump () const final ;
335
295
#endif // NDEBUG
336
296
};
@@ -339,15 +299,11 @@ class CreateAndInsertInst final : public IRChangeBase {
339
299
Instruction *NewI = nullptr ;
340
300
341
301
public:
342
- CreateAndInsertInst (Instruction *NewI, Tracker &Tracker)
343
- : IRChangeBase(Tracker), NewI(NewI) {}
344
- void revert () final ;
302
+ CreateAndInsertInst (Instruction *NewI) : NewI(NewI) {}
303
+ void revert (Tracker &Tracker) final ;
345
304
void accept () final {}
346
305
#ifndef NDEBUG
347
- void dump (raw_ostream &OS) const final {
348
- dumpCommon (OS);
349
- OS << " CreateAndInsertInst" ;
350
- }
306
+ void dump (raw_ostream &OS) const final { OS << " CreateAndInsertInst" ; }
351
307
LLVM_DUMP_METHOD void dump () const final ;
352
308
#endif
353
309
};
@@ -364,9 +320,6 @@ class Tracker {
364
320
private:
365
321
// / The list of changes that are being tracked.
366
322
SmallVector<std::unique_ptr<IRChangeBase>> Changes;
367
- #ifndef NDEBUG
368
- friend unsigned IRChangeBase::getIdx () const ; // For accessing `Changes`.
369
- #endif
370
323
// / The current state of the tracker.
371
324
TrackerState State = TrackerState::Disabled;
372
325
Context &Ctx;
@@ -383,7 +336,29 @@ class Tracker {
383
336
Context &getContext () const { return Ctx; }
384
337
// / Record \p Change and take ownership. This is the main function used to
385
338
// / track Sandbox IR changes.
386
- void track (std::unique_ptr<IRChangeBase> &&Change);
339
+ void track (std::unique_ptr<IRChangeBase> &&Change) {
340
+ assert (State == TrackerState::Record && " The tracker should be tracking!" );
341
+ #ifndef NDEBUG
342
+ assert (!InMiddleOfCreatingChange &&
343
+ " We are in the middle of creating another change!" );
344
+ if (isTracking ())
345
+ InMiddleOfCreatingChange = true ;
346
+ #endif // NDEBUG
347
+ Changes.push_back (std::move (Change));
348
+
349
+ #ifndef NDEBUG
350
+ InMiddleOfCreatingChange = false ;
351
+ #endif
352
+ }
353
+ // / A convenience wrapper for `track()` that constructs and tracks the Change
354
+ // / object if tracking is enabled. \Returns true if tracking is enabled.
355
+ template <typename ChangeT, typename ... ArgsT>
356
+ bool emplaceIfTracking (ArgsT... Args) {
357
+ if (!isTracking ())
358
+ return false ;
359
+ track (std::make_unique<ChangeT>(Args...));
360
+ return true ;
361
+ }
387
362
// / \Returns true if the tracker is recording changes.
388
363
bool isTracking () const { return State == TrackerState::Record; }
389
364
// / \Returns the current state of the tracker.
0 commit comments