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 590da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines typedef llvm::DenseMap<llvm::AttributeSet, unsigned> AttributeGroupMapType; 600da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines AttributeGroupMapType AttributeGroupMap; 610da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines std::vector<llvm::AttributeSet> AttributeGroups; 620da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines 630da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines typedef llvm::DenseMap<llvm::AttributeSet, unsigned> AttributeMapType; 64d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines AttributeMapType AttributeMap; 6523c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines std::vector<llvm::AttributeSet> Attribute; 6623c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines 67d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines /// GlobalBasicBlockIDs - This map memoizes the basic block ID's referenced by 68d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines /// the "getGlobalBasicBlockID" method. 69d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines mutable llvm::DenseMap<const llvm::BasicBlock*, unsigned> GlobalBasicBlockIDs; 7023c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines 71d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines typedef llvm::DenseMap<const llvm::Instruction*, unsigned> InstructionMapType; 72d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines InstructionMapType InstructionMap; 73d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines unsigned InstructionCount; 74d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 75d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines /// BasicBlocks - This contains all the basic blocks for the currently 76d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines /// incorporated function. Their reverse mapping is stored in ValueMap. 77d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines std::vector<const llvm::BasicBlock*> BasicBlocks; 7823c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines 79d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines /// When a function is incorporated, this is the size of the Values list 80d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines /// before incorporation. 81d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines unsigned NumModuleValues; 82d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 83d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines /// When a function is incorporated, this is the size of the MDValues list 84d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines /// before incorporation. 85d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines unsigned NumModuleMDValues; 86d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 87d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines unsigned FirstFuncConstantID; 88d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines unsigned FirstInstID; 8923c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines 90d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines ValueEnumerator(const ValueEnumerator &); // DO NOT IMPLEMENT 91d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines void operator=(const ValueEnumerator &); // DO NOT IMPLEMENT 92d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hinespublic: 93d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines ValueEnumerator(const llvm::Module *M); 94d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 95d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines void dump() const; 96d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines void print(llvm::raw_ostream &OS, const ValueMapType &Map, const char *Name) const; 97d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 98d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines unsigned getValueID(const llvm::Value *V) const; 99d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 100d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines unsigned getTypeID(llvm::Type *T) const { 101d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines TypeMapType::const_iterator I = TypeMap.find(T); 102d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines assert(I != TypeMap.end() && "Type not in ValueEnumerator!"); 103d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines return I->second-1; 104d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 105d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 106d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines unsigned getInstructionID(const llvm::Instruction *I) const; 107d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines void setInstructionID(const llvm::Instruction *I); 108d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 1090da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines unsigned getAttributeID(llvm::AttributeSet PAL) const { 110d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines if (PAL.isEmpty()) return 0; // Null maps to zero. 1110da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines AttributeMapType::const_iterator I = AttributeMap.find(PAL); 112d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines assert(I != AttributeMap.end() && "Attribute not in ValueEnumerator!"); 113d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines return I->second; 114d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 115d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 1160da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines unsigned getAttributeGroupID(llvm::AttributeSet PAL) const { 1170da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines if (PAL.isEmpty()) return 0; // Null maps to zero. 1180da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines AttributeGroupMapType::const_iterator I = AttributeGroupMap.find(PAL); 1190da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines assert(I != AttributeGroupMap.end() && "Attribute not in ValueEnumerator!"); 1200da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines return I->second; 1210da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines } 1220da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines 123d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines /// getFunctionConstantRange - Return the range of values that corresponds to 124d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines /// function-local constants. 125d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines void getFunctionConstantRange(unsigned &Start, unsigned &End) const { 126d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines Start = FirstFuncConstantID; 127d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines End = FirstInstID; 128d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 12923c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines 130d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const ValueList &getValues() const { return Values; } 131d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const ValueList &getMDValues() const { return MDValues; } 13223c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines const llvm::SmallVector<const llvm::MDNode *, 8> &getFunctionLocalMDValues() const { 133d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines return FunctionLocalMDs; 134d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 135d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const TypeList &getTypes() const { return Types; } 136d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const std::vector<const llvm::BasicBlock*> &getBasicBlocks() const { 13723c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines return BasicBlocks; 138d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 13923c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines const std::vector<llvm::AttributeSet> &getAttributes() const { 14023c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines return Attribute; 141d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 1420da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines const std::vector<llvm::AttributeSet> &getAttributeGroups() const { 1430da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines return AttributeGroups; 1440da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines } 14523c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines 146d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines /// getGlobalBasicBlockID - This returns the function-specific ID for the 147d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines /// specified basic block. This is relatively expensive information, so it 148d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines /// should only be used by rare constructs such as address-of-label. 149d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines unsigned getGlobalBasicBlockID(const llvm::BasicBlock *BB) const; 150d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 151d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines /// incorporateFunction/purgeFunction - If you'd like to deal with a function, 152d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines /// use these two methods to get its data into the ValueEnumerator! 153d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines /// 154d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines void incorporateFunction(const llvm::Function &F); 155d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines void purgeFunction(); 156d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 157d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hinesprivate: 158d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines void OptimizeConstants(unsigned CstStart, unsigned CstEnd); 15923c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines 160d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines void EnumerateMDNodeOperands(const llvm::MDNode *N); 161d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines void EnumerateMetadata(const llvm::Value *MD); 162d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines void EnumerateFunctionLocalMetadata(const llvm::MDNode *N); 163d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines void EnumerateNamedMDNode(const llvm::NamedMDNode *NMD); 164d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines void EnumerateValue(const llvm::Value *V); 165d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines void EnumerateType(llvm::Type *T); 166d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines void EnumerateOperandType(const llvm::Value *V); 1670da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines void EnumerateAttributes(llvm::AttributeSet PAL); 16823c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines 169d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines void EnumerateValueSymbolTable(const llvm::ValueSymbolTable &ST); 170d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines void EnumerateNamedMetadata(const llvm::Module *M); 171d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines}; 172d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 173d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines} // End llvm_3_2 namespace 174d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 175d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines#endif 176