1fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattner//===-- Bitcode/Writer/ValueEnumerator.h - Number values --------*- C++ -*-===// 2fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattner// 3fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattner// The LLVM Compiler Infrastructure 4fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattner// 54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source 64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// License. See LICENSE.TXT for details. 7fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattner// 8fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattner//===----------------------------------------------------------------------===// 9fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattner// 10fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattner// This class gives values and types Unique ID's. 11fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattner// 12fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattner//===----------------------------------------------------------------------===// 13fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattner 1437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#ifndef LLVM_LIB_BITCODE_WRITER_VALUEENUMERATOR_H 1537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#define LLVM_LIB_BITCODE_WRITER_VALUEENUMERATOR_H 16fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattner 17fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattner#include "llvm/ADT/DenseMap.h" 18c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines#include "llvm/ADT/UniqueVector.h" 190b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Attributes.h" 20de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/IR/Metadata.h" 21de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/IR/Type.h" 2237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#include "llvm/IR/UseListOrder.h" 23fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattner#include <vector> 24fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattner 25fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattnernamespace llvm { 26fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattner 27fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattnerclass Type; 28c59c0afd7d24480f5a23d8fd6764ecfd6d4424ccChris Lattnerclass Value; 29e8e0213cc3daa2d0457c22e4c12e6973f21fc942Devang Patelclass Instruction; 30c59c0afd7d24480f5a23d8fd6764ecfd6d4424ccChris Lattnerclass BasicBlock; 31c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hinesclass Comdat; 32fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattnerclass Function; 33c59c0afd7d24480f5a23d8fd6764ecfd6d4424ccChris Lattnerclass Module; 34ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesclass Metadata; 35ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesclass LocalAsMetadata; 366209869f83979319e2e5791382f09b83e54191e0Devang Patelclass MDNode; 37de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarclass MDOperand; 388fba578be72dc98497508dec053e966858571f6aDevang Patelclass NamedMDNode; 3999faa3b4ec6d03ac7808fe4ff3fbf3d04e375502Bill Wendlingclass AttributeSet; 40fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattnerclass ValueSymbolTable; 410386f01e061513094504bc11f8352a40173cada7Devang Patelclass MDSymbolTable; 424e6c03fc3de8885b9a0a0b8069123b86d4834f08Chad Rosierclass raw_ostream; 43fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattner 44fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattnerclass ValueEnumerator { 45fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattnerpublic: 46db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner typedef std::vector<Type*> TypeList; 47fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattner 48fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattner // For each value, we remember its Value* and occurrence frequency. 49fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattner typedef std::vector<std::pair<const Value*, unsigned> > ValueList; 5037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 5137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines UseListOrderStack UseListOrders; 5237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 53fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattnerprivate: 54db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner typedef DenseMap<Type*, unsigned> TypeMapType; 55fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattner TypeMapType TypeMap; 562edd22b959f0d8f897cce397730a881c708e474aChris Lattner TypeList Types; 57fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattner 58fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattner typedef DenseMap<const Value*, unsigned> ValueMapType; 59fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattner ValueMapType ValueMap; 602edd22b959f0d8f897cce397730a881c708e474aChris Lattner ValueList Values; 61c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines 62c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines typedef UniqueVector<const Comdat *> ComdatSetType; 63c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines ComdatSetType Comdats; 64c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines 65ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines std::vector<const Metadata *> MDs; 66de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar std::vector<const Metadata *> FunctionMDs; 67de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 68de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /// Index of information about a piece of metadata. 69de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar struct MDIndex { 70de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar unsigned F = 0; ///< The ID of the function for this metadata, if any. 71de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar unsigned ID = 0; ///< The implicit ID of this metadata in bitcode. 72de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 73de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar MDIndex() = default; 74de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar explicit MDIndex(unsigned F) : F(F) {} 75de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 76de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /// Check if this has a function tag, and it's different from NewF. 77de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar bool hasDifferentFunction(unsigned NewF) const { return F && F != NewF; } 78de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 79de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /// Fetch the MD this references out of the given metadata array. 80de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar const Metadata *get(ArrayRef<const Metadata *> MDs) const { 81de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar assert(ID && "Expected non-zero ID"); 82de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar assert(ID <= MDs.size() && "Expected valid ID"); 83de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return MDs[ID - 1]; 84de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar } 85de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar }; 86de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 87de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar typedef DenseMap<const Metadata *, MDIndex> MetadataMapType; 88de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar MetadataMapType MetadataMap; 89de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 90de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /// Range of metadata IDs, as a half-open range. 91de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar struct MDRange { 92de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar unsigned First = 0; 93de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar unsigned Last = 0; 94de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 95de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /// Number of strings in the prefix of the metadata range. 96de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar unsigned NumStrings = 0; 97de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 98de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar MDRange() = default; 99de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar explicit MDRange(unsigned First) : First(First) {} 100de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar }; 101de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar SmallDenseMap<unsigned, MDRange, 1> FunctionMDInfo; 102de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 1030c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar bool ShouldPreserveUseListOrder; 104170a15e98dc6900df1ae40d03c5f0622d792fb45Joe Abbey 105e9229a6a9614cbde1bff2bd6ffae3b7336db5702Bill Wendling typedef DenseMap<AttributeSet, unsigned> AttributeGroupMapType; 106e9229a6a9614cbde1bff2bd6ffae3b7336db5702Bill Wendling AttributeGroupMapType AttributeGroupMap; 107e9229a6a9614cbde1bff2bd6ffae3b7336db5702Bill Wendling std::vector<AttributeSet> AttributeGroups; 1088c2e77f895301967bf37d04e905fb1f069ec91b2Bill Wendling 109105ea3d49d4a458af8779ae7f144f00d19c4168fBill Wendling typedef DenseMap<AttributeSet, unsigned> AttributeMapType; 1100598866c052147c31b808391f58434ce3dbfb838Devang Patel AttributeMapType AttributeMap; 111034b94b17006f51722886b0f2283fb6fb19aca1fBill Wendling std::vector<AttributeSet> Attribute; 112170a15e98dc6900df1ae40d03c5f0622d792fb45Joe Abbey 113837e04a8bf13712a4a8ae279daab65a048b21f7dChris Lattner /// GlobalBasicBlockIDs - This map memoizes the basic block ID's referenced by 114837e04a8bf13712a4a8ae279daab65a048b21f7dChris Lattner /// the "getGlobalBasicBlockID" method. 115837e04a8bf13712a4a8ae279daab65a048b21f7dChris Lattner mutable DenseMap<const BasicBlock*, unsigned> GlobalBasicBlockIDs; 116170a15e98dc6900df1ae40d03c5f0622d792fb45Joe Abbey 117e8e0213cc3daa2d0457c22e4c12e6973f21fc942Devang Patel typedef DenseMap<const Instruction*, unsigned> InstructionMapType; 118e8e0213cc3daa2d0457c22e4c12e6973f21fc942Devang Patel InstructionMapType InstructionMap; 119e8e0213cc3daa2d0457c22e4c12e6973f21fc942Devang Patel unsigned InstructionCount; 120e8e0213cc3daa2d0457c22e4c12e6973f21fc942Devang Patel 121c59c0afd7d24480f5a23d8fd6764ecfd6d4424ccChris Lattner /// BasicBlocks - This contains all the basic blocks for the currently 122c59c0afd7d24480f5a23d8fd6764ecfd6d4424ccChris Lattner /// incorporated function. Their reverse mapping is stored in ValueMap. 123c59c0afd7d24480f5a23d8fd6764ecfd6d4424ccChris Lattner std::vector<const BasicBlock*> BasicBlocks; 124170a15e98dc6900df1ae40d03c5f0622d792fb45Joe Abbey 1258d35c79f273b74df1e95b4472620e31e81342037Chris Lattner /// When a function is incorporated, this is the size of the Values list 1268d35c79f273b74df1e95b4472620e31e81342037Chris Lattner /// before incorporation. 127b9d0c2a6a0ef5e19b2d30180ce7d6a10ffa1f5c5Chris Lattner unsigned NumModuleValues; 128309b3af547a60bedd74daa2a94ebd3d3ed5f06e9Dan Gohman 129de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /// When a function is incorporated, this is the size of the Metadatas list 130309b3af547a60bedd74daa2a94ebd3d3ed5f06e9Dan Gohman /// before incorporation. 131de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar unsigned NumModuleMDs = 0; 132de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar unsigned NumMDStrings = 0; 133309b3af547a60bedd74daa2a94ebd3d3ed5f06e9Dan Gohman 134b9d0c2a6a0ef5e19b2d30180ce7d6a10ffa1f5c5Chris Lattner unsigned FirstFuncConstantID; 135b9d0c2a6a0ef5e19b2d30180ce7d6a10ffa1f5c5Chris Lattner unsigned FirstInstID; 13686a1c32e67b23c5e9e42dff9eb86e99ba15bb42fCraig Topper 137ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines ValueEnumerator(const ValueEnumerator &) = delete; 138ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines void operator=(const ValueEnumerator &) = delete; 139fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattnerpublic: 1400c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar ValueEnumerator(const Module &M, bool ShouldPreserveUseListOrder); 141fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattner 1424e6c03fc3de8885b9a0a0b8069123b86d4834f08Chad Rosier void dump() const; 1434e6c03fc3de8885b9a0a0b8069123b86d4834f08Chad Rosier void print(raw_ostream &OS, const ValueMapType &Map, const char *Name) const; 144ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines void print(raw_ostream &OS, const MetadataMapType &Map, 145ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines const char *Name) const; 1464e6c03fc3de8885b9a0a0b8069123b86d4834f08Chad Rosier 147d5ac40457b62f37f0abfb1d61064f7c7300e91eeDevang Patel unsigned getValueID(const Value *V) const; 148ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines unsigned getMetadataID(const Metadata *MD) const { 149ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines auto ID = getMetadataOrNullID(MD); 150ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines assert(ID != 0 && "Metadata not in slotcalculator!"); 151ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines return ID - 1; 152ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines } 153ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines unsigned getMetadataOrNullID(const Metadata *MD) const { 154de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return MetadataMap.lookup(MD).ID; 155ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines } 156f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar unsigned numMDs() const { return MDs.size(); } 157ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 1580c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar bool shouldPreserveUseListOrder() const { return ShouldPreserveUseListOrder; } 1590c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar 160db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner unsigned getTypeID(Type *T) const { 161fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattner TypeMapType::const_iterator I = TypeMap.find(T); 162fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattner assert(I != TypeMap.end() && "Type not in ValueEnumerator!"); 163fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattner return I->second-1; 164fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattner } 165e8e0213cc3daa2d0457c22e4c12e6973f21fc942Devang Patel 166e8e0213cc3daa2d0457c22e4c12e6973f21fc942Devang Patel unsigned getInstructionID(const Instruction *I) const; 167e8e0213cc3daa2d0457c22e4c12e6973f21fc942Devang Patel void setInstructionID(const Instruction *I); 168e8e0213cc3daa2d0457c22e4c12e6973f21fc942Devang Patel 169e9229a6a9614cbde1bff2bd6ffae3b7336db5702Bill Wendling unsigned getAttributeID(AttributeSet PAL) const { 17058d74910c6b82e622ecbb57d6644d48fec5a5c0fChris Lattner if (PAL.isEmpty()) return 0; // Null maps to zero. 171105ea3d49d4a458af8779ae7f144f00d19c4168fBill Wendling AttributeMapType::const_iterator I = AttributeMap.find(PAL); 1720598866c052147c31b808391f58434ce3dbfb838Devang Patel assert(I != AttributeMap.end() && "Attribute not in ValueEnumerator!"); 17350954f5cba406a88011cc8ade3ceb4235830f907Chris Lattner return I->second; 17450954f5cba406a88011cc8ade3ceb4235830f907Chris Lattner } 175fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattner 176e9229a6a9614cbde1bff2bd6ffae3b7336db5702Bill Wendling unsigned getAttributeGroupID(AttributeSet PAL) const { 1778c2e77f895301967bf37d04e905fb1f069ec91b2Bill Wendling if (PAL.isEmpty()) return 0; // Null maps to zero. 178e9229a6a9614cbde1bff2bd6ffae3b7336db5702Bill Wendling AttributeGroupMapType::const_iterator I = AttributeGroupMap.find(PAL); 179e9229a6a9614cbde1bff2bd6ffae3b7336db5702Bill Wendling assert(I != AttributeGroupMap.end() && "Attribute not in ValueEnumerator!"); 1808c2e77f895301967bf37d04e905fb1f069ec91b2Bill Wendling return I->second; 1818c2e77f895301967bf37d04e905fb1f069ec91b2Bill Wendling } 1828c2e77f895301967bf37d04e905fb1f069ec91b2Bill Wendling 183b9d0c2a6a0ef5e19b2d30180ce7d6a10ffa1f5c5Chris Lattner /// getFunctionConstantRange - Return the range of values that corresponds to 184b9d0c2a6a0ef5e19b2d30180ce7d6a10ffa1f5c5Chris Lattner /// function-local constants. 185b9d0c2a6a0ef5e19b2d30180ce7d6a10ffa1f5c5Chris Lattner void getFunctionConstantRange(unsigned &Start, unsigned &End) const { 186b9d0c2a6a0ef5e19b2d30180ce7d6a10ffa1f5c5Chris Lattner Start = FirstFuncConstantID; 187b9d0c2a6a0ef5e19b2d30180ce7d6a10ffa1f5c5Chris Lattner End = FirstInstID; 188b9d0c2a6a0ef5e19b2d30180ce7d6a10ffa1f5c5Chris Lattner } 189170a15e98dc6900df1ae40d03c5f0622d792fb45Joe Abbey 1902edd22b959f0d8f897cce397730a881c708e474aChris Lattner const ValueList &getValues() const { return Values; } 191de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 192de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /// Check whether the current block has any metadata to emit. 193de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar bool hasMDs() const { return NumModuleMDs < MDs.size(); } 194de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 195de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /// Get the MDString metadata for this block. 196de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ArrayRef<const Metadata *> getMDStrings() const { 197de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return makeArrayRef(MDs).slice(NumModuleMDs, NumMDStrings); 198de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar } 199de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 200de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /// Get the non-MDString metadata for this block. 201de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ArrayRef<const Metadata *> getNonMDStrings() const { 202de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return makeArrayRef(MDs).slice(NumModuleMDs).slice(NumMDStrings); 2036209869f83979319e2e5791382f09b83e54191e0Devang Patel } 204de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 205fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattner const TypeList &getTypes() const { return Types; } 206c59c0afd7d24480f5a23d8fd6764ecfd6d4424ccChris Lattner const std::vector<const BasicBlock*> &getBasicBlocks() const { 207170a15e98dc6900df1ae40d03c5f0622d792fb45Joe Abbey return BasicBlocks; 208c59c0afd7d24480f5a23d8fd6764ecfd6d4424ccChris Lattner } 20999faa3b4ec6d03ac7808fe4ff3fbf3d04e375502Bill Wendling const std::vector<AttributeSet> &getAttributes() const { 210034b94b17006f51722886b0f2283fb6fb19aca1fBill Wendling return Attribute; 21150954f5cba406a88011cc8ade3ceb4235830f907Chris Lattner } 212e9229a6a9614cbde1bff2bd6ffae3b7336db5702Bill Wendling const std::vector<AttributeSet> &getAttributeGroups() const { 213e9229a6a9614cbde1bff2bd6ffae3b7336db5702Bill Wendling return AttributeGroups; 2148c2e77f895301967bf37d04e905fb1f069ec91b2Bill Wendling } 215170a15e98dc6900df1ae40d03c5f0622d792fb45Joe Abbey 216c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines const ComdatSetType &getComdats() const { return Comdats; } 217c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines unsigned getComdatID(const Comdat *C) const; 218c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines 219837e04a8bf13712a4a8ae279daab65a048b21f7dChris Lattner /// getGlobalBasicBlockID - This returns the function-specific ID for the 220837e04a8bf13712a4a8ae279daab65a048b21f7dChris Lattner /// specified basic block. This is relatively expensive information, so it 221837e04a8bf13712a4a8ae279daab65a048b21f7dChris Lattner /// should only be used by rare constructs such as address-of-label. 222837e04a8bf13712a4a8ae279daab65a048b21f7dChris Lattner unsigned getGlobalBasicBlockID(const BasicBlock *BB) const; 223fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattner 2246a0c04dff288b7eaa0459cc7419159765bb5a0b9Chad Rosier /// incorporateFunction/purgeFunction - If you'd like to deal with a function, 225fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattner /// use these two methods to get its data into the ValueEnumerator! 226fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattner /// 2276a0c04dff288b7eaa0459cc7419159765bb5a0b9Chad Rosier void incorporateFunction(const Function &F); 2286a0c04dff288b7eaa0459cc7419159765bb5a0b9Chad Rosier void purgeFunction(); 229ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines uint64_t computeBitsRequiredForTypeIndicies() const; 230fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattner 231fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattnerprivate: 2326da91d3c2c138eb1d9739701a1314ba3580df897Chris Lattner void OptimizeConstants(unsigned CstStart, unsigned CstEnd); 233170a15e98dc6900df1ae40d03c5f0622d792fb45Joe Abbey 234de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /// Reorder the reachable metadata. 235de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /// 236de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /// This is not just an optimization, but is mandatory for emitting MDString 237de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /// correctly. 238de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar void organizeMetadata(); 239de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 240de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /// Drop the function tag from the transitive operands of the given node. 241de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar void dropFunctionFromMetadata(MetadataMapType::value_type &FirstMD); 242de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 243de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /// Incorporate the function metadata. 244de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /// 245de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /// This should be called before enumerating LocalAsMetadata for the 246de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /// function. 247de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar void incorporateFunctionMetadata(const Function &F); 248de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 249de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /// Enumerate a single instance of metadata with the given function tag. 250de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /// 251de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /// If \c MD has already been enumerated, check that \c F matches its 252de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /// function tag. If not, call \a dropFunctionFromMetadata(). 253de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /// 254de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /// Otherwise, mark \c MD as visited. Assign it an ID, or just return it if 255de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /// it's an \a MDNode. 256de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar const MDNode *enumerateMetadataImpl(unsigned F, const Metadata *MD); 257de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 258de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar unsigned getMetadataFunctionID(const Function *F) const; 259de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 260de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /// Enumerate reachable metadata in (almost) post-order. 261de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /// 262de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /// Enumerate all the metadata reachable from MD. We want to minimize the 263de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /// cost of reading bitcode records, and so the primary consideration is that 264de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /// operands of uniqued nodes are resolved before the nodes are read. This 265de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /// avoids re-uniquing them on the context and factors away RAUW support. 266de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /// 267de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /// This algorithm guarantees that subgraphs of uniqued nodes are in 268de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /// post-order. Distinct subgraphs reachable only from a single uniqued node 269de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /// will be in post-order. 270de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /// 271de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /// \note The relative order of a distinct and uniqued node is irrelevant. 272de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /// \a organizeMetadata() will later partition distinct nodes ahead of 273de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /// uniqued ones. 274de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ///{ 275de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar void EnumerateMetadata(const Function *F, const Metadata *MD); 276de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar void EnumerateMetadata(unsigned F, const Metadata *MD); 277de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ///} 278de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 279de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar void EnumerateFunctionLocalMetadata(const Function &F, 280de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar const LocalAsMetadata *Local); 281de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar void EnumerateFunctionLocalMetadata(unsigned F, const LocalAsMetadata *Local); 2828fba578be72dc98497508dec053e966858571f6aDevang Patel void EnumerateNamedMDNode(const NamedMDNode *NMD); 283d7e6457c3faf6c5530a4c8224e2dfcf91b57093bVictor Hernandez void EnumerateValue(const Value *V); 284db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner void EnumerateType(Type *T); 285d7e6457c3faf6c5530a4c8224e2dfcf91b57093bVictor Hernandez void EnumerateOperandType(const Value *V); 286105ea3d49d4a458af8779ae7f144f00d19c4168fBill Wendling void EnumerateAttributes(AttributeSet PAL); 287170a15e98dc6900df1ae40d03c5f0622d792fb45Joe Abbey 288fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattner void EnumerateValueSymbolTable(const ValueSymbolTable &ST); 28937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines void EnumerateNamedMetadata(const Module &M); 290fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattner}; 291fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattner 292fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattner} // End llvm namespace 293fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattner 294fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattner#endif 295