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