105ea54e8869a81b8dd846397175f218f97968907Dan Gohman//===- ValueMapper.h - Remapping for constants and metadata -----*- C++ -*-===//
218d083f0d1e3ee808c9890ccb3d54899baf4dc2aAnton Korobeynikov//
318d083f0d1e3ee808c9890ccb3d54899baf4dc2aAnton Korobeynikov//                     The LLVM Compiler Infrastructure
418d083f0d1e3ee808c9890ccb3d54899baf4dc2aAnton Korobeynikov//
57ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// This file is distributed under the University of Illinois Open Source
67ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// License. See LICENSE.TXT for details.
718d083f0d1e3ee808c9890ccb3d54899baf4dc2aAnton Korobeynikov//
818d083f0d1e3ee808c9890ccb3d54899baf4dc2aAnton Korobeynikov//===----------------------------------------------------------------------===//
918d083f0d1e3ee808c9890ccb3d54899baf4dc2aAnton Korobeynikov//
1018d083f0d1e3ee808c9890ccb3d54899baf4dc2aAnton Korobeynikov// This file defines the MapValue interface which is used by various parts of
1118d083f0d1e3ee808c9890ccb3d54899baf4dc2aAnton Korobeynikov// the Transforms/Utils library to implement cloning and linking facilities.
1218d083f0d1e3ee808c9890ccb3d54899baf4dc2aAnton Korobeynikov//
1318d083f0d1e3ee808c9890ccb3d54899baf4dc2aAnton Korobeynikov//===----------------------------------------------------------------------===//
1418d083f0d1e3ee808c9890ccb3d54899baf4dc2aAnton Korobeynikov
1505ea54e8869a81b8dd846397175f218f97968907Dan Gohman#ifndef LLVM_TRANSFORMS_UTILS_VALUEMAPPER_H
1605ea54e8869a81b8dd846397175f218f97968907Dan Gohman#define LLVM_TRANSFORMS_UTILS_VALUEMAPPER_H
1718d083f0d1e3ee808c9890ccb3d54899baf4dc2aAnton Korobeynikov
18e9916a302f1bacad234d7dafc1df3dc968a6ba0fDevang Patel#include "llvm/ADT/ValueMap.h"
1918d083f0d1e3ee808c9890ccb3d54899baf4dc2aAnton Korobeynikov
2018d083f0d1e3ee808c9890ccb3d54899baf4dc2aAnton Korobeynikovnamespace llvm {
2118d083f0d1e3ee808c9890ccb3d54899baf4dc2aAnton Korobeynikov  class Value;
2218d083f0d1e3ee808c9890ccb3d54899baf4dc2aAnton Korobeynikov  class Instruction;
23afff33001a4fd3049d97cb40eea459d5c87ae5ccChandler Carruth  typedef ValueMap<const Value *, WeakVH> ValueToValueMapTy;
2418d083f0d1e3ee808c9890ccb3d54899baf4dc2aAnton Korobeynikov
251afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner  /// ValueMapTypeRemapper - This is a class that can be implemented by clients
261afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner  /// to remap types when cloning constants and instructions.
271afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner  class ValueMapTypeRemapper {
281afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner    virtual void Anchor();  // Out of line method.
291afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner  public:
30ac7d2955422e4fb4f84ac7a1c4eaa216c7851713Chandler Carruth    virtual ~ValueMapTypeRemapper() {}
311afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner
321afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner    /// remapType - The client should implement this method if they want to
331afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner    /// remap types while mapping values.
341afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner    virtual Type *remapType(Type *SrcTy) = 0;
351afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner  };
361afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner
37b5fa5fcecc97168a72c9533c84cf297c018b957cChris Lattner  /// RemapFlags - These are flags that the value mapping APIs allow.
38b5fa5fcecc97168a72c9533c84cf297c018b957cChris Lattner  enum RemapFlags {
39b5fa5fcecc97168a72c9533c84cf297c018b957cChris Lattner    RF_None = 0,
40b5fa5fcecc97168a72c9533c84cf297c018b957cChris Lattner
41b5fa5fcecc97168a72c9533c84cf297c018b957cChris Lattner    /// RF_NoModuleLevelChanges - If this flag is set, the remapper knows that
42b5fa5fcecc97168a72c9533c84cf297c018b957cChris Lattner    /// only local values within a function (such as an instruction or argument)
43b5fa5fcecc97168a72c9533c84cf297c018b957cChris Lattner    /// are mapped, not global values like functions and global metadata.
44b5fa5fcecc97168a72c9533c84cf297c018b957cChris Lattner    RF_NoModuleLevelChanges = 1,
45b5fa5fcecc97168a72c9533c84cf297c018b957cChris Lattner
46b5fa5fcecc97168a72c9533c84cf297c018b957cChris Lattner    /// RF_IgnoreMissingEntries - If this flag is set, the remapper ignores
47b5fa5fcecc97168a72c9533c84cf297c018b957cChris Lattner    /// entries that are not in the value map.  If it is unset, it aborts if an
48b5fa5fcecc97168a72c9533c84cf297c018b957cChris Lattner    /// operand is asked to be remapped which doesn't exist in the mapping.
49b5fa5fcecc97168a72c9533c84cf297c018b957cChris Lattner    RF_IgnoreMissingEntries = 2
50b5fa5fcecc97168a72c9533c84cf297c018b957cChris Lattner  };
51b5fa5fcecc97168a72c9533c84cf297c018b957cChris Lattner
52b5fa5fcecc97168a72c9533c84cf297c018b957cChris Lattner  static inline RemapFlags operator|(RemapFlags LHS, RemapFlags RHS) {
53b5fa5fcecc97168a72c9533c84cf297c018b957cChris Lattner    return RemapFlags(unsigned(LHS)|unsigned(RHS));
54b5fa5fcecc97168a72c9533c84cf297c018b957cChris Lattner  }
55b5fa5fcecc97168a72c9533c84cf297c018b957cChris Lattner
566cb8c23db1c3becdce6dfbf1b7f1677faca4251eDan Gohman  Value *MapValue(const Value *V, ValueToValueMapTy &VM,
571afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner                  RemapFlags Flags = RF_None,
581afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner                  ValueMapTypeRemapper *TypeMapper = 0);
591afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner
606cb8c23db1c3becdce6dfbf1b7f1677faca4251eDan Gohman  void RemapInstruction(Instruction *I, ValueToValueMapTy &VM,
611afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner                        RemapFlags Flags = RF_None,
621afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner                        ValueMapTypeRemapper *TypeMapper = 0);
631afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner
641afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner  /// MapValue - provide versions that preserve type safety for MDNode and
651afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner  /// Constants.
661afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner  inline MDNode *MapValue(const MDNode *V, ValueToValueMapTy &VM,
671afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner                          RemapFlags Flags = RF_None,
681afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner                          ValueMapTypeRemapper *TypeMapper = 0) {
69e3fbe6c0fbf354c05800aabd8b0efc4a9366dc08Jay Foad    return cast<MDNode>(MapValue((const Value*)V, VM, Flags, TypeMapper));
701afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner  }
711afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner  inline Constant *MapValue(const Constant *V, ValueToValueMapTy &VM,
721afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner                            RemapFlags Flags = RF_None,
731afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner                            ValueMapTypeRemapper *TypeMapper = 0) {
74e3fbe6c0fbf354c05800aabd8b0efc4a9366dc08Jay Foad    return cast<Constant>(MapValue((const Value*)V, VM, Flags, TypeMapper));
751afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner  }
761afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner
771afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner
7818d083f0d1e3ee808c9890ccb3d54899baf4dc2aAnton Korobeynikov} // End llvm namespace
7918d083f0d1e3ee808c9890ccb3d54899baf4dc2aAnton Korobeynikov
8018d083f0d1e3ee808c9890ccb3d54899baf4dc2aAnton Korobeynikov#endif
81