@@ -37,6 +37,7 @@ class Value;
3737using ValueToValueMapTy = ValueMap<const Value *, WeakTrackingVH>;
3838using DbgRecordIterator = simple_ilist<DbgRecord>::iterator;
3939using MetadataSetTy = SmallPtrSet<const Metadata *, 16 >;
40+ using MetadataPredicate = std::function<bool (const Metadata *)>;
4041
4142// / This is a class that can be implemented by clients to remap types when
4243// / cloning constants and instructions.
@@ -138,8 +139,8 @@ inline RemapFlags operator|(RemapFlags LHS, RemapFlags RHS) {
138139// / alternate \a ValueToValueMapTy and \a ValueMaterializer and returns a ID to
139140// / pass into the schedule*() functions.
140141// /
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.
143144// /
144145// / TODO: lib/Linker really doesn't need the \a ValueHandle in the \a
145146// / ValueToValueMapTy. We should template \a ValueMapper (and its
@@ -158,7 +159,7 @@ class ValueMapper {
158159 ValueMapper (ValueToValueMapTy &VM, RemapFlags Flags = RF_None,
159160 ValueMapTypeRemapper *TypeMapper = nullptr ,
160161 ValueMaterializer *Materializer = nullptr ,
161- const MetadataSetTy *IdentityMD = nullptr );
162+ const MetadataPredicate *IdentityMD = nullptr );
162163 ValueMapper (ValueMapper &&) = delete ;
163164 ValueMapper (const ValueMapper &) = delete ;
164165 ValueMapper &operator =(ValueMapper &&) = delete ;
@@ -225,7 +226,7 @@ inline Value *MapValue(const Value *V, ValueToValueMapTy &VM,
225226 RemapFlags Flags = RF_None,
226227 ValueMapTypeRemapper *TypeMapper = nullptr ,
227228 ValueMaterializer *Materializer = nullptr ,
228- const MetadataSetTy *IdentityMD = nullptr ) {
229+ const MetadataPredicate *IdentityMD = nullptr ) {
229230 return ValueMapper (VM, Flags, TypeMapper, Materializer, IdentityMD)
230231 .mapValue (*V);
231232}
@@ -239,8 +240,8 @@ inline Value *MapValue(const Value *V, ValueToValueMapTy &VM,
239240// / \c MD.
240241// / 3. Else if \c MD is a \a ConstantAsMetadata, call \a MapValue() and
241242// / 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.
244245// / 5. Else, \c MD is an \a MDNode. These are remapped, along with their
245246// / transitive operands. Distinct nodes are duplicated or moved depending
246247// / on \a RF_MoveDistinctNodes. Uniqued nodes are remapped like constants.
@@ -251,7 +252,7 @@ inline Metadata *MapMetadata(const Metadata *MD, ValueToValueMapTy &VM,
251252 RemapFlags Flags = RF_None,
252253 ValueMapTypeRemapper *TypeMapper = nullptr ,
253254 ValueMaterializer *Materializer = nullptr ,
254- const MetadataSetTy *IdentityMD = nullptr ) {
255+ const MetadataPredicate *IdentityMD = nullptr ) {
255256 return ValueMapper (VM, Flags, TypeMapper, Materializer, IdentityMD)
256257 .mapMetadata (*MD);
257258}
@@ -261,7 +262,7 @@ inline MDNode *MapMetadata(const MDNode *MD, ValueToValueMapTy &VM,
261262 RemapFlags Flags = RF_None,
262263 ValueMapTypeRemapper *TypeMapper = nullptr ,
263264 ValueMaterializer *Materializer = nullptr ,
264- const MetadataSetTy *IdentityMD = nullptr ) {
265+ const MetadataPredicate *IdentityMD = nullptr ) {
265266 return ValueMapper (VM, Flags, TypeMapper, Materializer, IdentityMD)
266267 .mapMDNode (*MD);
267268}
@@ -278,7 +279,7 @@ inline void RemapInstruction(Instruction *I, ValueToValueMapTy &VM,
278279 RemapFlags Flags = RF_None,
279280 ValueMapTypeRemapper *TypeMapper = nullptr ,
280281 ValueMaterializer *Materializer = nullptr ,
281- const MetadataSetTy *IdentityMD = nullptr ) {
282+ const MetadataPredicate *IdentityMD = nullptr ) {
282283 ValueMapper (VM, Flags, TypeMapper, Materializer, IdentityMD)
283284 .remapInstruction (*I);
284285}
@@ -289,7 +290,7 @@ inline void RemapDbgRecord(Module *M, DbgRecord *DR, ValueToValueMapTy &VM,
289290 RemapFlags Flags = RF_None,
290291 ValueMapTypeRemapper *TypeMapper = nullptr ,
291292 ValueMaterializer *Materializer = nullptr ,
292- const MetadataSetTy *IdentityMD = nullptr ) {
293+ const MetadataPredicate *IdentityMD = nullptr ) {
293294 ValueMapper (VM, Flags, TypeMapper, Materializer, IdentityMD)
294295 .remapDbgRecord (M, *DR);
295296}
@@ -302,7 +303,7 @@ inline void RemapDbgRecordRange(Module *M,
302303 RemapFlags Flags = RF_None,
303304 ValueMapTypeRemapper *TypeMapper = nullptr ,
304305 ValueMaterializer *Materializer = nullptr ,
305- const MetadataSetTy *IdentityMD = nullptr ) {
306+ const MetadataPredicate *IdentityMD = nullptr ) {
306307 ValueMapper (VM, Flags, TypeMapper, Materializer, IdentityMD)
307308 .remapDbgRecordRange (M, Range);
308309}
@@ -317,7 +318,7 @@ inline void RemapFunction(Function &F, ValueToValueMapTy &VM,
317318 RemapFlags Flags = RF_None,
318319 ValueMapTypeRemapper *TypeMapper = nullptr ,
319320 ValueMaterializer *Materializer = nullptr ,
320- const MetadataSetTy *IdentityMD = nullptr ) {
321+ const MetadataPredicate *IdentityMD = nullptr ) {
321322 ValueMapper (VM, Flags, TypeMapper, Materializer, IdentityMD).remapFunction (F);
322323}
323324
@@ -326,7 +327,7 @@ inline Constant *MapValue(const Constant *V, ValueToValueMapTy &VM,
326327 RemapFlags Flags = RF_None,
327328 ValueMapTypeRemapper *TypeMapper = nullptr ,
328329 ValueMaterializer *Materializer = nullptr ,
329- const MetadataSetTy *IdentityMD = nullptr ) {
330+ const MetadataPredicate *IdentityMD = nullptr ) {
330331 return ValueMapper (VM, Flags, TypeMapper, Materializer, IdentityMD)
331332 .mapConstant (*V);
332333}
0 commit comments