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" 20c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines#include "llvm/IR/UseListOrder.h" 21d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines#include <vector> 22d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 23d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hinesnamespace llvm { 24d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 25d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hinesclass Type; 26d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hinesclass Value; 27d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hinesclass Instruction; 28d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hinesclass BasicBlock; 29d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hinesclass Function; 30d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hinesclass Module; 31c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hinesclass Metadata; 32c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hinesclass LocalAsMetadata; 33d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hinesclass MDNode; 34d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hinesclass NamedMDNode; 3523c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hinesclass AttributeSet; 36d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hinesclass ValueSymbolTable; 37d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hinesclass MDSymbolTable; 38d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hinesclass raw_ostream; 39d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 40d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines} // end llvm namespace 41d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 42d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hinesnamespace llvm_3_2 { 43d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 44d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hinesclass ValueEnumerator { 45d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hinespublic: 46d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines typedef std::vector<llvm::Type*> TypeList; 47d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 48d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines // For each value, we remember its Value* and occurrence frequency. 49d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines typedef std::vector<std::pair<const llvm::Value*, unsigned> > ValueList; 50c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines 51c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines llvm::UseListOrderStack UseListOrders; 52d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hinesprivate: 53d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines typedef llvm::DenseMap<llvm::Type*, unsigned> TypeMapType; 54d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines TypeMapType TypeMap; 55d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines TypeList Types; 56d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 57d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines typedef llvm::DenseMap<const llvm::Value*, unsigned> ValueMapType; 58d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines ValueMapType ValueMap; 59d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines ValueList Values; 60c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines 61c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines 62c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines std::vector<const llvm::Metadata *> MDs; 63c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines llvm::SmallVector<const llvm::LocalAsMetadata *, 8> FunctionLocalMDs; 64c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines typedef llvm::DenseMap<const llvm::Metadata *, unsigned> MetadataMapType; 65c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines MetadataMapType MDValueMap; 66c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines bool HasMDString; 671906a00dce8e32fe3bb8a957e333ebbbee0888e3Pirama Arumuga Nainar bool HasDILocation; 6823c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines 690da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines typedef llvm::DenseMap<llvm::AttributeSet, unsigned> AttributeGroupMapType; 700da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines AttributeGroupMapType AttributeGroupMap; 710da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines std::vector<llvm::AttributeSet> AttributeGroups; 720da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines 730da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines typedef llvm::DenseMap<llvm::AttributeSet, unsigned> AttributeMapType; 74d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines AttributeMapType AttributeMap; 7523c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines std::vector<llvm::AttributeSet> Attribute; 7623c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines 77d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines /// GlobalBasicBlockIDs - This map memoizes the basic block ID's referenced by 78d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines /// the "getGlobalBasicBlockID" method. 79d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines mutable llvm::DenseMap<const llvm::BasicBlock*, unsigned> GlobalBasicBlockIDs; 8023c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines 81d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines typedef llvm::DenseMap<const llvm::Instruction*, unsigned> InstructionMapType; 82d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines InstructionMapType InstructionMap; 83d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines unsigned InstructionCount; 84d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 85d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines /// BasicBlocks - This contains all the basic blocks for the currently 86d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines /// incorporated function. Their reverse mapping is stored in ValueMap. 87d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines std::vector<const llvm::BasicBlock*> BasicBlocks; 8823c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines 89d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines /// When a function is incorporated, this is the size of the Values list 90d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines /// before incorporation. 91d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines unsigned NumModuleValues; 92d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 93d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines /// When a function is incorporated, this is the size of the MDValues list 94d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines /// before incorporation. 95c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines unsigned NumModuleMDs; 96d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 97d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines unsigned FirstFuncConstantID; 98d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines unsigned FirstInstID; 9923c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines 100c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines ValueEnumerator(const ValueEnumerator &) = delete; 101c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines void operator=(const ValueEnumerator &) = delete; 102d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hinespublic: 103c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines ValueEnumerator(const llvm::Module &M); 104d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 105d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines void dump() const; 106d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines void print(llvm::raw_ostream &OS, const ValueMapType &Map, const char *Name) const; 107c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines void print(llvm::raw_ostream &OS, const MetadataMapType &Map, 108c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines const char *Name) const; 109d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 110d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines unsigned getValueID(const llvm::Value *V) const; 111c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines unsigned getMetadataID(const llvm::Metadata *MD) const { 112c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines auto ID = getMetadataOrNullID(MD); 113c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines assert(ID != 0 && "Metadata not in slotcalculator!"); 114c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines return ID - 1; 115c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines } 116c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines unsigned getMetadataOrNullID(const llvm::Metadata *MD) const { 117c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines return MDValueMap.lookup(MD); 118c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines } 119c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines 120c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines bool hasMDString() const { return HasMDString; } 1211906a00dce8e32fe3bb8a957e333ebbbee0888e3Pirama Arumuga Nainar bool hasDILocation() const { return HasDILocation; } 122d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 123d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines unsigned getTypeID(llvm::Type *T) const { 124d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines TypeMapType::const_iterator I = TypeMap.find(T); 125d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines assert(I != TypeMap.end() && "Type not in ValueEnumerator!"); 126d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines return I->second-1; 127d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 128d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 129d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines unsigned getInstructionID(const llvm::Instruction *I) const; 130d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines void setInstructionID(const llvm::Instruction *I); 131d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 1320da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines unsigned getAttributeID(llvm::AttributeSet PAL) const { 133d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines if (PAL.isEmpty()) return 0; // Null maps to zero. 1340da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines AttributeMapType::const_iterator I = AttributeMap.find(PAL); 135d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines assert(I != AttributeMap.end() && "Attribute not in ValueEnumerator!"); 136d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines return I->second; 137d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 138d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 1390da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines unsigned getAttributeGroupID(llvm::AttributeSet PAL) const { 1400da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines if (PAL.isEmpty()) return 0; // Null maps to zero. 1410da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines AttributeGroupMapType::const_iterator I = AttributeGroupMap.find(PAL); 1420da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines assert(I != AttributeGroupMap.end() && "Attribute not in ValueEnumerator!"); 1430da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines return I->second; 1440da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines } 1450da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines 146d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines /// getFunctionConstantRange - Return the range of values that corresponds to 147d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines /// function-local constants. 148d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines void getFunctionConstantRange(unsigned &Start, unsigned &End) const { 149d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines Start = FirstFuncConstantID; 150d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines End = FirstInstID; 151d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 15223c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines 153d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const ValueList &getValues() const { return Values; } 154c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines const std::vector<const llvm::Metadata *> &getMDs() const { return MDs; } 155c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines const llvm::SmallVectorImpl<const llvm::LocalAsMetadata *> &getFunctionLocalMDs() const { 156d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines return FunctionLocalMDs; 157d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 158d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const TypeList &getTypes() const { return Types; } 159d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const std::vector<const llvm::BasicBlock*> &getBasicBlocks() const { 16023c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines return BasicBlocks; 161d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 16223c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines const std::vector<llvm::AttributeSet> &getAttributes() const { 16323c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines return Attribute; 164d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 1650da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines const std::vector<llvm::AttributeSet> &getAttributeGroups() const { 1660da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines return AttributeGroups; 1670da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines } 16823c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines 169d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines /// getGlobalBasicBlockID - This returns the function-specific ID for the 170d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines /// specified basic block. This is relatively expensive information, so it 171d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines /// should only be used by rare constructs such as address-of-label. 172d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines unsigned getGlobalBasicBlockID(const llvm::BasicBlock *BB) const; 173d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 174d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines /// incorporateFunction/purgeFunction - If you'd like to deal with a function, 175d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines /// use these two methods to get its data into the ValueEnumerator! 176d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines /// 177d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines void incorporateFunction(const llvm::Function &F); 178d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines void purgeFunction(); 179d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 180d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hinesprivate: 181d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines void OptimizeConstants(unsigned CstStart, unsigned CstEnd); 18223c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines 183d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines void EnumerateMDNodeOperands(const llvm::MDNode *N); 184c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines void EnumerateMetadata(const llvm::Metadata *MD); 185c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines void EnumerateFunctionLocalMetadata(const llvm::LocalAsMetadata *Local); 186d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines void EnumerateNamedMDNode(const llvm::NamedMDNode *NMD); 187d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines void EnumerateValue(const llvm::Value *V); 188d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines void EnumerateType(llvm::Type *T); 189d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines void EnumerateOperandType(const llvm::Value *V); 1900da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines void EnumerateAttributes(llvm::AttributeSet PAL); 19123c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines 192d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines void EnumerateValueSymbolTable(const llvm::ValueSymbolTable &ST); 193c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines void EnumerateNamedMetadata(const llvm::Module &M); 194d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines}; 195d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 196d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines} // End llvm_3_2 namespace 197d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 198d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines#endif 199