@@ -37,6 +37,7 @@ class Value;
37
37
using ValueToValueMapTy = ValueMap<const Value *, WeakTrackingVH>;
38
38
using DbgRecordIterator = simple_ilist<DbgRecord>::iterator;
39
39
using MetadataSetTy = SmallPtrSet<const Metadata *, 16 >;
40
+ using MetadataPredicate = std::function<bool (const Metadata *)>;
40
41
41
42
// / This is a class that can be implemented by clients to remap types when
42
43
// / cloning constants and instructions.
@@ -138,8 +139,8 @@ inline RemapFlags operator|(RemapFlags LHS, RemapFlags RHS) {
138
139
// / alternate \a ValueToValueMapTy and \a ValueMaterializer and returns a ID to
139
140
// / pass into the schedule*() functions.
140
141
// /
141
- // / If an \a IdentityMD set is optionally provided, \a Metadata inside this set
142
- // / will be mapped onto itself in \a VM on first use.
142
+ // / If an \a IdentityMD predicate is optionally provided, \a Metadata for which
143
+ // / the predicate returns true will be mapped onto itself in \a VM on first use.
143
144
// /
144
145
// / TODO: lib/Linker really doesn't need the \a ValueHandle in the \a
145
146
// / ValueToValueMapTy. We should template \a ValueMapper (and its
@@ -158,7 +159,7 @@ class ValueMapper {
158
159
ValueMapper (ValueToValueMapTy &VM, RemapFlags Flags = RF_None,
159
160
ValueMapTypeRemapper *TypeMapper = nullptr ,
160
161
ValueMaterializer *Materializer = nullptr ,
161
- const MetadataSetTy *IdentityMD = nullptr );
162
+ const MetadataPredicate *IdentityMD = nullptr );
162
163
ValueMapper (ValueMapper &&) = delete ;
163
164
ValueMapper (const ValueMapper &) = delete ;
164
165
ValueMapper &operator =(ValueMapper &&) = delete ;
@@ -225,7 +226,7 @@ inline Value *MapValue(const Value *V, ValueToValueMapTy &VM,
225
226
RemapFlags Flags = RF_None,
226
227
ValueMapTypeRemapper *TypeMapper = nullptr ,
227
228
ValueMaterializer *Materializer = nullptr ,
228
- const MetadataSetTy *IdentityMD = nullptr ) {
229
+ const MetadataPredicate *IdentityMD = nullptr ) {
229
230
return ValueMapper (VM, Flags, TypeMapper, Materializer, IdentityMD)
230
231
.mapValue (*V);
231
232
}
@@ -239,8 +240,8 @@ inline Value *MapValue(const Value *V, ValueToValueMapTy &VM,
239
240
// / \c MD.
240
241
// / 3. Else if \c MD is a \a ConstantAsMetadata, call \a MapValue() and
241
242
// / re-wrap its return (returning nullptr on nullptr).
242
- // / 4. Else if \c MD is in \c IdentityMD then add an identity mapping for it
243
- // / and return it.
243
+ // / 4. Else if \c IdentityMD predicate returns true for \c MD then add an
244
+ // / identity mapping for it and return it.
244
245
// / 5. Else, \c MD is an \a MDNode. These are remapped, along with their
245
246
// / transitive operands. Distinct nodes are duplicated or moved depending
246
247
// / on \a RF_MoveDistinctNodes. Uniqued nodes are remapped like constants.
@@ -251,7 +252,7 @@ inline Metadata *MapMetadata(const Metadata *MD, ValueToValueMapTy &VM,
251
252
RemapFlags Flags = RF_None,
252
253
ValueMapTypeRemapper *TypeMapper = nullptr ,
253
254
ValueMaterializer *Materializer = nullptr ,
254
- const MetadataSetTy *IdentityMD = nullptr ) {
255
+ const MetadataPredicate *IdentityMD = nullptr ) {
255
256
return ValueMapper (VM, Flags, TypeMapper, Materializer, IdentityMD)
256
257
.mapMetadata (*MD);
257
258
}
@@ -261,7 +262,7 @@ inline MDNode *MapMetadata(const MDNode *MD, ValueToValueMapTy &VM,
261
262
RemapFlags Flags = RF_None,
262
263
ValueMapTypeRemapper *TypeMapper = nullptr ,
263
264
ValueMaterializer *Materializer = nullptr ,
264
- const MetadataSetTy *IdentityMD = nullptr ) {
265
+ const MetadataPredicate *IdentityMD = nullptr ) {
265
266
return ValueMapper (VM, Flags, TypeMapper, Materializer, IdentityMD)
266
267
.mapMDNode (*MD);
267
268
}
@@ -278,7 +279,7 @@ inline void RemapInstruction(Instruction *I, ValueToValueMapTy &VM,
278
279
RemapFlags Flags = RF_None,
279
280
ValueMapTypeRemapper *TypeMapper = nullptr ,
280
281
ValueMaterializer *Materializer = nullptr ,
281
- const MetadataSetTy *IdentityMD = nullptr ) {
282
+ const MetadataPredicate *IdentityMD = nullptr ) {
282
283
ValueMapper (VM, Flags, TypeMapper, Materializer, IdentityMD)
283
284
.remapInstruction (*I);
284
285
}
@@ -289,7 +290,7 @@ inline void RemapDbgRecord(Module *M, DbgRecord *DR, ValueToValueMapTy &VM,
289
290
RemapFlags Flags = RF_None,
290
291
ValueMapTypeRemapper *TypeMapper = nullptr ,
291
292
ValueMaterializer *Materializer = nullptr ,
292
- const MetadataSetTy *IdentityMD = nullptr ) {
293
+ const MetadataPredicate *IdentityMD = nullptr ) {
293
294
ValueMapper (VM, Flags, TypeMapper, Materializer, IdentityMD)
294
295
.remapDbgRecord (M, *DR);
295
296
}
@@ -302,7 +303,7 @@ inline void RemapDbgRecordRange(Module *M,
302
303
RemapFlags Flags = RF_None,
303
304
ValueMapTypeRemapper *TypeMapper = nullptr ,
304
305
ValueMaterializer *Materializer = nullptr ,
305
- const MetadataSetTy *IdentityMD = nullptr ) {
306
+ const MetadataPredicate *IdentityMD = nullptr ) {
306
307
ValueMapper (VM, Flags, TypeMapper, Materializer, IdentityMD)
307
308
.remapDbgRecordRange (M, Range);
308
309
}
@@ -317,7 +318,7 @@ inline void RemapFunction(Function &F, ValueToValueMapTy &VM,
317
318
RemapFlags Flags = RF_None,
318
319
ValueMapTypeRemapper *TypeMapper = nullptr ,
319
320
ValueMaterializer *Materializer = nullptr ,
320
- const MetadataSetTy *IdentityMD = nullptr ) {
321
+ const MetadataPredicate *IdentityMD = nullptr ) {
321
322
ValueMapper (VM, Flags, TypeMapper, Materializer, IdentityMD).remapFunction (F);
322
323
}
323
324
@@ -326,7 +327,7 @@ inline Constant *MapValue(const Constant *V, ValueToValueMapTy &VM,
326
327
RemapFlags Flags = RF_None,
327
328
ValueMapTypeRemapper *TypeMapper = nullptr ,
328
329
ValueMaterializer *Materializer = nullptr ,
329
- const MetadataSetTy *IdentityMD = nullptr ) {
330
+ const MetadataPredicate *IdentityMD = nullptr ) {
330
331
return ValueMapper (VM, Flags, TypeMapper, Materializer, IdentityMD)
331
332
.mapConstant (*V);
332
333
}
0 commit comments