1193323Sed//===-- Bitcode/Writer/ValueEnumerator.h - Number values --------*- C++ -*-===// 2193323Sed// 3193323Sed// The LLVM Compiler Infrastructure 4193323Sed// 5193323Sed// This file is distributed under the University of Illinois Open Source 6193323Sed// License. See LICENSE.TXT for details. 7193323Sed// 8193323Sed//===----------------------------------------------------------------------===// 9193323Sed// 10193323Sed// This class gives values and types Unique ID's. 11193323Sed// 12193323Sed//===----------------------------------------------------------------------===// 13193323Sed 14193323Sed#ifndef VALUE_ENUMERATOR_H 15193323Sed#define VALUE_ENUMERATOR_H 16193323Sed 17193323Sed#include "llvm/ADT/DenseMap.h" 18210299Sed#include "llvm/ADT/SmallVector.h" 19249423Sdim#include "llvm/IR/Attributes.h" 20193323Sed#include <vector> 21193323Sed 22193323Sednamespace llvm { 23193323Sed 24193323Sedclass Type; 25193323Sedclass Value; 26198090Srdivackyclass Instruction; 27193323Sedclass BasicBlock; 28193323Sedclass Function; 29193323Sedclass Module; 30210299Sedclass MDNode; 31202375Srdivackyclass NamedMDNode; 32249423Sdimclass AttributeSet; 33193323Sedclass ValueSymbolTable; 34202375Srdivackyclass MDSymbolTable; 35234353Sdimclass raw_ostream; 36193323Sed 37193323Sedclass ValueEnumerator { 38193323Sedpublic: 39226633Sdim typedef std::vector<Type*> TypeList; 40193323Sed 41193323Sed // For each value, we remember its Value* and occurrence frequency. 42193323Sed typedef std::vector<std::pair<const Value*, unsigned> > ValueList; 43193323Sedprivate: 44226633Sdim typedef DenseMap<Type*, unsigned> TypeMapType; 45193323Sed TypeMapType TypeMap; 46193323Sed TypeList Types; 47193323Sed 48193323Sed typedef DenseMap<const Value*, unsigned> ValueMapType; 49193323Sed ValueMapType ValueMap; 50193323Sed ValueList Values; 51198090Srdivacky ValueList MDValues; 52210299Sed SmallVector<const MDNode *, 8> FunctionLocalMDs; 53198090Srdivacky ValueMapType MDValueMap; 54249423Sdim 55249423Sdim typedef DenseMap<AttributeSet, unsigned> AttributeGroupMapType; 56249423Sdim AttributeGroupMapType AttributeGroupMap; 57249423Sdim std::vector<AttributeSet> AttributeGroups; 58249423Sdim 59249423Sdim typedef DenseMap<AttributeSet, unsigned> AttributeMapType; 60193323Sed AttributeMapType AttributeMap; 61249423Sdim std::vector<AttributeSet> Attribute; 62249423Sdim 63198892Srdivacky /// GlobalBasicBlockIDs - This map memoizes the basic block ID's referenced by 64198892Srdivacky /// the "getGlobalBasicBlockID" method. 65198892Srdivacky mutable DenseMap<const BasicBlock*, unsigned> GlobalBasicBlockIDs; 66249423Sdim 67198090Srdivacky typedef DenseMap<const Instruction*, unsigned> InstructionMapType; 68198090Srdivacky InstructionMapType InstructionMap; 69198090Srdivacky unsigned InstructionCount; 70198090Srdivacky 71193323Sed /// BasicBlocks - This contains all the basic blocks for the currently 72193323Sed /// incorporated function. Their reverse mapping is stored in ValueMap. 73193323Sed std::vector<const BasicBlock*> BasicBlocks; 74249423Sdim 75193323Sed /// When a function is incorporated, this is the size of the Values list 76193323Sed /// before incorporation. 77193323Sed unsigned NumModuleValues; 78212904Sdim 79212904Sdim /// When a function is incorporated, this is the size of the MDValues list 80212904Sdim /// before incorporation. 81212904Sdim unsigned NumModuleMDValues; 82212904Sdim 83193323Sed unsigned FirstFuncConstantID; 84193323Sed unsigned FirstInstID; 85243830Sdim 86243830Sdim ValueEnumerator(const ValueEnumerator &) LLVM_DELETED_FUNCTION; 87243830Sdim void operator=(const ValueEnumerator &) LLVM_DELETED_FUNCTION; 88193323Sedpublic: 89193323Sed ValueEnumerator(const Module *M); 90193323Sed 91234353Sdim void dump() const; 92234353Sdim void print(raw_ostream &OS, const ValueMapType &Map, const char *Name) const; 93234353Sdim 94198090Srdivacky unsigned getValueID(const Value *V) const; 95198090Srdivacky 96226633Sdim unsigned getTypeID(Type *T) const { 97193323Sed TypeMapType::const_iterator I = TypeMap.find(T); 98193323Sed assert(I != TypeMap.end() && "Type not in ValueEnumerator!"); 99193323Sed return I->second-1; 100193323Sed } 101198090Srdivacky 102198090Srdivacky unsigned getInstructionID(const Instruction *I) const; 103198090Srdivacky void setInstructionID(const Instruction *I); 104198090Srdivacky 105249423Sdim unsigned getAttributeID(AttributeSet PAL) const { 106193323Sed if (PAL.isEmpty()) return 0; // Null maps to zero. 107249423Sdim AttributeMapType::const_iterator I = AttributeMap.find(PAL); 108193323Sed assert(I != AttributeMap.end() && "Attribute not in ValueEnumerator!"); 109193323Sed return I->second; 110193323Sed } 111193323Sed 112249423Sdim unsigned getAttributeGroupID(AttributeSet PAL) const { 113249423Sdim if (PAL.isEmpty()) return 0; // Null maps to zero. 114249423Sdim AttributeGroupMapType::const_iterator I = AttributeGroupMap.find(PAL); 115249423Sdim assert(I != AttributeGroupMap.end() && "Attribute not in ValueEnumerator!"); 116249423Sdim return I->second; 117249423Sdim } 118249423Sdim 119193323Sed /// getFunctionConstantRange - Return the range of values that corresponds to 120193323Sed /// function-local constants. 121193323Sed void getFunctionConstantRange(unsigned &Start, unsigned &End) const { 122193323Sed Start = FirstFuncConstantID; 123193323Sed End = FirstInstID; 124193323Sed } 125249423Sdim 126193323Sed const ValueList &getValues() const { return Values; } 127198090Srdivacky const ValueList &getMDValues() const { return MDValues; } 128263508Sdim const SmallVectorImpl<const MDNode *> &getFunctionLocalMDValues() const { 129210299Sed return FunctionLocalMDs; 130210299Sed } 131193323Sed const TypeList &getTypes() const { return Types; } 132193323Sed const std::vector<const BasicBlock*> &getBasicBlocks() const { 133249423Sdim return BasicBlocks; 134193323Sed } 135249423Sdim const std::vector<AttributeSet> &getAttributes() const { 136249423Sdim return Attribute; 137193323Sed } 138249423Sdim const std::vector<AttributeSet> &getAttributeGroups() const { 139249423Sdim return AttributeGroups; 140249423Sdim } 141249423Sdim 142198892Srdivacky /// getGlobalBasicBlockID - This returns the function-specific ID for the 143198892Srdivacky /// specified basic block. This is relatively expensive information, so it 144198892Srdivacky /// should only be used by rare constructs such as address-of-label. 145198892Srdivacky unsigned getGlobalBasicBlockID(const BasicBlock *BB) const; 146193323Sed 147193323Sed /// incorporateFunction/purgeFunction - If you'd like to deal with a function, 148193323Sed /// use these two methods to get its data into the ValueEnumerator! 149193323Sed /// 150193323Sed void incorporateFunction(const Function &F); 151193323Sed void purgeFunction(); 152193323Sed 153193323Sedprivate: 154193323Sed void OptimizeConstants(unsigned CstStart, unsigned CstEnd); 155249423Sdim 156212904Sdim void EnumerateMDNodeOperands(const MDNode *N); 157202878Srdivacky void EnumerateMetadata(const Value *MD); 158212904Sdim void EnumerateFunctionLocalMetadata(const MDNode *N); 159202375Srdivacky void EnumerateNamedMDNode(const NamedMDNode *NMD); 160193323Sed void EnumerateValue(const Value *V); 161226633Sdim void EnumerateType(Type *T); 162193323Sed void EnumerateOperandType(const Value *V); 163249423Sdim void EnumerateAttributes(AttributeSet PAL); 164249423Sdim 165193323Sed void EnumerateValueSymbolTable(const ValueSymbolTable &ST); 166212904Sdim void EnumerateNamedMetadata(const Module *M); 167193323Sed}; 168193323Sed 169193323Sed} // End llvm namespace 170193323Sed 171193323Sed#endif 172