xref: /aosp_15_r20/external/llvm/lib/Bitcode/Writer/ValueEnumerator.h (revision 9880d6810fe72a1726cb53787c6711e909410d58)
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