14cc499d6e5ec602309501873449c938af61170b2Stephen Hines//===-- Bitcode/Writer/ValueEnumerator.h - Number values --------*- C++ -*-===// 24cc499d6e5ec602309501873449c938af61170b2Stephen Hines// 34cc499d6e5ec602309501873449c938af61170b2Stephen Hines// The LLVM Compiler Infrastructure 44cc499d6e5ec602309501873449c938af61170b2Stephen Hines// 54cc499d6e5ec602309501873449c938af61170b2Stephen Hines// This file is distributed under the University of Illinois Open Source 64cc499d6e5ec602309501873449c938af61170b2Stephen Hines// License. See LICENSE.TXT for details. 74cc499d6e5ec602309501873449c938af61170b2Stephen Hines// 84cc499d6e5ec602309501873449c938af61170b2Stephen Hines//===----------------------------------------------------------------------===// 94cc499d6e5ec602309501873449c938af61170b2Stephen Hines// 104cc499d6e5ec602309501873449c938af61170b2Stephen Hines// This class gives values and types Unique ID's. 114cc499d6e5ec602309501873449c938af61170b2Stephen Hines// 124cc499d6e5ec602309501873449c938af61170b2Stephen Hines//===----------------------------------------------------------------------===// 134cc499d6e5ec602309501873449c938af61170b2Stephen Hines 144cc499d6e5ec602309501873449c938af61170b2Stephen Hines#ifndef VALUE_ENUMERATOR_H 154cc499d6e5ec602309501873449c938af61170b2Stephen Hines#define VALUE_ENUMERATOR_H 164cc499d6e5ec602309501873449c938af61170b2Stephen Hines 174cc499d6e5ec602309501873449c938af61170b2Stephen Hines#include "llvm/ADT/DenseMap.h" 184cc499d6e5ec602309501873449c938af61170b2Stephen Hines#include "llvm/ADT/SmallVector.h" 1923c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines#include "llvm/IR/Attributes.h" 204cc499d6e5ec602309501873449c938af61170b2Stephen Hines#include <vector> 214cc499d6e5ec602309501873449c938af61170b2Stephen Hines 224cc499d6e5ec602309501873449c938af61170b2Stephen Hinesnamespace llvm { 234cc499d6e5ec602309501873449c938af61170b2Stephen Hines 244cc499d6e5ec602309501873449c938af61170b2Stephen Hinesclass Type; 254cc499d6e5ec602309501873449c938af61170b2Stephen Hinesclass Value; 264cc499d6e5ec602309501873449c938af61170b2Stephen Hinesclass Instruction; 274cc499d6e5ec602309501873449c938af61170b2Stephen Hinesclass BasicBlock; 284cc499d6e5ec602309501873449c938af61170b2Stephen Hinesclass Function; 294cc499d6e5ec602309501873449c938af61170b2Stephen Hinesclass Module; 30c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hinesclass Metadata; 31c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hinesclass LocalAsMetadata; 324cc499d6e5ec602309501873449c938af61170b2Stephen Hinesclass MDNode; 334cc499d6e5ec602309501873449c938af61170b2Stephen Hinesclass NamedMDNode; 3423c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hinesclass AttributeSet; 354cc499d6e5ec602309501873449c938af61170b2Stephen Hinesclass ValueSymbolTable; 364cc499d6e5ec602309501873449c938af61170b2Stephen Hinesclass MDSymbolTable; 3701a90ee2d2f65a01931d932d437a8f79c35c0553Stephen Hinesclass raw_ostream; 384cc499d6e5ec602309501873449c938af61170b2Stephen Hines 3901a90ee2d2f65a01931d932d437a8f79c35c0553Stephen Hines} // end llvm namespace 40331994bf987efa0d40f33b5fdcdc01330c2aefe7Stephen Hines 41331994bf987efa0d40f33b5fdcdc01330c2aefe7Stephen Hinesnamespace llvm_2_9 { 42331994bf987efa0d40f33b5fdcdc01330c2aefe7Stephen Hines 434cc499d6e5ec602309501873449c938af61170b2Stephen Hinesclass ValueEnumerator { 444cc499d6e5ec602309501873449c938af61170b2Stephen Hinespublic: 45331994bf987efa0d40f33b5fdcdc01330c2aefe7Stephen Hines typedef std::vector<llvm::Type*> TypeList; 464cc499d6e5ec602309501873449c938af61170b2Stephen Hines 474cc499d6e5ec602309501873449c938af61170b2Stephen Hines // For each value, we remember its Value* and occurrence frequency. 48331994bf987efa0d40f33b5fdcdc01330c2aefe7Stephen Hines typedef std::vector<std::pair<const llvm::Value*, unsigned> > ValueList; 494cc499d6e5ec602309501873449c938af61170b2Stephen Hinesprivate: 50331994bf987efa0d40f33b5fdcdc01330c2aefe7Stephen Hines typedef llvm::DenseMap<llvm::Type*, unsigned> TypeMapType; 514cc499d6e5ec602309501873449c938af61170b2Stephen Hines TypeMapType TypeMap; 524cc499d6e5ec602309501873449c938af61170b2Stephen Hines TypeList Types; 534cc499d6e5ec602309501873449c938af61170b2Stephen Hines 54331994bf987efa0d40f33b5fdcdc01330c2aefe7Stephen Hines typedef llvm::DenseMap<const llvm::Value*, unsigned> ValueMapType; 554cc499d6e5ec602309501873449c938af61170b2Stephen Hines ValueMapType ValueMap; 564cc499d6e5ec602309501873449c938af61170b2Stephen Hines ValueList Values; 57c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines 58c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines 59c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines std::vector<const llvm::Metadata *> MDs; 60c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines llvm::SmallVector<const llvm::LocalAsMetadata *, 8> FunctionLocalMDs; 61c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines typedef llvm::DenseMap<const llvm::Metadata *, unsigned> MetadataMapType; 62c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines MetadataMapType MDValueMap; 63c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines bool HasMDString; 641906a00dce8e32fe3bb8a957e333ebbbee0888e3Pirama Arumuga Nainar bool HasDILocation; 6523c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines 660da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines typedef llvm::DenseMap<llvm::AttributeSet, unsigned> AttributeGroupMapType; 670da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines AttributeGroupMapType AttributeGroupMap; 680da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines std::vector<llvm::AttributeSet> AttributeGroups; 690da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines 700da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines typedef llvm::DenseMap<llvm::AttributeSet, unsigned> AttributeMapType; 714cc499d6e5ec602309501873449c938af61170b2Stephen Hines AttributeMapType AttributeMap; 7223c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines std::vector<llvm::AttributeSet> Attribute; 7323c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines 744cc499d6e5ec602309501873449c938af61170b2Stephen Hines /// GlobalBasicBlockIDs - This map memoizes the basic block ID's referenced by 754cc499d6e5ec602309501873449c938af61170b2Stephen Hines /// the "getGlobalBasicBlockID" method. 76331994bf987efa0d40f33b5fdcdc01330c2aefe7Stephen Hines mutable llvm::DenseMap<const llvm::BasicBlock*, unsigned> GlobalBasicBlockIDs; 7723c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines 78331994bf987efa0d40f33b5fdcdc01330c2aefe7Stephen Hines typedef llvm::DenseMap<const llvm::Instruction*, unsigned> InstructionMapType; 794cc499d6e5ec602309501873449c938af61170b2Stephen Hines InstructionMapType InstructionMap; 804cc499d6e5ec602309501873449c938af61170b2Stephen Hines unsigned InstructionCount; 814cc499d6e5ec602309501873449c938af61170b2Stephen Hines 824cc499d6e5ec602309501873449c938af61170b2Stephen Hines /// BasicBlocks - This contains all the basic blocks for the currently 834cc499d6e5ec602309501873449c938af61170b2Stephen Hines /// incorporated function. Their reverse mapping is stored in ValueMap. 84331994bf987efa0d40f33b5fdcdc01330c2aefe7Stephen Hines std::vector<const llvm::BasicBlock*> BasicBlocks; 8523c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines 864cc499d6e5ec602309501873449c938af61170b2Stephen Hines /// When a function is incorporated, this is the size of the Values list 874cc499d6e5ec602309501873449c938af61170b2Stephen Hines /// before incorporation. 884cc499d6e5ec602309501873449c938af61170b2Stephen Hines unsigned NumModuleValues; 894cc499d6e5ec602309501873449c938af61170b2Stephen Hines 904cc499d6e5ec602309501873449c938af61170b2Stephen Hines /// When a function is incorporated, this is the size of the MDValues list 914cc499d6e5ec602309501873449c938af61170b2Stephen Hines /// before incorporation. 92c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines unsigned NumModuleMDs; 934cc499d6e5ec602309501873449c938af61170b2Stephen Hines 944cc499d6e5ec602309501873449c938af61170b2Stephen Hines unsigned FirstFuncConstantID; 954cc499d6e5ec602309501873449c938af61170b2Stephen Hines unsigned FirstInstID; 9623c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines 97c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines ValueEnumerator(const ValueEnumerator &) = delete; 98c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines void operator=(const ValueEnumerator &) = delete; 994cc499d6e5ec602309501873449c938af61170b2Stephen Hinespublic: 100e2ead846c1d78a6e7108e521ffd15850bd9eed3cChih-Hung Hsieh explicit ValueEnumerator(const llvm::Module &M); 1014cc499d6e5ec602309501873449c938af61170b2Stephen Hines 10201a90ee2d2f65a01931d932d437a8f79c35c0553Stephen Hines void dump() const; 10301a90ee2d2f65a01931d932d437a8f79c35c0553Stephen Hines void print(llvm::raw_ostream &OS, const ValueMapType &Map, const char *Name) const; 104c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines void print(llvm::raw_ostream &OS, const MetadataMapType &Map, 105c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines const char *Name) const; 10601a90ee2d2f65a01931d932d437a8f79c35c0553Stephen Hines 107331994bf987efa0d40f33b5fdcdc01330c2aefe7Stephen Hines unsigned getValueID(const llvm::Value *V) const; 108c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines unsigned getMetadataID(const llvm::Metadata *MD) const { 109c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines auto ID = getMetadataOrNullID(MD); 110c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines assert(ID != 0 && "Metadata not in slotcalculator!"); 111c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines return ID - 1; 112c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines } 113c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines unsigned getMetadataOrNullID(const llvm::Metadata *MD) const { 114c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines return MDValueMap.lookup(MD); 115c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines } 116c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines 117c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines bool hasMDString() const { return HasMDString; } 1181906a00dce8e32fe3bb8a957e333ebbbee0888e3Pirama Arumuga Nainar bool hasDILocation() const { return HasDILocation; } 1194cc499d6e5ec602309501873449c938af61170b2Stephen Hines 120331994bf987efa0d40f33b5fdcdc01330c2aefe7Stephen Hines unsigned getTypeID(llvm::Type *T) const { 1214cc499d6e5ec602309501873449c938af61170b2Stephen Hines TypeMapType::const_iterator I = TypeMap.find(T); 1224cc499d6e5ec602309501873449c938af61170b2Stephen Hines assert(I != TypeMap.end() && "Type not in ValueEnumerator!"); 1234cc499d6e5ec602309501873449c938af61170b2Stephen Hines return I->second-1; 1244cc499d6e5ec602309501873449c938af61170b2Stephen Hines } 1254cc499d6e5ec602309501873449c938af61170b2Stephen Hines 126331994bf987efa0d40f33b5fdcdc01330c2aefe7Stephen Hines unsigned getInstructionID(const llvm::Instruction *I) const; 127331994bf987efa0d40f33b5fdcdc01330c2aefe7Stephen Hines void setInstructionID(const llvm::Instruction *I); 1284cc499d6e5ec602309501873449c938af61170b2Stephen Hines 1290da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines unsigned getAttributeID(llvm::AttributeSet PAL) const { 1304cc499d6e5ec602309501873449c938af61170b2Stephen Hines if (PAL.isEmpty()) return 0; // Null maps to zero. 1310da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines AttributeMapType::const_iterator I = AttributeMap.find(PAL); 1324cc499d6e5ec602309501873449c938af61170b2Stephen Hines assert(I != AttributeMap.end() && "Attribute not in ValueEnumerator!"); 1334cc499d6e5ec602309501873449c938af61170b2Stephen Hines return I->second; 1344cc499d6e5ec602309501873449c938af61170b2Stephen Hines } 1354cc499d6e5ec602309501873449c938af61170b2Stephen Hines 1360da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines unsigned getAttributeGroupID(llvm::AttributeSet PAL) const { 1370da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines if (PAL.isEmpty()) return 0; // Null maps to zero. 1380da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines AttributeGroupMapType::const_iterator I = AttributeGroupMap.find(PAL); 1390da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines assert(I != AttributeGroupMap.end() && "Attribute not in ValueEnumerator!"); 1400da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines return I->second; 1410da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines } 1420da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines 1434cc499d6e5ec602309501873449c938af61170b2Stephen Hines /// getFunctionConstantRange - Return the range of values that corresponds to 1444cc499d6e5ec602309501873449c938af61170b2Stephen Hines /// function-local constants. 1454cc499d6e5ec602309501873449c938af61170b2Stephen Hines void getFunctionConstantRange(unsigned &Start, unsigned &End) const { 1464cc499d6e5ec602309501873449c938af61170b2Stephen Hines Start = FirstFuncConstantID; 1474cc499d6e5ec602309501873449c938af61170b2Stephen Hines End = FirstInstID; 1484cc499d6e5ec602309501873449c938af61170b2Stephen Hines } 14923c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines 1504cc499d6e5ec602309501873449c938af61170b2Stephen Hines const ValueList &getValues() const { return Values; } 151c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines const std::vector<const llvm::Metadata *> &getMDs() const { return MDs; } 152c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines const llvm::SmallVectorImpl<const llvm::LocalAsMetadata *> &getFunctionLocalMDs() const { 1534cc499d6e5ec602309501873449c938af61170b2Stephen Hines return FunctionLocalMDs; 1544cc499d6e5ec602309501873449c938af61170b2Stephen Hines } 1554cc499d6e5ec602309501873449c938af61170b2Stephen Hines const TypeList &getTypes() const { return Types; } 156331994bf987efa0d40f33b5fdcdc01330c2aefe7Stephen Hines const std::vector<const llvm::BasicBlock*> &getBasicBlocks() const { 15723c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines return BasicBlocks; 1584cc499d6e5ec602309501873449c938af61170b2Stephen Hines } 15923c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines const std::vector<llvm::AttributeSet> &getAttributes() const { 16023c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines return Attribute; 1614cc499d6e5ec602309501873449c938af61170b2Stephen Hines } 1620da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines const std::vector<llvm::AttributeSet> &getAttributeGroups() const { 1630da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines return AttributeGroups; 1640da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines } 16523c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines 1664cc499d6e5ec602309501873449c938af61170b2Stephen Hines /// getGlobalBasicBlockID - This returns the function-specific ID for the 1674cc499d6e5ec602309501873449c938af61170b2Stephen Hines /// specified basic block. This is relatively expensive information, so it 1684cc499d6e5ec602309501873449c938af61170b2Stephen Hines /// should only be used by rare constructs such as address-of-label. 169331994bf987efa0d40f33b5fdcdc01330c2aefe7Stephen Hines unsigned getGlobalBasicBlockID(const llvm::BasicBlock *BB) const; 1704cc499d6e5ec602309501873449c938af61170b2Stephen Hines 1714cc499d6e5ec602309501873449c938af61170b2Stephen Hines /// incorporateFunction/purgeFunction - If you'd like to deal with a function, 1724cc499d6e5ec602309501873449c938af61170b2Stephen Hines /// use these two methods to get its data into the ValueEnumerator! 1734cc499d6e5ec602309501873449c938af61170b2Stephen Hines /// 174331994bf987efa0d40f33b5fdcdc01330c2aefe7Stephen Hines void incorporateFunction(const llvm::Function &F); 1754cc499d6e5ec602309501873449c938af61170b2Stephen Hines void purgeFunction(); 1764cc499d6e5ec602309501873449c938af61170b2Stephen Hines 1774cc499d6e5ec602309501873449c938af61170b2Stephen Hinesprivate: 1784cc499d6e5ec602309501873449c938af61170b2Stephen Hines void OptimizeConstants(unsigned CstStart, unsigned CstEnd); 17923c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines 180331994bf987efa0d40f33b5fdcdc01330c2aefe7Stephen Hines void EnumerateMDNodeOperands(const llvm::MDNode *N); 181c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines void EnumerateMetadata(const llvm::Metadata *MD); 182c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines void EnumerateFunctionLocalMetadata(const llvm::LocalAsMetadata *Local); 183331994bf987efa0d40f33b5fdcdc01330c2aefe7Stephen Hines void EnumerateNamedMDNode(const llvm::NamedMDNode *NMD); 184331994bf987efa0d40f33b5fdcdc01330c2aefe7Stephen Hines void EnumerateValue(const llvm::Value *V); 185331994bf987efa0d40f33b5fdcdc01330c2aefe7Stephen Hines void EnumerateType(llvm::Type *T); 186331994bf987efa0d40f33b5fdcdc01330c2aefe7Stephen Hines void EnumerateOperandType(const llvm::Value *V); 1870da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines void EnumerateAttributes(llvm::AttributeSet PAL); 18823c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines 189331994bf987efa0d40f33b5fdcdc01330c2aefe7Stephen Hines void EnumerateValueSymbolTable(const llvm::ValueSymbolTable &ST); 190c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines void EnumerateNamedMetadata(const llvm::Module &M); 1914cc499d6e5ec602309501873449c938af61170b2Stephen Hines}; 1924cc499d6e5ec602309501873449c938af61170b2Stephen Hines 193331994bf987efa0d40f33b5fdcdc01330c2aefe7Stephen Hines} // end llvm_2_9 namespace 1944cc499d6e5ec602309501873449c938af61170b2Stephen Hines 1954cc499d6e5ec602309501873449c938af61170b2Stephen Hines#endif 196