| //===- ValueMapper.h - Remapping for constants and metadata -----*- C++ -*-===// |
| // |
| // The LLVM Compiler Infrastructure |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // This file defines the MapValue interface which is used by various parts of |
| // the Transforms/Utils library to implement cloning and linking facilities. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef LLVM_TRANSFORMS_UTILS_VALUEMAPPER_H |
| #define LLVM_TRANSFORMS_UTILS_VALUEMAPPER_H |
| |
| #include "llvm/ADT/ValueMap.h" |
| |
| namespace llvm { |
| class Value; |
| class Instruction; |
| typedef ValueMap<const Value *, TrackingVH<Value> > ValueToValueMapTy; |
| |
| /// ValueMapTypeRemapper - This is a class that can be implemented by clients |
| /// to remap types when cloning constants and instructions. |
| class ValueMapTypeRemapper { |
| virtual void Anchor(); // Out of line method. |
| public: |
| virtual ~ValueMapTypeRemapper() {} |
| |
| /// remapType - The client should implement this method if they want to |
| /// remap types while mapping values. |
| virtual Type *remapType(Type *SrcTy) = 0; |
| }; |
| |
| /// RemapFlags - These are flags that the value mapping APIs allow. |
| enum RemapFlags { |
| RF_None = 0, |
| |
| /// RF_NoModuleLevelChanges - If this flag is set, the remapper knows that |
| /// only local values within a function (such as an instruction or argument) |
| /// are mapped, not global values like functions and global metadata. |
| RF_NoModuleLevelChanges = 1, |
| |
| /// RF_IgnoreMissingEntries - If this flag is set, the remapper ignores |
| /// entries that are not in the value map. If it is unset, it aborts if an |
| /// operand is asked to be remapped which doesn't exist in the mapping. |
| RF_IgnoreMissingEntries = 2 |
| }; |
| |
| static inline RemapFlags operator|(RemapFlags LHS, RemapFlags RHS) { |
| return RemapFlags(unsigned(LHS)|unsigned(RHS)); |
| } |
| |
| Value *MapValue(const Value *V, ValueToValueMapTy &VM, |
| RemapFlags Flags = RF_None, |
| ValueMapTypeRemapper *TypeMapper = 0); |
| |
| void RemapInstruction(Instruction *I, ValueToValueMapTy &VM, |
| RemapFlags Flags = RF_None, |
| ValueMapTypeRemapper *TypeMapper = 0); |
| |
| /// MapValue - provide versions that preserve type safety for MDNode and |
| /// Constants. |
| inline MDNode *MapValue(const MDNode *V, ValueToValueMapTy &VM, |
| RemapFlags Flags = RF_None, |
| ValueMapTypeRemapper *TypeMapper = 0) { |
| return cast<MDNode>(MapValue((const Value*)V, VM, Flags, TypeMapper)); |
| } |
| inline Constant *MapValue(const Constant *V, ValueToValueMapTy &VM, |
| RemapFlags Flags = RF_None, |
| ValueMapTypeRemapper *TypeMapper = 0) { |
| return cast<Constant>(MapValue((const Value*)V, VM, Flags, TypeMapper)); |
| } |
| |
| |
| } // End llvm namespace |
| |
| #endif |