1f22ef01cSRoman Divacky //===-- ValueEnumerator.cpp - Number values and types for bitcode writer --===//
2f22ef01cSRoman Divacky //
3f22ef01cSRoman Divacky //                     The LLVM Compiler Infrastructure
4f22ef01cSRoman Divacky //
5f22ef01cSRoman Divacky // This file is distributed under the University of Illinois Open Source
6f22ef01cSRoman Divacky // License. See LICENSE.TXT for details.
7f22ef01cSRoman Divacky //
8f22ef01cSRoman Divacky //===----------------------------------------------------------------------===//
9f22ef01cSRoman Divacky //
10f22ef01cSRoman Divacky // This file implements the ValueEnumerator class.
11f22ef01cSRoman Divacky //
12f22ef01cSRoman Divacky //===----------------------------------------------------------------------===//
13f22ef01cSRoman Divacky 
14f22ef01cSRoman Divacky #include "ValueEnumerator.h"
153b0f4066SDimitry Andric #include "llvm/ADT/STLExtras.h"
16139f7f9bSDimitry Andric #include "llvm/ADT/SmallPtrSet.h"
17139f7f9bSDimitry Andric #include "llvm/IR/Constants.h"
18139f7f9bSDimitry Andric #include "llvm/IR/DerivedTypes.h"
19139f7f9bSDimitry Andric #include "llvm/IR/Instructions.h"
20139f7f9bSDimitry Andric #include "llvm/IR/Module.h"
21139f7f9bSDimitry Andric #include "llvm/IR/ValueSymbolTable.h"
22dff0c46cSDimitry Andric #include "llvm/Support/Debug.h"
23dff0c46cSDimitry Andric #include "llvm/Support/raw_ostream.h"
24f22ef01cSRoman Divacky #include <algorithm>
25f22ef01cSRoman Divacky using namespace llvm;
26f22ef01cSRoman Divacky 
27139f7f9bSDimitry Andric static bool isIntOrIntVectorValue(const std::pair<const Value*, unsigned> &V) {
28139f7f9bSDimitry Andric   return V.first->getType()->isIntOrIntVectorTy();
29f22ef01cSRoman Divacky }
30f22ef01cSRoman Divacky 
31f22ef01cSRoman Divacky /// ValueEnumerator - Enumerate module-level information.
32f22ef01cSRoman Divacky ValueEnumerator::ValueEnumerator(const Module *M) {
33f22ef01cSRoman Divacky   // Enumerate the global variables.
34f22ef01cSRoman Divacky   for (Module::const_global_iterator I = M->global_begin(),
35f22ef01cSRoman Divacky          E = M->global_end(); I != E; ++I)
36f22ef01cSRoman Divacky     EnumerateValue(I);
37f22ef01cSRoman Divacky 
38f22ef01cSRoman Divacky   // Enumerate the functions.
39f22ef01cSRoman Divacky   for (Module::const_iterator I = M->begin(), E = M->end(); I != E; ++I) {
40f22ef01cSRoman Divacky     EnumerateValue(I);
41f22ef01cSRoman Divacky     EnumerateAttributes(cast<Function>(I)->getAttributes());
42f22ef01cSRoman Divacky   }
43f22ef01cSRoman Divacky 
44f22ef01cSRoman Divacky   // Enumerate the aliases.
45f22ef01cSRoman Divacky   for (Module::const_alias_iterator I = M->alias_begin(), E = M->alias_end();
46f22ef01cSRoman Divacky        I != E; ++I)
47f22ef01cSRoman Divacky     EnumerateValue(I);
48f22ef01cSRoman Divacky 
49f22ef01cSRoman Divacky   // Remember what is the cutoff between globalvalue's and other constants.
50f22ef01cSRoman Divacky   unsigned FirstConstant = Values.size();
51f22ef01cSRoman Divacky 
52f22ef01cSRoman Divacky   // Enumerate the global variable initializers.
53f22ef01cSRoman Divacky   for (Module::const_global_iterator I = M->global_begin(),
54f22ef01cSRoman Divacky          E = M->global_end(); I != E; ++I)
55f22ef01cSRoman Divacky     if (I->hasInitializer())
56f22ef01cSRoman Divacky       EnumerateValue(I->getInitializer());
57f22ef01cSRoman Divacky 
58f22ef01cSRoman Divacky   // Enumerate the aliasees.
59f22ef01cSRoman Divacky   for (Module::const_alias_iterator I = M->alias_begin(), E = M->alias_end();
60f22ef01cSRoman Divacky        I != E; ++I)
61f22ef01cSRoman Divacky     EnumerateValue(I->getAliasee());
62f22ef01cSRoman Divacky 
63f785676fSDimitry Andric   // Enumerate the prefix data constants.
64f785676fSDimitry Andric   for (Module::const_iterator I = M->begin(), E = M->end(); I != E; ++I)
65f785676fSDimitry Andric     if (I->hasPrefixData())
66f785676fSDimitry Andric       EnumerateValue(I->getPrefixData());
67f785676fSDimitry Andric 
68f22ef01cSRoman Divacky   // Insert constants and metadata that are named at module level into the slot
69f22ef01cSRoman Divacky   // pool so that the module symbol table can refer to them...
70f22ef01cSRoman Divacky   EnumerateValueSymbolTable(M->getValueSymbolTable());
71e580952dSDimitry Andric   EnumerateNamedMetadata(M);
72f22ef01cSRoman Divacky 
73f22ef01cSRoman Divacky   SmallVector<std::pair<unsigned, MDNode*>, 8> MDs;
74f22ef01cSRoman Divacky 
75f22ef01cSRoman Divacky   // Enumerate types used by function bodies and argument lists.
76f22ef01cSRoman Divacky   for (Module::const_iterator F = M->begin(), E = M->end(); F != E; ++F) {
77f22ef01cSRoman Divacky 
78f22ef01cSRoman Divacky     for (Function::const_arg_iterator I = F->arg_begin(), E = F->arg_end();
79f22ef01cSRoman Divacky          I != E; ++I)
80f22ef01cSRoman Divacky       EnumerateType(I->getType());
81f22ef01cSRoman Divacky 
82f22ef01cSRoman Divacky     for (Function::const_iterator BB = F->begin(), E = F->end(); BB != E; ++BB)
83f22ef01cSRoman Divacky       for (BasicBlock::const_iterator I = BB->begin(), E = BB->end(); I!=E;++I){
84f22ef01cSRoman Divacky         for (User::const_op_iterator OI = I->op_begin(), E = I->op_end();
85f22ef01cSRoman Divacky              OI != E; ++OI) {
86f22ef01cSRoman Divacky           if (MDNode *MD = dyn_cast<MDNode>(*OI))
87f22ef01cSRoman Divacky             if (MD->isFunctionLocal() && MD->getFunction())
88f22ef01cSRoman Divacky               // These will get enumerated during function-incorporation.
89f22ef01cSRoman Divacky               continue;
90f22ef01cSRoman Divacky           EnumerateOperandType(*OI);
91f22ef01cSRoman Divacky         }
92f22ef01cSRoman Divacky         EnumerateType(I->getType());
93f22ef01cSRoman Divacky         if (const CallInst *CI = dyn_cast<CallInst>(I))
94f22ef01cSRoman Divacky           EnumerateAttributes(CI->getAttributes());
95f22ef01cSRoman Divacky         else if (const InvokeInst *II = dyn_cast<InvokeInst>(I))
96f22ef01cSRoman Divacky           EnumerateAttributes(II->getAttributes());
97f22ef01cSRoman Divacky 
98f22ef01cSRoman Divacky         // Enumerate metadata attached with this instruction.
99f22ef01cSRoman Divacky         MDs.clear();
100f22ef01cSRoman Divacky         I->getAllMetadataOtherThanDebugLoc(MDs);
101f22ef01cSRoman Divacky         for (unsigned i = 0, e = MDs.size(); i != e; ++i)
102f22ef01cSRoman Divacky           EnumerateMetadata(MDs[i].second);
103f22ef01cSRoman Divacky 
104f22ef01cSRoman Divacky         if (!I->getDebugLoc().isUnknown()) {
105f22ef01cSRoman Divacky           MDNode *Scope, *IA;
106f22ef01cSRoman Divacky           I->getDebugLoc().getScopeAndInlinedAt(Scope, IA, I->getContext());
107f22ef01cSRoman Divacky           if (Scope) EnumerateMetadata(Scope);
108f22ef01cSRoman Divacky           if (IA) EnumerateMetadata(IA);
109f22ef01cSRoman Divacky         }
110f22ef01cSRoman Divacky       }
111f22ef01cSRoman Divacky   }
112f22ef01cSRoman Divacky 
113f22ef01cSRoman Divacky   // Optimize constant ordering.
114f22ef01cSRoman Divacky   OptimizeConstants(FirstConstant, Values.size());
1153b0f4066SDimitry Andric }
1163b0f4066SDimitry Andric 
117f22ef01cSRoman Divacky unsigned ValueEnumerator::getInstructionID(const Instruction *Inst) const {
118f22ef01cSRoman Divacky   InstructionMapType::const_iterator I = InstructionMap.find(Inst);
119f22ef01cSRoman Divacky   assert(I != InstructionMap.end() && "Instruction is not mapped!");
120f22ef01cSRoman Divacky   return I->second;
121f22ef01cSRoman Divacky }
122f22ef01cSRoman Divacky 
123f22ef01cSRoman Divacky void ValueEnumerator::setInstructionID(const Instruction *I) {
124f22ef01cSRoman Divacky   InstructionMap[I] = InstructionCount++;
125f22ef01cSRoman Divacky }
126f22ef01cSRoman Divacky 
127f22ef01cSRoman Divacky unsigned ValueEnumerator::getValueID(const Value *V) const {
128f22ef01cSRoman Divacky   if (isa<MDNode>(V) || isa<MDString>(V)) {
129f22ef01cSRoman Divacky     ValueMapType::const_iterator I = MDValueMap.find(V);
130f22ef01cSRoman Divacky     assert(I != MDValueMap.end() && "Value not in slotcalculator!");
131f22ef01cSRoman Divacky     return I->second-1;
132f22ef01cSRoman Divacky   }
133f22ef01cSRoman Divacky 
134f22ef01cSRoman Divacky   ValueMapType::const_iterator I = ValueMap.find(V);
135f22ef01cSRoman Divacky   assert(I != ValueMap.end() && "Value not in slotcalculator!");
136f22ef01cSRoman Divacky   return I->second-1;
137f22ef01cSRoman Divacky }
138f22ef01cSRoman Divacky 
139dff0c46cSDimitry Andric void ValueEnumerator::dump() const {
140dff0c46cSDimitry Andric   print(dbgs(), ValueMap, "Default");
141dff0c46cSDimitry Andric   dbgs() << '\n';
142dff0c46cSDimitry Andric   print(dbgs(), MDValueMap, "MetaData");
143dff0c46cSDimitry Andric   dbgs() << '\n';
144dff0c46cSDimitry Andric }
145dff0c46cSDimitry Andric 
146dff0c46cSDimitry Andric void ValueEnumerator::print(raw_ostream &OS, const ValueMapType &Map,
147dff0c46cSDimitry Andric                             const char *Name) const {
148dff0c46cSDimitry Andric 
149dff0c46cSDimitry Andric   OS << "Map Name: " << Name << "\n";
150dff0c46cSDimitry Andric   OS << "Size: " << Map.size() << "\n";
151dff0c46cSDimitry Andric   for (ValueMapType::const_iterator I = Map.begin(),
152dff0c46cSDimitry Andric          E = Map.end(); I != E; ++I) {
153dff0c46cSDimitry Andric 
154dff0c46cSDimitry Andric     const Value *V = I->first;
155dff0c46cSDimitry Andric     if (V->hasName())
156dff0c46cSDimitry Andric       OS << "Value: " << V->getName();
157dff0c46cSDimitry Andric     else
158dff0c46cSDimitry Andric       OS << "Value: [null]\n";
159dff0c46cSDimitry Andric     V->dump();
160dff0c46cSDimitry Andric 
161dff0c46cSDimitry Andric     OS << " Uses(" << std::distance(V->use_begin(),V->use_end()) << "):";
162dff0c46cSDimitry Andric     for (Value::const_use_iterator UI = V->use_begin(), UE = V->use_end();
163dff0c46cSDimitry Andric          UI != UE; ++UI) {
164dff0c46cSDimitry Andric       if (UI != V->use_begin())
165dff0c46cSDimitry Andric         OS << ",";
166dff0c46cSDimitry Andric       if((*UI)->hasName())
167dff0c46cSDimitry Andric         OS << " " << (*UI)->getName();
168dff0c46cSDimitry Andric       else
169dff0c46cSDimitry Andric         OS << " [null]";
170dff0c46cSDimitry Andric 
171dff0c46cSDimitry Andric     }
172dff0c46cSDimitry Andric     OS <<  "\n\n";
173dff0c46cSDimitry Andric   }
174dff0c46cSDimitry Andric }
175dff0c46cSDimitry Andric 
176f22ef01cSRoman Divacky // Optimize constant ordering.
177f22ef01cSRoman Divacky namespace {
178f22ef01cSRoman Divacky   struct CstSortPredicate {
179f22ef01cSRoman Divacky     ValueEnumerator &VE;
180f22ef01cSRoman Divacky     explicit CstSortPredicate(ValueEnumerator &ve) : VE(ve) {}
181f22ef01cSRoman Divacky     bool operator()(const std::pair<const Value*, unsigned> &LHS,
182f22ef01cSRoman Divacky                     const std::pair<const Value*, unsigned> &RHS) {
183f22ef01cSRoman Divacky       // Sort by plane.
184f22ef01cSRoman Divacky       if (LHS.first->getType() != RHS.first->getType())
185f22ef01cSRoman Divacky         return VE.getTypeID(LHS.first->getType()) <
186f22ef01cSRoman Divacky                VE.getTypeID(RHS.first->getType());
187f22ef01cSRoman Divacky       // Then by frequency.
188f22ef01cSRoman Divacky       return LHS.second > RHS.second;
189f22ef01cSRoman Divacky     }
190f22ef01cSRoman Divacky   };
191f22ef01cSRoman Divacky }
192f22ef01cSRoman Divacky 
193f22ef01cSRoman Divacky /// OptimizeConstants - Reorder constant pool for denser encoding.
194f22ef01cSRoman Divacky void ValueEnumerator::OptimizeConstants(unsigned CstStart, unsigned CstEnd) {
195f22ef01cSRoman Divacky   if (CstStart == CstEnd || CstStart+1 == CstEnd) return;
196f22ef01cSRoman Divacky 
197f22ef01cSRoman Divacky   CstSortPredicate P(*this);
198f22ef01cSRoman Divacky   std::stable_sort(Values.begin()+CstStart, Values.begin()+CstEnd, P);
199f22ef01cSRoman Divacky 
200139f7f9bSDimitry Andric   // Ensure that integer and vector of integer constants are at the start of the
201139f7f9bSDimitry Andric   // constant pool.  This is important so that GEP structure indices come before
202139f7f9bSDimitry Andric   // gep constant exprs.
203f22ef01cSRoman Divacky   std::partition(Values.begin()+CstStart, Values.begin()+CstEnd,
204139f7f9bSDimitry Andric                  isIntOrIntVectorValue);
205f22ef01cSRoman Divacky 
206f22ef01cSRoman Divacky   // Rebuild the modified portion of ValueMap.
207f22ef01cSRoman Divacky   for (; CstStart != CstEnd; ++CstStart)
208f22ef01cSRoman Divacky     ValueMap[Values[CstStart].first] = CstStart+1;
209f22ef01cSRoman Divacky }
210f22ef01cSRoman Divacky 
211f22ef01cSRoman Divacky 
212f22ef01cSRoman Divacky /// EnumerateValueSymbolTable - Insert all of the values in the specified symbol
213f22ef01cSRoman Divacky /// table into the values table.
214f22ef01cSRoman Divacky void ValueEnumerator::EnumerateValueSymbolTable(const ValueSymbolTable &VST) {
215f22ef01cSRoman Divacky   for (ValueSymbolTable::const_iterator VI = VST.begin(), VE = VST.end();
216f22ef01cSRoman Divacky        VI != VE; ++VI)
217f22ef01cSRoman Divacky     EnumerateValue(VI->getValue());
218f22ef01cSRoman Divacky }
219f22ef01cSRoman Divacky 
220e580952dSDimitry Andric /// EnumerateNamedMetadata - Insert all of the values referenced by
221e580952dSDimitry Andric /// named metadata in the specified module.
222e580952dSDimitry Andric void ValueEnumerator::EnumerateNamedMetadata(const Module *M) {
223e580952dSDimitry Andric   for (Module::const_named_metadata_iterator I = M->named_metadata_begin(),
224e580952dSDimitry Andric        E = M->named_metadata_end(); I != E; ++I)
225e580952dSDimitry Andric     EnumerateNamedMDNode(I);
226f22ef01cSRoman Divacky }
227f22ef01cSRoman Divacky 
228f22ef01cSRoman Divacky void ValueEnumerator::EnumerateNamedMDNode(const NamedMDNode *MD) {
229e580952dSDimitry Andric   for (unsigned i = 0, e = MD->getNumOperands(); i != e; ++i)
230e580952dSDimitry Andric     EnumerateMetadata(MD->getOperand(i));
231f22ef01cSRoman Divacky }
232f22ef01cSRoman Divacky 
233e580952dSDimitry Andric /// EnumerateMDNodeOperands - Enumerate all non-function-local values
234e580952dSDimitry Andric /// and types referenced by the given MDNode.
235e580952dSDimitry Andric void ValueEnumerator::EnumerateMDNodeOperands(const MDNode *N) {
236e580952dSDimitry Andric   for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i) {
237e580952dSDimitry Andric     if (Value *V = N->getOperand(i)) {
238e580952dSDimitry Andric       if (isa<MDNode>(V) || isa<MDString>(V))
239e580952dSDimitry Andric         EnumerateMetadata(V);
240e580952dSDimitry Andric       else if (!isa<Instruction>(V) && !isa<Argument>(V))
241e580952dSDimitry Andric         EnumerateValue(V);
242e580952dSDimitry Andric     } else
243e580952dSDimitry Andric       EnumerateType(Type::getVoidTy(N->getContext()));
244e580952dSDimitry Andric   }
245f22ef01cSRoman Divacky }
246f22ef01cSRoman Divacky 
247f22ef01cSRoman Divacky void ValueEnumerator::EnumerateMetadata(const Value *MD) {
248f22ef01cSRoman Divacky   assert((isa<MDNode>(MD) || isa<MDString>(MD)) && "Invalid metadata kind");
249e580952dSDimitry Andric 
250e580952dSDimitry Andric   // Enumerate the type of this value.
251e580952dSDimitry Andric   EnumerateType(MD->getType());
252e580952dSDimitry Andric 
253e580952dSDimitry Andric   const MDNode *N = dyn_cast<MDNode>(MD);
254e580952dSDimitry Andric 
255e580952dSDimitry Andric   // In the module-level pass, skip function-local nodes themselves, but
256e580952dSDimitry Andric   // do walk their operands.
257e580952dSDimitry Andric   if (N && N->isFunctionLocal() && N->getFunction()) {
258e580952dSDimitry Andric     EnumerateMDNodeOperands(N);
259e580952dSDimitry Andric     return;
260e580952dSDimitry Andric   }
261e580952dSDimitry Andric 
262f22ef01cSRoman Divacky   // Check to see if it's already in!
263f22ef01cSRoman Divacky   unsigned &MDValueID = MDValueMap[MD];
264f22ef01cSRoman Divacky   if (MDValueID) {
265f22ef01cSRoman Divacky     // Increment use count.
266f22ef01cSRoman Divacky     MDValues[MDValueID-1].second++;
267f22ef01cSRoman Divacky     return;
268f22ef01cSRoman Divacky   }
269e580952dSDimitry Andric   MDValues.push_back(std::make_pair(MD, 1U));
270e580952dSDimitry Andric   MDValueID = MDValues.size();
271e580952dSDimitry Andric 
272e580952dSDimitry Andric   // Enumerate all non-function-local operands.
273e580952dSDimitry Andric   if (N)
274e580952dSDimitry Andric     EnumerateMDNodeOperands(N);
275e580952dSDimitry Andric }
276e580952dSDimitry Andric 
277e580952dSDimitry Andric /// EnumerateFunctionLocalMetadataa - Incorporate function-local metadata
278e580952dSDimitry Andric /// information reachable from the given MDNode.
279e580952dSDimitry Andric void ValueEnumerator::EnumerateFunctionLocalMetadata(const MDNode *N) {
280e580952dSDimitry Andric   assert(N->isFunctionLocal() && N->getFunction() &&
281e580952dSDimitry Andric          "EnumerateFunctionLocalMetadata called on non-function-local mdnode!");
282f22ef01cSRoman Divacky 
283f22ef01cSRoman Divacky   // Enumerate the type of this value.
284e580952dSDimitry Andric   EnumerateType(N->getType());
285f22ef01cSRoman Divacky 
286e580952dSDimitry Andric   // Check to see if it's already in!
287e580952dSDimitry Andric   unsigned &MDValueID = MDValueMap[N];
288e580952dSDimitry Andric   if (MDValueID) {
289e580952dSDimitry Andric     // Increment use count.
290e580952dSDimitry Andric     MDValues[MDValueID-1].second++;
291f22ef01cSRoman Divacky     return;
292f22ef01cSRoman Divacky   }
293e580952dSDimitry Andric   MDValues.push_back(std::make_pair(N, 1U));
294f22ef01cSRoman Divacky   MDValueID = MDValues.size();
295e580952dSDimitry Andric 
296e580952dSDimitry Andric   // To incoroporate function-local information visit all function-local
297e580952dSDimitry Andric   // MDNodes and all function-local values they reference.
298e580952dSDimitry Andric   for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i)
299e580952dSDimitry Andric     if (Value *V = N->getOperand(i)) {
300e580952dSDimitry Andric       if (MDNode *O = dyn_cast<MDNode>(V)) {
301e580952dSDimitry Andric         if (O->isFunctionLocal() && O->getFunction())
302e580952dSDimitry Andric           EnumerateFunctionLocalMetadata(O);
303e580952dSDimitry Andric       } else if (isa<Instruction>(V) || isa<Argument>(V))
304e580952dSDimitry Andric         EnumerateValue(V);
305e580952dSDimitry Andric     }
306e580952dSDimitry Andric 
307e580952dSDimitry Andric   // Also, collect all function-local MDNodes for easy access.
308e580952dSDimitry Andric   FunctionLocalMDs.push_back(N);
309f22ef01cSRoman Divacky }
310f22ef01cSRoman Divacky 
311f22ef01cSRoman Divacky void ValueEnumerator::EnumerateValue(const Value *V) {
312f22ef01cSRoman Divacky   assert(!V->getType()->isVoidTy() && "Can't insert void values!");
313e580952dSDimitry Andric   assert(!isa<MDNode>(V) && !isa<MDString>(V) &&
314e580952dSDimitry Andric          "EnumerateValue doesn't handle Metadata!");
315f22ef01cSRoman Divacky 
316f22ef01cSRoman Divacky   // Check to see if it's already in!
317f22ef01cSRoman Divacky   unsigned &ValueID = ValueMap[V];
318f22ef01cSRoman Divacky   if (ValueID) {
319f22ef01cSRoman Divacky     // Increment use count.
320f22ef01cSRoman Divacky     Values[ValueID-1].second++;
321f22ef01cSRoman Divacky     return;
322f22ef01cSRoman Divacky   }
323f22ef01cSRoman Divacky 
324f22ef01cSRoman Divacky   // Enumerate the type of this value.
325f22ef01cSRoman Divacky   EnumerateType(V->getType());
326f22ef01cSRoman Divacky 
327f22ef01cSRoman Divacky   if (const Constant *C = dyn_cast<Constant>(V)) {
328f22ef01cSRoman Divacky     if (isa<GlobalValue>(C)) {
329f22ef01cSRoman Divacky       // Initializers for globals are handled explicitly elsewhere.
330f22ef01cSRoman Divacky     } else if (C->getNumOperands()) {
331f22ef01cSRoman Divacky       // If a constant has operands, enumerate them.  This makes sure that if a
332f22ef01cSRoman Divacky       // constant has uses (for example an array of const ints), that they are
333f22ef01cSRoman Divacky       // inserted also.
334f22ef01cSRoman Divacky 
335f22ef01cSRoman Divacky       // We prefer to enumerate them with values before we enumerate the user
336f22ef01cSRoman Divacky       // itself.  This makes it more likely that we can avoid forward references
337f22ef01cSRoman Divacky       // in the reader.  We know that there can be no cycles in the constants
338f22ef01cSRoman Divacky       // graph that don't go through a global variable.
339f22ef01cSRoman Divacky       for (User::const_op_iterator I = C->op_begin(), E = C->op_end();
340f22ef01cSRoman Divacky            I != E; ++I)
341f22ef01cSRoman Divacky         if (!isa<BasicBlock>(*I)) // Don't enumerate BB operand to BlockAddress.
342f22ef01cSRoman Divacky           EnumerateValue(*I);
343f22ef01cSRoman Divacky 
344f22ef01cSRoman Divacky       // Finally, add the value.  Doing this could make the ValueID reference be
345f22ef01cSRoman Divacky       // dangling, don't reuse it.
346f22ef01cSRoman Divacky       Values.push_back(std::make_pair(V, 1U));
347f22ef01cSRoman Divacky       ValueMap[V] = Values.size();
348f22ef01cSRoman Divacky       return;
349f22ef01cSRoman Divacky     }
350f22ef01cSRoman Divacky   }
351f22ef01cSRoman Divacky 
352f22ef01cSRoman Divacky   // Add the value.
353f22ef01cSRoman Divacky   Values.push_back(std::make_pair(V, 1U));
354f22ef01cSRoman Divacky   ValueID = Values.size();
355f22ef01cSRoman Divacky }
356f22ef01cSRoman Divacky 
357f22ef01cSRoman Divacky 
3586122f3e6SDimitry Andric void ValueEnumerator::EnumerateType(Type *Ty) {
35917a519f9SDimitry Andric   unsigned *TypeID = &TypeMap[Ty];
360f22ef01cSRoman Divacky 
3613b0f4066SDimitry Andric   // We've already seen this type.
36217a519f9SDimitry Andric   if (*TypeID)
363f22ef01cSRoman Divacky     return;
364f22ef01cSRoman Divacky 
36517a519f9SDimitry Andric   // If it is a non-anonymous struct, mark the type as being visited so that we
36617a519f9SDimitry Andric   // don't recursively visit it.  This is safe because we allow forward
36717a519f9SDimitry Andric   // references of these in the bitcode reader.
3686122f3e6SDimitry Andric   if (StructType *STy = dyn_cast<StructType>(Ty))
3696122f3e6SDimitry Andric     if (!STy->isLiteral())
37017a519f9SDimitry Andric       *TypeID = ~0U;
371f22ef01cSRoman Divacky 
37217a519f9SDimitry Andric   // Enumerate all of the subtypes before we enumerate this type.  This ensures
37317a519f9SDimitry Andric   // that the type will be enumerated in an order that can be directly built.
374f22ef01cSRoman Divacky   for (Type::subtype_iterator I = Ty->subtype_begin(), E = Ty->subtype_end();
375f22ef01cSRoman Divacky        I != E; ++I)
376f22ef01cSRoman Divacky     EnumerateType(*I);
37717a519f9SDimitry Andric 
37817a519f9SDimitry Andric   // Refresh the TypeID pointer in case the table rehashed.
37917a519f9SDimitry Andric   TypeID = &TypeMap[Ty];
38017a519f9SDimitry Andric 
38117a519f9SDimitry Andric   // Check to see if we got the pointer another way.  This can happen when
38217a519f9SDimitry Andric   // enumerating recursive types that hit the base case deeper than they start.
38317a519f9SDimitry Andric   //
38417a519f9SDimitry Andric   // If this is actually a struct that we are treating as forward ref'able,
38517a519f9SDimitry Andric   // then emit the definition now that all of its contents are available.
38617a519f9SDimitry Andric   if (*TypeID && *TypeID != ~0U)
38717a519f9SDimitry Andric     return;
38817a519f9SDimitry Andric 
38917a519f9SDimitry Andric   // Add this type now that its contents are all happily enumerated.
39017a519f9SDimitry Andric   Types.push_back(Ty);
39117a519f9SDimitry Andric 
39217a519f9SDimitry Andric   *TypeID = Types.size();
393f22ef01cSRoman Divacky }
394f22ef01cSRoman Divacky 
395f22ef01cSRoman Divacky // Enumerate the types for the specified value.  If the value is a constant,
396f22ef01cSRoman Divacky // walk through it, enumerating the types of the constant.
397f22ef01cSRoman Divacky void ValueEnumerator::EnumerateOperandType(const Value *V) {
398f22ef01cSRoman Divacky   EnumerateType(V->getType());
399f22ef01cSRoman Divacky 
400f22ef01cSRoman Divacky   if (const Constant *C = dyn_cast<Constant>(V)) {
401f22ef01cSRoman Divacky     // If this constant is already enumerated, ignore it, we know its type must
402f22ef01cSRoman Divacky     // be enumerated.
403f22ef01cSRoman Divacky     if (ValueMap.count(V)) return;
404f22ef01cSRoman Divacky 
405f22ef01cSRoman Divacky     // This constant may have operands, make sure to enumerate the types in
406f22ef01cSRoman Divacky     // them.
407f22ef01cSRoman Divacky     for (unsigned i = 0, e = C->getNumOperands(); i != e; ++i) {
4083b0f4066SDimitry Andric       const Value *Op = C->getOperand(i);
409f22ef01cSRoman Divacky 
410f22ef01cSRoman Divacky       // Don't enumerate basic blocks here, this happens as operands to
411f22ef01cSRoman Divacky       // blockaddress.
412f22ef01cSRoman Divacky       if (isa<BasicBlock>(Op)) continue;
413f22ef01cSRoman Divacky 
414e580952dSDimitry Andric       EnumerateOperandType(Op);
415f22ef01cSRoman Divacky     }
416f22ef01cSRoman Divacky 
417f22ef01cSRoman Divacky     if (const MDNode *N = dyn_cast<MDNode>(V)) {
418f22ef01cSRoman Divacky       for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i)
419f22ef01cSRoman Divacky         if (Value *Elem = N->getOperand(i))
420f22ef01cSRoman Divacky           EnumerateOperandType(Elem);
421f22ef01cSRoman Divacky     }
422f22ef01cSRoman Divacky   } else if (isa<MDString>(V) || isa<MDNode>(V))
423e580952dSDimitry Andric     EnumerateMetadata(V);
424f22ef01cSRoman Divacky }
425f22ef01cSRoman Divacky 
426139f7f9bSDimitry Andric void ValueEnumerator::EnumerateAttributes(AttributeSet PAL) {
427f22ef01cSRoman Divacky   if (PAL.isEmpty()) return;  // null is always 0.
428139f7f9bSDimitry Andric 
429f22ef01cSRoman Divacky   // Do a lookup.
430139f7f9bSDimitry Andric   unsigned &Entry = AttributeMap[PAL];
431f22ef01cSRoman Divacky   if (Entry == 0) {
432f22ef01cSRoman Divacky     // Never saw this before, add it.
433139f7f9bSDimitry Andric     Attribute.push_back(PAL);
434139f7f9bSDimitry Andric     Entry = Attribute.size();
435139f7f9bSDimitry Andric   }
436139f7f9bSDimitry Andric 
437139f7f9bSDimitry Andric   // Do lookups for all attribute groups.
438139f7f9bSDimitry Andric   for (unsigned i = 0, e = PAL.getNumSlots(); i != e; ++i) {
439139f7f9bSDimitry Andric     AttributeSet AS = PAL.getSlotAttributes(i);
440139f7f9bSDimitry Andric     unsigned &Entry = AttributeGroupMap[AS];
441139f7f9bSDimitry Andric     if (Entry == 0) {
442139f7f9bSDimitry Andric       AttributeGroups.push_back(AS);
443139f7f9bSDimitry Andric       Entry = AttributeGroups.size();
444139f7f9bSDimitry Andric     }
445f22ef01cSRoman Divacky   }
446f22ef01cSRoman Divacky }
447f22ef01cSRoman Divacky 
448f22ef01cSRoman Divacky void ValueEnumerator::incorporateFunction(const Function &F) {
449f22ef01cSRoman Divacky   InstructionCount = 0;
450f22ef01cSRoman Divacky   NumModuleValues = Values.size();
451e580952dSDimitry Andric   NumModuleMDValues = MDValues.size();
452f22ef01cSRoman Divacky 
453f22ef01cSRoman Divacky   // Adding function arguments to the value table.
454f22ef01cSRoman Divacky   for (Function::const_arg_iterator I = F.arg_begin(), E = F.arg_end();
455f22ef01cSRoman Divacky        I != E; ++I)
456f22ef01cSRoman Divacky     EnumerateValue(I);
457f22ef01cSRoman Divacky 
458f22ef01cSRoman Divacky   FirstFuncConstantID = Values.size();
459f22ef01cSRoman Divacky 
460f22ef01cSRoman Divacky   // Add all function-level constants to the value table.
461f22ef01cSRoman Divacky   for (Function::const_iterator BB = F.begin(), E = F.end(); BB != E; ++BB) {
462f22ef01cSRoman Divacky     for (BasicBlock::const_iterator I = BB->begin(), E = BB->end(); I!=E; ++I)
463f22ef01cSRoman Divacky       for (User::const_op_iterator OI = I->op_begin(), E = I->op_end();
464f22ef01cSRoman Divacky            OI != E; ++OI) {
465f22ef01cSRoman Divacky         if ((isa<Constant>(*OI) && !isa<GlobalValue>(*OI)) ||
466f22ef01cSRoman Divacky             isa<InlineAsm>(*OI))
467f22ef01cSRoman Divacky           EnumerateValue(*OI);
468f22ef01cSRoman Divacky       }
469f22ef01cSRoman Divacky     BasicBlocks.push_back(BB);
470f22ef01cSRoman Divacky     ValueMap[BB] = BasicBlocks.size();
471f22ef01cSRoman Divacky   }
472f22ef01cSRoman Divacky 
473f22ef01cSRoman Divacky   // Optimize the constant layout.
474f22ef01cSRoman Divacky   OptimizeConstants(FirstFuncConstantID, Values.size());
475f22ef01cSRoman Divacky 
476f22ef01cSRoman Divacky   // Add the function's parameter attributes so they are available for use in
477f22ef01cSRoman Divacky   // the function's instruction.
478f22ef01cSRoman Divacky   EnumerateAttributes(F.getAttributes());
479f22ef01cSRoman Divacky 
480f22ef01cSRoman Divacky   FirstInstID = Values.size();
481f22ef01cSRoman Divacky 
482ffd1746dSEd Schouten   SmallVector<MDNode *, 8> FnLocalMDVector;
483f22ef01cSRoman Divacky   // Add all of the instructions.
484f22ef01cSRoman Divacky   for (Function::const_iterator BB = F.begin(), E = F.end(); BB != E; ++BB) {
485f22ef01cSRoman Divacky     for (BasicBlock::const_iterator I = BB->begin(), E = BB->end(); I!=E; ++I) {
486f22ef01cSRoman Divacky       for (User::const_op_iterator OI = I->op_begin(), E = I->op_end();
487f22ef01cSRoman Divacky            OI != E; ++OI) {
488f22ef01cSRoman Divacky         if (MDNode *MD = dyn_cast<MDNode>(*OI))
489f22ef01cSRoman Divacky           if (MD->isFunctionLocal() && MD->getFunction())
490f22ef01cSRoman Divacky             // Enumerate metadata after the instructions they might refer to.
491ffd1746dSEd Schouten             FnLocalMDVector.push_back(MD);
492f22ef01cSRoman Divacky       }
493e580952dSDimitry Andric 
494e580952dSDimitry Andric       SmallVector<std::pair<unsigned, MDNode*>, 8> MDs;
495e580952dSDimitry Andric       I->getAllMetadataOtherThanDebugLoc(MDs);
496e580952dSDimitry Andric       for (unsigned i = 0, e = MDs.size(); i != e; ++i) {
497e580952dSDimitry Andric         MDNode *N = MDs[i].second;
498e580952dSDimitry Andric         if (N->isFunctionLocal() && N->getFunction())
499e580952dSDimitry Andric           FnLocalMDVector.push_back(N);
500e580952dSDimitry Andric       }
501e580952dSDimitry Andric 
502f22ef01cSRoman Divacky       if (!I->getType()->isVoidTy())
503f22ef01cSRoman Divacky         EnumerateValue(I);
504f22ef01cSRoman Divacky     }
505f22ef01cSRoman Divacky   }
506f22ef01cSRoman Divacky 
507f22ef01cSRoman Divacky   // Add all of the function-local metadata.
508ffd1746dSEd Schouten   for (unsigned i = 0, e = FnLocalMDVector.size(); i != e; ++i)
509e580952dSDimitry Andric     EnumerateFunctionLocalMetadata(FnLocalMDVector[i]);
510f22ef01cSRoman Divacky }
511f22ef01cSRoman Divacky 
512f22ef01cSRoman Divacky void ValueEnumerator::purgeFunction() {
513f22ef01cSRoman Divacky   /// Remove purged values from the ValueMap.
514f22ef01cSRoman Divacky   for (unsigned i = NumModuleValues, e = Values.size(); i != e; ++i)
515f22ef01cSRoman Divacky     ValueMap.erase(Values[i].first);
516e580952dSDimitry Andric   for (unsigned i = NumModuleMDValues, e = MDValues.size(); i != e; ++i)
517e580952dSDimitry Andric     MDValueMap.erase(MDValues[i].first);
518f22ef01cSRoman Divacky   for (unsigned i = 0, e = BasicBlocks.size(); i != e; ++i)
519f22ef01cSRoman Divacky     ValueMap.erase(BasicBlocks[i]);
520f22ef01cSRoman Divacky 
521f22ef01cSRoman Divacky   Values.resize(NumModuleValues);
522e580952dSDimitry Andric   MDValues.resize(NumModuleMDValues);
523f22ef01cSRoman Divacky   BasicBlocks.clear();
524e580952dSDimitry Andric   FunctionLocalMDs.clear();
525f22ef01cSRoman Divacky }
526f22ef01cSRoman Divacky 
527f22ef01cSRoman Divacky static void IncorporateFunctionInfoGlobalBBIDs(const Function *F,
528f22ef01cSRoman Divacky                                  DenseMap<const BasicBlock*, unsigned> &IDMap) {
529f22ef01cSRoman Divacky   unsigned Counter = 0;
530f22ef01cSRoman Divacky   for (Function::const_iterator BB = F->begin(), E = F->end(); BB != E; ++BB)
531f22ef01cSRoman Divacky     IDMap[BB] = ++Counter;
532f22ef01cSRoman Divacky }
533f22ef01cSRoman Divacky 
534f22ef01cSRoman Divacky /// getGlobalBasicBlockID - This returns the function-specific ID for the
535f22ef01cSRoman Divacky /// specified basic block.  This is relatively expensive information, so it
536f22ef01cSRoman Divacky /// should only be used by rare constructs such as address-of-label.
537f22ef01cSRoman Divacky unsigned ValueEnumerator::getGlobalBasicBlockID(const BasicBlock *BB) const {
538f22ef01cSRoman Divacky   unsigned &Idx = GlobalBasicBlockIDs[BB];
539f22ef01cSRoman Divacky   if (Idx != 0)
540f22ef01cSRoman Divacky     return Idx-1;
541f22ef01cSRoman Divacky 
542f22ef01cSRoman Divacky   IncorporateFunctionInfoGlobalBBIDs(BB->getParent(), GlobalBasicBlockIDs);
543f22ef01cSRoman Divacky   return getGlobalBasicBlockID(BB);
544f22ef01cSRoman Divacky }
545f22ef01cSRoman Divacky 
546