ValueEnumerator.h revision 23c4358f12bd9d0ba7166eceebd683db95a41b3f
1d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines//===-- Bitcode/Writer/ValueEnumerator.h - Number values --------*- C++ -*-===// 2d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines// 3d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines// The LLVM Compiler Infrastructure 4d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines// 5d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines// This file is distributed under the University of Illinois Open Source 6d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines// License. See LICENSE.TXT for details. 7d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines// 8d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines//===----------------------------------------------------------------------===// 9d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines// 10d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines// This class gives values and types Unique ID's. 11d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines// 12d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines//===----------------------------------------------------------------------===// 13d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 14d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines#ifndef VALUE_ENUMERATOR_H 15d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines#define VALUE_ENUMERATOR_H 16d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 17d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines#include "llvm/ADT/DenseMap.h" 18d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines#include "llvm/ADT/SmallVector.h" 1923c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines#include "llvm/IR/Attributes.h" 20d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines#include <vector> 21d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 22d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hinesnamespace llvm { 23d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 24d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hinesclass Type; 25d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hinesclass Value; 26d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hinesclass Instruction; 27d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hinesclass BasicBlock; 28d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hinesclass Function; 29d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hinesclass Module; 30d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hinesclass MDNode; 31d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hinesclass NamedMDNode; 3223c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hinesclass AttributeSet; 33d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hinesclass ValueSymbolTable; 34d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hinesclass MDSymbolTable; 35d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hinesclass raw_ostream; 36d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 37d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines} // end llvm namespace 38d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 39d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hinesnamespace llvm_3_2 { 40d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 41d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hinesclass ValueEnumerator { 42d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hinespublic: 43d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines typedef std::vector<llvm::Type*> TypeList; 44d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 45d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines // For each value, we remember its Value* and occurrence frequency. 46d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines typedef std::vector<std::pair<const llvm::Value*, unsigned> > ValueList; 47d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hinesprivate: 48d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines typedef llvm::DenseMap<llvm::Type*, unsigned> TypeMapType; 49d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines TypeMapType TypeMap; 50d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines TypeList Types; 51d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 52d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines typedef llvm::DenseMap<const llvm::Value*, unsigned> ValueMapType; 53d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines ValueMapType ValueMap; 54d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines ValueList Values; 55d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines ValueList MDValues; 56d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines llvm::SmallVector<const llvm::MDNode *, 8> FunctionLocalMDs; 57d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines ValueMapType MDValueMap; 5823c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines 59d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines typedef llvm::DenseMap<void*, unsigned> AttributeMapType; 60d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines AttributeMapType AttributeMap; 6123c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines std::vector<llvm::AttributeSet> Attribute; 6223c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines 63d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines /// GlobalBasicBlockIDs - This map memoizes the basic block ID's referenced by 64d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines /// the "getGlobalBasicBlockID" method. 65d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines mutable llvm::DenseMap<const llvm::BasicBlock*, unsigned> GlobalBasicBlockIDs; 6623c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines 67d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines typedef llvm::DenseMap<const llvm::Instruction*, unsigned> InstructionMapType; 68d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines InstructionMapType InstructionMap; 69d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines unsigned InstructionCount; 70d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 71d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines /// BasicBlocks - This contains all the basic blocks for the currently 72d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines /// incorporated function. Their reverse mapping is stored in ValueMap. 73d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines std::vector<const llvm::BasicBlock*> BasicBlocks; 7423c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines 75d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines /// When a function is incorporated, this is the size of the Values list 76d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines /// before incorporation. 77d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines unsigned NumModuleValues; 78d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 79d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines /// When a function is incorporated, this is the size of the MDValues list 80d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines /// before incorporation. 81d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines unsigned NumModuleMDValues; 82d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 83d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines unsigned FirstFuncConstantID; 84d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines unsigned FirstInstID; 8523c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines 86d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines ValueEnumerator(const ValueEnumerator &); // DO NOT IMPLEMENT 87d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines void operator=(const ValueEnumerator &); // DO NOT IMPLEMENT 88d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hinespublic: 89d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines ValueEnumerator(const llvm::Module *M); 90d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 91d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines void dump() const; 92d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines void print(llvm::raw_ostream &OS, const ValueMapType &Map, const char *Name) const; 93d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 94d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines unsigned getValueID(const llvm::Value *V) const; 95d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 96d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines unsigned getTypeID(llvm::Type *T) const { 97d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines TypeMapType::const_iterator I = TypeMap.find(T); 98d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines assert(I != TypeMap.end() && "Type not in ValueEnumerator!"); 99d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines return I->second-1; 100d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 101d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 102d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines unsigned getInstructionID(const llvm::Instruction *I) const; 103d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines void setInstructionID(const llvm::Instruction *I); 104d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 10523c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines unsigned getAttributeID(const llvm::AttributeSet &PAL) const { 106d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines if (PAL.isEmpty()) return 0; // Null maps to zero. 107d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines AttributeMapType::const_iterator I = AttributeMap.find(PAL.getRawPointer()); 108d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines assert(I != AttributeMap.end() && "Attribute not in ValueEnumerator!"); 109d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines return I->second; 110d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 111d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 112d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines /// getFunctionConstantRange - Return the range of values that corresponds to 113d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines /// function-local constants. 114d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines void getFunctionConstantRange(unsigned &Start, unsigned &End) const { 115d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines Start = FirstFuncConstantID; 116d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines End = FirstInstID; 117d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 11823c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines 119d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const ValueList &getValues() const { return Values; } 120d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const ValueList &getMDValues() const { return MDValues; } 12123c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines const llvm::SmallVector<const llvm::MDNode *, 8> &getFunctionLocalMDValues() const { 122d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines return FunctionLocalMDs; 123d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 124d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const TypeList &getTypes() const { return Types; } 125d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const std::vector<const llvm::BasicBlock*> &getBasicBlocks() const { 12623c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines return BasicBlocks; 127d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 12823c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines const std::vector<llvm::AttributeSet> &getAttributes() const { 12923c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines return Attribute; 130d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 13123c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines 132d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines /// getGlobalBasicBlockID - This returns the function-specific ID for the 133d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines /// specified basic block. This is relatively expensive information, so it 134d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines /// should only be used by rare constructs such as address-of-label. 135d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines unsigned getGlobalBasicBlockID(const llvm::BasicBlock *BB) const; 136d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 137d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines /// incorporateFunction/purgeFunction - If you'd like to deal with a function, 138d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines /// use these two methods to get its data into the ValueEnumerator! 139d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines /// 140d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines void incorporateFunction(const llvm::Function &F); 141d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines void purgeFunction(); 142d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 143d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hinesprivate: 144d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines void OptimizeConstants(unsigned CstStart, unsigned CstEnd); 14523c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines 146d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines void EnumerateMDNodeOperands(const llvm::MDNode *N); 147d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines void EnumerateMetadata(const llvm::Value *MD); 148d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines void EnumerateFunctionLocalMetadata(const llvm::MDNode *N); 149d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines void EnumerateNamedMDNode(const llvm::NamedMDNode *NMD); 150d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines void EnumerateValue(const llvm::Value *V); 151d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines void EnumerateType(llvm::Type *T); 152d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines void EnumerateOperandType(const llvm::Value *V); 15323c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines void EnumerateAttributes(const llvm::AttributeSet &PAL); 15423c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines 155d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines void EnumerateValueSymbolTable(const llvm::ValueSymbolTable &ST); 156d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines void EnumerateNamedMetadata(const llvm::Module *M); 157d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines}; 158d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 159d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines} // End llvm_3_2 namespace 160d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 161d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines#endif 162