1*9880d681SAndroid Build Coastguard Worker //===-- Bitcode/Writer/ValueEnumerator.h - Number values --------*- C++ -*-===// 2*9880d681SAndroid Build Coastguard Worker // 3*9880d681SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure 4*9880d681SAndroid Build Coastguard Worker // 5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source 6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details. 7*9880d681SAndroid Build Coastguard Worker // 8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 9*9880d681SAndroid Build Coastguard Worker // 10*9880d681SAndroid Build Coastguard Worker // This class gives values and types Unique ID's. 11*9880d681SAndroid Build Coastguard Worker // 12*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Worker #ifndef LLVM_LIB_BITCODE_WRITER_VALUEENUMERATOR_H 15*9880d681SAndroid Build Coastguard Worker #define LLVM_LIB_BITCODE_WRITER_VALUEENUMERATOR_H 16*9880d681SAndroid Build Coastguard Worker 17*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/DenseMap.h" 18*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/UniqueVector.h" 19*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Attributes.h" 20*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Metadata.h" 21*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Type.h" 22*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/UseListOrder.h" 23*9880d681SAndroid Build Coastguard Worker #include <vector> 24*9880d681SAndroid Build Coastguard Worker 25*9880d681SAndroid Build Coastguard Worker namespace llvm { 26*9880d681SAndroid Build Coastguard Worker 27*9880d681SAndroid Build Coastguard Worker class Type; 28*9880d681SAndroid Build Coastguard Worker class Value; 29*9880d681SAndroid Build Coastguard Worker class Instruction; 30*9880d681SAndroid Build Coastguard Worker class BasicBlock; 31*9880d681SAndroid Build Coastguard Worker class Comdat; 32*9880d681SAndroid Build Coastguard Worker class Function; 33*9880d681SAndroid Build Coastguard Worker class Module; 34*9880d681SAndroid Build Coastguard Worker class Metadata; 35*9880d681SAndroid Build Coastguard Worker class LocalAsMetadata; 36*9880d681SAndroid Build Coastguard Worker class MDNode; 37*9880d681SAndroid Build Coastguard Worker class MDOperand; 38*9880d681SAndroid Build Coastguard Worker class NamedMDNode; 39*9880d681SAndroid Build Coastguard Worker class AttributeSet; 40*9880d681SAndroid Build Coastguard Worker class ValueSymbolTable; 41*9880d681SAndroid Build Coastguard Worker class MDSymbolTable; 42*9880d681SAndroid Build Coastguard Worker class raw_ostream; 43*9880d681SAndroid Build Coastguard Worker 44*9880d681SAndroid Build Coastguard Worker class ValueEnumerator { 45*9880d681SAndroid Build Coastguard Worker public: 46*9880d681SAndroid Build Coastguard Worker typedef std::vector<Type*> TypeList; 47*9880d681SAndroid Build Coastguard Worker 48*9880d681SAndroid Build Coastguard Worker // For each value, we remember its Value* and occurrence frequency. 49*9880d681SAndroid Build Coastguard Worker typedef std::vector<std::pair<const Value*, unsigned> > ValueList; 50*9880d681SAndroid Build Coastguard Worker 51*9880d681SAndroid Build Coastguard Worker UseListOrderStack UseListOrders; 52*9880d681SAndroid Build Coastguard Worker 53*9880d681SAndroid Build Coastguard Worker private: 54*9880d681SAndroid Build Coastguard Worker typedef DenseMap<Type*, unsigned> TypeMapType; 55*9880d681SAndroid Build Coastguard Worker TypeMapType TypeMap; 56*9880d681SAndroid Build Coastguard Worker TypeList Types; 57*9880d681SAndroid Build Coastguard Worker 58*9880d681SAndroid Build Coastguard Worker typedef DenseMap<const Value*, unsigned> ValueMapType; 59*9880d681SAndroid Build Coastguard Worker ValueMapType ValueMap; 60*9880d681SAndroid Build Coastguard Worker ValueList Values; 61*9880d681SAndroid Build Coastguard Worker 62*9880d681SAndroid Build Coastguard Worker typedef UniqueVector<const Comdat *> ComdatSetType; 63*9880d681SAndroid Build Coastguard Worker ComdatSetType Comdats; 64*9880d681SAndroid Build Coastguard Worker 65*9880d681SAndroid Build Coastguard Worker std::vector<const Metadata *> MDs; 66*9880d681SAndroid Build Coastguard Worker std::vector<const Metadata *> FunctionMDs; 67*9880d681SAndroid Build Coastguard Worker 68*9880d681SAndroid Build Coastguard Worker /// Index of information about a piece of metadata. 69*9880d681SAndroid Build Coastguard Worker struct MDIndex { 70*9880d681SAndroid Build Coastguard Worker unsigned F = 0; ///< The ID of the function for this metadata, if any. 71*9880d681SAndroid Build Coastguard Worker unsigned ID = 0; ///< The implicit ID of this metadata in bitcode. 72*9880d681SAndroid Build Coastguard Worker 73*9880d681SAndroid Build Coastguard Worker MDIndex() = default; MDIndexMDIndex74*9880d681SAndroid Build Coastguard Worker explicit MDIndex(unsigned F) : F(F) {} 75*9880d681SAndroid Build Coastguard Worker 76*9880d681SAndroid Build Coastguard Worker /// Check if this has a function tag, and it's different from NewF. hasDifferentFunctionMDIndex77*9880d681SAndroid Build Coastguard Worker bool hasDifferentFunction(unsigned NewF) const { return F && F != NewF; } 78*9880d681SAndroid Build Coastguard Worker 79*9880d681SAndroid Build Coastguard Worker /// Fetch the MD this references out of the given metadata array. getMDIndex80*9880d681SAndroid Build Coastguard Worker const Metadata *get(ArrayRef<const Metadata *> MDs) const { 81*9880d681SAndroid Build Coastguard Worker assert(ID && "Expected non-zero ID"); 82*9880d681SAndroid Build Coastguard Worker assert(ID <= MDs.size() && "Expected valid ID"); 83*9880d681SAndroid Build Coastguard Worker return MDs[ID - 1]; 84*9880d681SAndroid Build Coastguard Worker } 85*9880d681SAndroid Build Coastguard Worker }; 86*9880d681SAndroid Build Coastguard Worker 87*9880d681SAndroid Build Coastguard Worker typedef DenseMap<const Metadata *, MDIndex> MetadataMapType; 88*9880d681SAndroid Build Coastguard Worker MetadataMapType MetadataMap; 89*9880d681SAndroid Build Coastguard Worker 90*9880d681SAndroid Build Coastguard Worker /// Range of metadata IDs, as a half-open range. 91*9880d681SAndroid Build Coastguard Worker struct MDRange { 92*9880d681SAndroid Build Coastguard Worker unsigned First = 0; 93*9880d681SAndroid Build Coastguard Worker unsigned Last = 0; 94*9880d681SAndroid Build Coastguard Worker 95*9880d681SAndroid Build Coastguard Worker /// Number of strings in the prefix of the metadata range. 96*9880d681SAndroid Build Coastguard Worker unsigned NumStrings = 0; 97*9880d681SAndroid Build Coastguard Worker 98*9880d681SAndroid Build Coastguard Worker MDRange() = default; MDRangeMDRange99*9880d681SAndroid Build Coastguard Worker explicit MDRange(unsigned First) : First(First) {} 100*9880d681SAndroid Build Coastguard Worker }; 101*9880d681SAndroid Build Coastguard Worker SmallDenseMap<unsigned, MDRange, 1> FunctionMDInfo; 102*9880d681SAndroid Build Coastguard Worker 103*9880d681SAndroid Build Coastguard Worker bool ShouldPreserveUseListOrder; 104*9880d681SAndroid Build Coastguard Worker 105*9880d681SAndroid Build Coastguard Worker typedef DenseMap<AttributeSet, unsigned> AttributeGroupMapType; 106*9880d681SAndroid Build Coastguard Worker AttributeGroupMapType AttributeGroupMap; 107*9880d681SAndroid Build Coastguard Worker std::vector<AttributeSet> AttributeGroups; 108*9880d681SAndroid Build Coastguard Worker 109*9880d681SAndroid Build Coastguard Worker typedef DenseMap<AttributeSet, unsigned> AttributeMapType; 110*9880d681SAndroid Build Coastguard Worker AttributeMapType AttributeMap; 111*9880d681SAndroid Build Coastguard Worker std::vector<AttributeSet> Attribute; 112*9880d681SAndroid Build Coastguard Worker 113*9880d681SAndroid Build Coastguard Worker /// GlobalBasicBlockIDs - This map memoizes the basic block ID's referenced by 114*9880d681SAndroid Build Coastguard Worker /// the "getGlobalBasicBlockID" method. 115*9880d681SAndroid Build Coastguard Worker mutable DenseMap<const BasicBlock*, unsigned> GlobalBasicBlockIDs; 116*9880d681SAndroid Build Coastguard Worker 117*9880d681SAndroid Build Coastguard Worker typedef DenseMap<const Instruction*, unsigned> InstructionMapType; 118*9880d681SAndroid Build Coastguard Worker InstructionMapType InstructionMap; 119*9880d681SAndroid Build Coastguard Worker unsigned InstructionCount; 120*9880d681SAndroid Build Coastguard Worker 121*9880d681SAndroid Build Coastguard Worker /// BasicBlocks - This contains all the basic blocks for the currently 122*9880d681SAndroid Build Coastguard Worker /// incorporated function. Their reverse mapping is stored in ValueMap. 123*9880d681SAndroid Build Coastguard Worker std::vector<const BasicBlock*> BasicBlocks; 124*9880d681SAndroid Build Coastguard Worker 125*9880d681SAndroid Build Coastguard Worker /// When a function is incorporated, this is the size of the Values list 126*9880d681SAndroid Build Coastguard Worker /// before incorporation. 127*9880d681SAndroid Build Coastguard Worker unsigned NumModuleValues; 128*9880d681SAndroid Build Coastguard Worker 129*9880d681SAndroid Build Coastguard Worker /// When a function is incorporated, this is the size of the Metadatas list 130*9880d681SAndroid Build Coastguard Worker /// before incorporation. 131*9880d681SAndroid Build Coastguard Worker unsigned NumModuleMDs = 0; 132*9880d681SAndroid Build Coastguard Worker unsigned NumMDStrings = 0; 133*9880d681SAndroid Build Coastguard Worker 134*9880d681SAndroid Build Coastguard Worker unsigned FirstFuncConstantID; 135*9880d681SAndroid Build Coastguard Worker unsigned FirstInstID; 136*9880d681SAndroid Build Coastguard Worker 137*9880d681SAndroid Build Coastguard Worker ValueEnumerator(const ValueEnumerator &) = delete; 138*9880d681SAndroid Build Coastguard Worker void operator=(const ValueEnumerator &) = delete; 139*9880d681SAndroid Build Coastguard Worker public: 140*9880d681SAndroid Build Coastguard Worker ValueEnumerator(const Module &M, bool ShouldPreserveUseListOrder); 141*9880d681SAndroid Build Coastguard Worker 142*9880d681SAndroid Build Coastguard Worker void dump() const; 143*9880d681SAndroid Build Coastguard Worker void print(raw_ostream &OS, const ValueMapType &Map, const char *Name) const; 144*9880d681SAndroid Build Coastguard Worker void print(raw_ostream &OS, const MetadataMapType &Map, 145*9880d681SAndroid Build Coastguard Worker const char *Name) const; 146*9880d681SAndroid Build Coastguard Worker 147*9880d681SAndroid Build Coastguard Worker unsigned getValueID(const Value *V) const; getMetadataID(const Metadata * MD)148*9880d681SAndroid Build Coastguard Worker unsigned getMetadataID(const Metadata *MD) const { 149*9880d681SAndroid Build Coastguard Worker auto ID = getMetadataOrNullID(MD); 150*9880d681SAndroid Build Coastguard Worker assert(ID != 0 && "Metadata not in slotcalculator!"); 151*9880d681SAndroid Build Coastguard Worker return ID - 1; 152*9880d681SAndroid Build Coastguard Worker } getMetadataOrNullID(const Metadata * MD)153*9880d681SAndroid Build Coastguard Worker unsigned getMetadataOrNullID(const Metadata *MD) const { 154*9880d681SAndroid Build Coastguard Worker return MetadataMap.lookup(MD).ID; 155*9880d681SAndroid Build Coastguard Worker } numMDs()156*9880d681SAndroid Build Coastguard Worker unsigned numMDs() const { return MDs.size(); } 157*9880d681SAndroid Build Coastguard Worker shouldPreserveUseListOrder()158*9880d681SAndroid Build Coastguard Worker bool shouldPreserveUseListOrder() const { return ShouldPreserveUseListOrder; } 159*9880d681SAndroid Build Coastguard Worker getTypeID(Type * T)160*9880d681SAndroid Build Coastguard Worker unsigned getTypeID(Type *T) const { 161*9880d681SAndroid Build Coastguard Worker TypeMapType::const_iterator I = TypeMap.find(T); 162*9880d681SAndroid Build Coastguard Worker assert(I != TypeMap.end() && "Type not in ValueEnumerator!"); 163*9880d681SAndroid Build Coastguard Worker return I->second-1; 164*9880d681SAndroid Build Coastguard Worker } 165*9880d681SAndroid Build Coastguard Worker 166*9880d681SAndroid Build Coastguard Worker unsigned getInstructionID(const Instruction *I) const; 167*9880d681SAndroid Build Coastguard Worker void setInstructionID(const Instruction *I); 168*9880d681SAndroid Build Coastguard Worker getAttributeID(AttributeSet PAL)169*9880d681SAndroid Build Coastguard Worker unsigned getAttributeID(AttributeSet PAL) const { 170*9880d681SAndroid Build Coastguard Worker if (PAL.isEmpty()) return 0; // Null maps to zero. 171*9880d681SAndroid Build Coastguard Worker AttributeMapType::const_iterator I = AttributeMap.find(PAL); 172*9880d681SAndroid Build Coastguard Worker assert(I != AttributeMap.end() && "Attribute not in ValueEnumerator!"); 173*9880d681SAndroid Build Coastguard Worker return I->second; 174*9880d681SAndroid Build Coastguard Worker } 175*9880d681SAndroid Build Coastguard Worker getAttributeGroupID(AttributeSet PAL)176*9880d681SAndroid Build Coastguard Worker unsigned getAttributeGroupID(AttributeSet PAL) const { 177*9880d681SAndroid Build Coastguard Worker if (PAL.isEmpty()) return 0; // Null maps to zero. 178*9880d681SAndroid Build Coastguard Worker AttributeGroupMapType::const_iterator I = AttributeGroupMap.find(PAL); 179*9880d681SAndroid Build Coastguard Worker assert(I != AttributeGroupMap.end() && "Attribute not in ValueEnumerator!"); 180*9880d681SAndroid Build Coastguard Worker return I->second; 181*9880d681SAndroid Build Coastguard Worker } 182*9880d681SAndroid Build Coastguard Worker 183*9880d681SAndroid Build Coastguard Worker /// getFunctionConstantRange - Return the range of values that corresponds to 184*9880d681SAndroid Build Coastguard Worker /// function-local constants. getFunctionConstantRange(unsigned & Start,unsigned & End)185*9880d681SAndroid Build Coastguard Worker void getFunctionConstantRange(unsigned &Start, unsigned &End) const { 186*9880d681SAndroid Build Coastguard Worker Start = FirstFuncConstantID; 187*9880d681SAndroid Build Coastguard Worker End = FirstInstID; 188*9880d681SAndroid Build Coastguard Worker } 189*9880d681SAndroid Build Coastguard Worker getValues()190*9880d681SAndroid Build Coastguard Worker const ValueList &getValues() const { return Values; } 191*9880d681SAndroid Build Coastguard Worker 192*9880d681SAndroid Build Coastguard Worker /// Check whether the current block has any metadata to emit. hasMDs()193*9880d681SAndroid Build Coastguard Worker bool hasMDs() const { return NumModuleMDs < MDs.size(); } 194*9880d681SAndroid Build Coastguard Worker 195*9880d681SAndroid Build Coastguard Worker /// Get the MDString metadata for this block. getMDStrings()196*9880d681SAndroid Build Coastguard Worker ArrayRef<const Metadata *> getMDStrings() const { 197*9880d681SAndroid Build Coastguard Worker return makeArrayRef(MDs).slice(NumModuleMDs, NumMDStrings); 198*9880d681SAndroid Build Coastguard Worker } 199*9880d681SAndroid Build Coastguard Worker 200*9880d681SAndroid Build Coastguard Worker /// Get the non-MDString metadata for this block. getNonMDStrings()201*9880d681SAndroid Build Coastguard Worker ArrayRef<const Metadata *> getNonMDStrings() const { 202*9880d681SAndroid Build Coastguard Worker return makeArrayRef(MDs).slice(NumModuleMDs).slice(NumMDStrings); 203*9880d681SAndroid Build Coastguard Worker } 204*9880d681SAndroid Build Coastguard Worker getTypes()205*9880d681SAndroid Build Coastguard Worker const TypeList &getTypes() const { return Types; } getBasicBlocks()206*9880d681SAndroid Build Coastguard Worker const std::vector<const BasicBlock*> &getBasicBlocks() const { 207*9880d681SAndroid Build Coastguard Worker return BasicBlocks; 208*9880d681SAndroid Build Coastguard Worker } getAttributes()209*9880d681SAndroid Build Coastguard Worker const std::vector<AttributeSet> &getAttributes() const { 210*9880d681SAndroid Build Coastguard Worker return Attribute; 211*9880d681SAndroid Build Coastguard Worker } getAttributeGroups()212*9880d681SAndroid Build Coastguard Worker const std::vector<AttributeSet> &getAttributeGroups() const { 213*9880d681SAndroid Build Coastguard Worker return AttributeGroups; 214*9880d681SAndroid Build Coastguard Worker } 215*9880d681SAndroid Build Coastguard Worker getComdats()216*9880d681SAndroid Build Coastguard Worker const ComdatSetType &getComdats() const { return Comdats; } 217*9880d681SAndroid Build Coastguard Worker unsigned getComdatID(const Comdat *C) const; 218*9880d681SAndroid Build Coastguard Worker 219*9880d681SAndroid Build Coastguard Worker /// getGlobalBasicBlockID - This returns the function-specific ID for the 220*9880d681SAndroid Build Coastguard Worker /// specified basic block. This is relatively expensive information, so it 221*9880d681SAndroid Build Coastguard Worker /// should only be used by rare constructs such as address-of-label. 222*9880d681SAndroid Build Coastguard Worker unsigned getGlobalBasicBlockID(const BasicBlock *BB) const; 223*9880d681SAndroid Build Coastguard Worker 224*9880d681SAndroid Build Coastguard Worker /// incorporateFunction/purgeFunction - If you'd like to deal with a function, 225*9880d681SAndroid Build Coastguard Worker /// use these two methods to get its data into the ValueEnumerator! 226*9880d681SAndroid Build Coastguard Worker /// 227*9880d681SAndroid Build Coastguard Worker void incorporateFunction(const Function &F); 228*9880d681SAndroid Build Coastguard Worker void purgeFunction(); 229*9880d681SAndroid Build Coastguard Worker uint64_t computeBitsRequiredForTypeIndicies() const; 230*9880d681SAndroid Build Coastguard Worker 231*9880d681SAndroid Build Coastguard Worker private: 232*9880d681SAndroid Build Coastguard Worker void OptimizeConstants(unsigned CstStart, unsigned CstEnd); 233*9880d681SAndroid Build Coastguard Worker 234*9880d681SAndroid Build Coastguard Worker /// Reorder the reachable metadata. 235*9880d681SAndroid Build Coastguard Worker /// 236*9880d681SAndroid Build Coastguard Worker /// This is not just an optimization, but is mandatory for emitting MDString 237*9880d681SAndroid Build Coastguard Worker /// correctly. 238*9880d681SAndroid Build Coastguard Worker void organizeMetadata(); 239*9880d681SAndroid Build Coastguard Worker 240*9880d681SAndroid Build Coastguard Worker /// Drop the function tag from the transitive operands of the given node. 241*9880d681SAndroid Build Coastguard Worker void dropFunctionFromMetadata(MetadataMapType::value_type &FirstMD); 242*9880d681SAndroid Build Coastguard Worker 243*9880d681SAndroid Build Coastguard Worker /// Incorporate the function metadata. 244*9880d681SAndroid Build Coastguard Worker /// 245*9880d681SAndroid Build Coastguard Worker /// This should be called before enumerating LocalAsMetadata for the 246*9880d681SAndroid Build Coastguard Worker /// function. 247*9880d681SAndroid Build Coastguard Worker void incorporateFunctionMetadata(const Function &F); 248*9880d681SAndroid Build Coastguard Worker 249*9880d681SAndroid Build Coastguard Worker /// Enumerate a single instance of metadata with the given function tag. 250*9880d681SAndroid Build Coastguard Worker /// 251*9880d681SAndroid Build Coastguard Worker /// If \c MD has already been enumerated, check that \c F matches its 252*9880d681SAndroid Build Coastguard Worker /// function tag. If not, call \a dropFunctionFromMetadata(). 253*9880d681SAndroid Build Coastguard Worker /// 254*9880d681SAndroid Build Coastguard Worker /// Otherwise, mark \c MD as visited. Assign it an ID, or just return it if 255*9880d681SAndroid Build Coastguard Worker /// it's an \a MDNode. 256*9880d681SAndroid Build Coastguard Worker const MDNode *enumerateMetadataImpl(unsigned F, const Metadata *MD); 257*9880d681SAndroid Build Coastguard Worker 258*9880d681SAndroid Build Coastguard Worker unsigned getMetadataFunctionID(const Function *F) const; 259*9880d681SAndroid Build Coastguard Worker 260*9880d681SAndroid Build Coastguard Worker /// Enumerate reachable metadata in (almost) post-order. 261*9880d681SAndroid Build Coastguard Worker /// 262*9880d681SAndroid Build Coastguard Worker /// Enumerate all the metadata reachable from MD. We want to minimize the 263*9880d681SAndroid Build Coastguard Worker /// cost of reading bitcode records, and so the primary consideration is that 264*9880d681SAndroid Build Coastguard Worker /// operands of uniqued nodes are resolved before the nodes are read. This 265*9880d681SAndroid Build Coastguard Worker /// avoids re-uniquing them on the context and factors away RAUW support. 266*9880d681SAndroid Build Coastguard Worker /// 267*9880d681SAndroid Build Coastguard Worker /// This algorithm guarantees that subgraphs of uniqued nodes are in 268*9880d681SAndroid Build Coastguard Worker /// post-order. Distinct subgraphs reachable only from a single uniqued node 269*9880d681SAndroid Build Coastguard Worker /// will be in post-order. 270*9880d681SAndroid Build Coastguard Worker /// 271*9880d681SAndroid Build Coastguard Worker /// \note The relative order of a distinct and uniqued node is irrelevant. 272*9880d681SAndroid Build Coastguard Worker /// \a organizeMetadata() will later partition distinct nodes ahead of 273*9880d681SAndroid Build Coastguard Worker /// uniqued ones. 274*9880d681SAndroid Build Coastguard Worker ///{ 275*9880d681SAndroid Build Coastguard Worker void EnumerateMetadata(const Function *F, const Metadata *MD); 276*9880d681SAndroid Build Coastguard Worker void EnumerateMetadata(unsigned F, const Metadata *MD); 277*9880d681SAndroid Build Coastguard Worker ///} 278*9880d681SAndroid Build Coastguard Worker 279*9880d681SAndroid Build Coastguard Worker void EnumerateFunctionLocalMetadata(const Function &F, 280*9880d681SAndroid Build Coastguard Worker const LocalAsMetadata *Local); 281*9880d681SAndroid Build Coastguard Worker void EnumerateFunctionLocalMetadata(unsigned F, const LocalAsMetadata *Local); 282*9880d681SAndroid Build Coastguard Worker void EnumerateNamedMDNode(const NamedMDNode *NMD); 283*9880d681SAndroid Build Coastguard Worker void EnumerateValue(const Value *V); 284*9880d681SAndroid Build Coastguard Worker void EnumerateType(Type *T); 285*9880d681SAndroid Build Coastguard Worker void EnumerateOperandType(const Value *V); 286*9880d681SAndroid Build Coastguard Worker void EnumerateAttributes(AttributeSet PAL); 287*9880d681SAndroid Build Coastguard Worker 288*9880d681SAndroid Build Coastguard Worker void EnumerateValueSymbolTable(const ValueSymbolTable &ST); 289*9880d681SAndroid Build Coastguard Worker void EnumerateNamedMetadata(const Module &M); 290*9880d681SAndroid Build Coastguard Worker }; 291*9880d681SAndroid Build Coastguard Worker 292*9880d681SAndroid Build Coastguard Worker } // End llvm namespace 293*9880d681SAndroid Build Coastguard Worker 294*9880d681SAndroid Build Coastguard Worker #endif 295