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.
7691bc56edSDimitry Andric   for (const Function &F : *M) {
7791bc56edSDimitry Andric     for (const Argument &A : F.args())
7891bc56edSDimitry Andric       EnumerateType(A.getType());
79f22ef01cSRoman Divacky 
8091bc56edSDimitry Andric     for (const BasicBlock &BB : F)
8191bc56edSDimitry Andric       for (const Instruction &I : BB) {
8291bc56edSDimitry Andric         for (const Use &Op : I.operands()) {
8391bc56edSDimitry Andric           if (MDNode *MD = dyn_cast<MDNode>(&Op))
84f22ef01cSRoman Divacky             if (MD->isFunctionLocal() && MD->getFunction())
85f22ef01cSRoman Divacky               // These will get enumerated during function-incorporation.
86f22ef01cSRoman Divacky               continue;
8791bc56edSDimitry Andric           EnumerateOperandType(Op);
88f22ef01cSRoman Divacky         }
8991bc56edSDimitry Andric         EnumerateType(I.getType());
9091bc56edSDimitry Andric         if (const CallInst *CI = dyn_cast<CallInst>(&I))
91f22ef01cSRoman Divacky           EnumerateAttributes(CI->getAttributes());
9291bc56edSDimitry Andric         else if (const InvokeInst *II = dyn_cast<InvokeInst>(&I))
93f22ef01cSRoman Divacky           EnumerateAttributes(II->getAttributes());
94f22ef01cSRoman Divacky 
95f22ef01cSRoman Divacky         // Enumerate metadata attached with this instruction.
96f22ef01cSRoman Divacky         MDs.clear();
9791bc56edSDimitry Andric         I.getAllMetadataOtherThanDebugLoc(MDs);
98f22ef01cSRoman Divacky         for (unsigned i = 0, e = MDs.size(); i != e; ++i)
99f22ef01cSRoman Divacky           EnumerateMetadata(MDs[i].second);
100f22ef01cSRoman Divacky 
10191bc56edSDimitry Andric         if (!I.getDebugLoc().isUnknown()) {
102f22ef01cSRoman Divacky           MDNode *Scope, *IA;
10391bc56edSDimitry Andric           I.getDebugLoc().getScopeAndInlinedAt(Scope, IA, I.getContext());
104f22ef01cSRoman Divacky           if (Scope) EnumerateMetadata(Scope);
105f22ef01cSRoman Divacky           if (IA) EnumerateMetadata(IA);
106f22ef01cSRoman Divacky         }
107f22ef01cSRoman Divacky       }
108f22ef01cSRoman Divacky   }
109f22ef01cSRoman Divacky 
110f22ef01cSRoman Divacky   // Optimize constant ordering.
111f22ef01cSRoman Divacky   OptimizeConstants(FirstConstant, Values.size());
1123b0f4066SDimitry Andric }
1133b0f4066SDimitry Andric 
114f22ef01cSRoman Divacky unsigned ValueEnumerator::getInstructionID(const Instruction *Inst) const {
115f22ef01cSRoman Divacky   InstructionMapType::const_iterator I = InstructionMap.find(Inst);
116f22ef01cSRoman Divacky   assert(I != InstructionMap.end() && "Instruction is not mapped!");
117f22ef01cSRoman Divacky   return I->second;
118f22ef01cSRoman Divacky }
119f22ef01cSRoman Divacky 
12091bc56edSDimitry Andric unsigned ValueEnumerator::getComdatID(const Comdat *C) const {
12191bc56edSDimitry Andric   unsigned ComdatID = Comdats.idFor(C);
12291bc56edSDimitry Andric   assert(ComdatID && "Comdat not found!");
12391bc56edSDimitry Andric   return ComdatID;
12491bc56edSDimitry Andric }
12591bc56edSDimitry Andric 
126f22ef01cSRoman Divacky void ValueEnumerator::setInstructionID(const Instruction *I) {
127f22ef01cSRoman Divacky   InstructionMap[I] = InstructionCount++;
128f22ef01cSRoman Divacky }
129f22ef01cSRoman Divacky 
130f22ef01cSRoman Divacky unsigned ValueEnumerator::getValueID(const Value *V) const {
131f22ef01cSRoman Divacky   if (isa<MDNode>(V) || isa<MDString>(V)) {
132f22ef01cSRoman Divacky     ValueMapType::const_iterator I = MDValueMap.find(V);
133f22ef01cSRoman Divacky     assert(I != MDValueMap.end() && "Value not in slotcalculator!");
134f22ef01cSRoman Divacky     return I->second-1;
135f22ef01cSRoman Divacky   }
136f22ef01cSRoman Divacky 
137f22ef01cSRoman Divacky   ValueMapType::const_iterator I = ValueMap.find(V);
138f22ef01cSRoman Divacky   assert(I != ValueMap.end() && "Value not in slotcalculator!");
139f22ef01cSRoman Divacky   return I->second-1;
140f22ef01cSRoman Divacky }
141f22ef01cSRoman Divacky 
142dff0c46cSDimitry Andric void ValueEnumerator::dump() const {
143dff0c46cSDimitry Andric   print(dbgs(), ValueMap, "Default");
144dff0c46cSDimitry Andric   dbgs() << '\n';
145dff0c46cSDimitry Andric   print(dbgs(), MDValueMap, "MetaData");
146dff0c46cSDimitry Andric   dbgs() << '\n';
147dff0c46cSDimitry Andric }
148dff0c46cSDimitry Andric 
149dff0c46cSDimitry Andric void ValueEnumerator::print(raw_ostream &OS, const ValueMapType &Map,
150dff0c46cSDimitry Andric                             const char *Name) const {
151dff0c46cSDimitry Andric 
152dff0c46cSDimitry Andric   OS << "Map Name: " << Name << "\n";
153dff0c46cSDimitry Andric   OS << "Size: " << Map.size() << "\n";
154dff0c46cSDimitry Andric   for (ValueMapType::const_iterator I = Map.begin(),
155dff0c46cSDimitry Andric          E = Map.end(); I != E; ++I) {
156dff0c46cSDimitry Andric 
157dff0c46cSDimitry Andric     const Value *V = I->first;
158dff0c46cSDimitry Andric     if (V->hasName())
159dff0c46cSDimitry Andric       OS << "Value: " << V->getName();
160dff0c46cSDimitry Andric     else
161dff0c46cSDimitry Andric       OS << "Value: [null]\n";
162dff0c46cSDimitry Andric     V->dump();
163dff0c46cSDimitry Andric 
164dff0c46cSDimitry Andric     OS << " Uses(" << std::distance(V->use_begin(),V->use_end()) << "):";
16591bc56edSDimitry Andric     for (const Use &U : V->uses()) {
16691bc56edSDimitry Andric       if (&U != &*V->use_begin())
167dff0c46cSDimitry Andric         OS << ",";
16891bc56edSDimitry Andric       if(U->hasName())
16991bc56edSDimitry Andric         OS << " " << U->getName();
170dff0c46cSDimitry Andric       else
171dff0c46cSDimitry Andric         OS << " [null]";
172dff0c46cSDimitry Andric 
173dff0c46cSDimitry Andric     }
174dff0c46cSDimitry Andric     OS <<  "\n\n";
175dff0c46cSDimitry Andric   }
176dff0c46cSDimitry Andric }
177dff0c46cSDimitry Andric 
178f22ef01cSRoman Divacky /// OptimizeConstants - Reorder constant pool for denser encoding.
179f22ef01cSRoman Divacky void ValueEnumerator::OptimizeConstants(unsigned CstStart, unsigned CstEnd) {
180f22ef01cSRoman Divacky   if (CstStart == CstEnd || CstStart+1 == CstEnd) return;
181f22ef01cSRoman Divacky 
18291bc56edSDimitry Andric   std::stable_sort(Values.begin() + CstStart, Values.begin() + CstEnd,
18391bc56edSDimitry Andric                    [this](const std::pair<const Value *, unsigned> &LHS,
18491bc56edSDimitry Andric                           const std::pair<const Value *, unsigned> &RHS) {
18591bc56edSDimitry Andric     // Sort by plane.
18691bc56edSDimitry Andric     if (LHS.first->getType() != RHS.first->getType())
18791bc56edSDimitry Andric       return getTypeID(LHS.first->getType()) < getTypeID(RHS.first->getType());
18891bc56edSDimitry Andric     // Then by frequency.
18991bc56edSDimitry Andric     return LHS.second > RHS.second;
19091bc56edSDimitry Andric   });
191f22ef01cSRoman Divacky 
192139f7f9bSDimitry Andric   // Ensure that integer and vector of integer constants are at the start of the
193139f7f9bSDimitry Andric   // constant pool.  This is important so that GEP structure indices come before
194139f7f9bSDimitry Andric   // gep constant exprs.
195f22ef01cSRoman Divacky   std::partition(Values.begin()+CstStart, Values.begin()+CstEnd,
196139f7f9bSDimitry Andric                  isIntOrIntVectorValue);
197f22ef01cSRoman Divacky 
198f22ef01cSRoman Divacky   // Rebuild the modified portion of ValueMap.
199f22ef01cSRoman Divacky   for (; CstStart != CstEnd; ++CstStart)
200f22ef01cSRoman Divacky     ValueMap[Values[CstStart].first] = CstStart+1;
201f22ef01cSRoman Divacky }
202f22ef01cSRoman Divacky 
203f22ef01cSRoman Divacky 
204f22ef01cSRoman Divacky /// EnumerateValueSymbolTable - Insert all of the values in the specified symbol
205f22ef01cSRoman Divacky /// table into the values table.
206f22ef01cSRoman Divacky void ValueEnumerator::EnumerateValueSymbolTable(const ValueSymbolTable &VST) {
207f22ef01cSRoman Divacky   for (ValueSymbolTable::const_iterator VI = VST.begin(), VE = VST.end();
208f22ef01cSRoman Divacky        VI != VE; ++VI)
209f22ef01cSRoman Divacky     EnumerateValue(VI->getValue());
210f22ef01cSRoman Divacky }
211f22ef01cSRoman Divacky 
212e580952dSDimitry Andric /// EnumerateNamedMetadata - Insert all of the values referenced by
213e580952dSDimitry Andric /// named metadata in the specified module.
214e580952dSDimitry Andric void ValueEnumerator::EnumerateNamedMetadata(const Module *M) {
215e580952dSDimitry Andric   for (Module::const_named_metadata_iterator I = M->named_metadata_begin(),
216e580952dSDimitry Andric        E = M->named_metadata_end(); I != E; ++I)
217e580952dSDimitry Andric     EnumerateNamedMDNode(I);
218f22ef01cSRoman Divacky }
219f22ef01cSRoman Divacky 
220f22ef01cSRoman Divacky void ValueEnumerator::EnumerateNamedMDNode(const NamedMDNode *MD) {
221e580952dSDimitry Andric   for (unsigned i = 0, e = MD->getNumOperands(); i != e; ++i)
222e580952dSDimitry Andric     EnumerateMetadata(MD->getOperand(i));
223f22ef01cSRoman Divacky }
224f22ef01cSRoman Divacky 
225e580952dSDimitry Andric /// EnumerateMDNodeOperands - Enumerate all non-function-local values
226e580952dSDimitry Andric /// and types referenced by the given MDNode.
227e580952dSDimitry Andric void ValueEnumerator::EnumerateMDNodeOperands(const MDNode *N) {
228e580952dSDimitry Andric   for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i) {
229e580952dSDimitry Andric     if (Value *V = N->getOperand(i)) {
230e580952dSDimitry Andric       if (isa<MDNode>(V) || isa<MDString>(V))
231e580952dSDimitry Andric         EnumerateMetadata(V);
232e580952dSDimitry Andric       else if (!isa<Instruction>(V) && !isa<Argument>(V))
233e580952dSDimitry Andric         EnumerateValue(V);
234e580952dSDimitry Andric     } else
235e580952dSDimitry Andric       EnumerateType(Type::getVoidTy(N->getContext()));
236e580952dSDimitry Andric   }
237f22ef01cSRoman Divacky }
238f22ef01cSRoman Divacky 
239f22ef01cSRoman Divacky void ValueEnumerator::EnumerateMetadata(const Value *MD) {
240f22ef01cSRoman Divacky   assert((isa<MDNode>(MD) || isa<MDString>(MD)) && "Invalid metadata kind");
241e580952dSDimitry Andric 
242e580952dSDimitry Andric   // Enumerate the type of this value.
243e580952dSDimitry Andric   EnumerateType(MD->getType());
244e580952dSDimitry Andric 
245e580952dSDimitry Andric   const MDNode *N = dyn_cast<MDNode>(MD);
246e580952dSDimitry Andric 
247e580952dSDimitry Andric   // In the module-level pass, skip function-local nodes themselves, but
248e580952dSDimitry Andric   // do walk their operands.
249e580952dSDimitry Andric   if (N && N->isFunctionLocal() && N->getFunction()) {
250e580952dSDimitry Andric     EnumerateMDNodeOperands(N);
251e580952dSDimitry Andric     return;
252e580952dSDimitry Andric   }
253e580952dSDimitry Andric 
254f22ef01cSRoman Divacky   // Check to see if it's already in!
255f22ef01cSRoman Divacky   unsigned &MDValueID = MDValueMap[MD];
256f22ef01cSRoman Divacky   if (MDValueID) {
257f22ef01cSRoman Divacky     // Increment use count.
258f22ef01cSRoman Divacky     MDValues[MDValueID-1].second++;
259f22ef01cSRoman Divacky     return;
260f22ef01cSRoman Divacky   }
261e580952dSDimitry Andric   MDValues.push_back(std::make_pair(MD, 1U));
262e580952dSDimitry Andric   MDValueID = MDValues.size();
263e580952dSDimitry Andric 
264e580952dSDimitry Andric   // Enumerate all non-function-local operands.
265e580952dSDimitry Andric   if (N)
266e580952dSDimitry Andric     EnumerateMDNodeOperands(N);
267e580952dSDimitry Andric }
268e580952dSDimitry Andric 
269e580952dSDimitry Andric /// EnumerateFunctionLocalMetadataa - Incorporate function-local metadata
270e580952dSDimitry Andric /// information reachable from the given MDNode.
271e580952dSDimitry Andric void ValueEnumerator::EnumerateFunctionLocalMetadata(const MDNode *N) {
272e580952dSDimitry Andric   assert(N->isFunctionLocal() && N->getFunction() &&
273e580952dSDimitry Andric          "EnumerateFunctionLocalMetadata called on non-function-local mdnode!");
274f22ef01cSRoman Divacky 
275f22ef01cSRoman Divacky   // Enumerate the type of this value.
276e580952dSDimitry Andric   EnumerateType(N->getType());
277f22ef01cSRoman Divacky 
278e580952dSDimitry Andric   // Check to see if it's already in!
279e580952dSDimitry Andric   unsigned &MDValueID = MDValueMap[N];
280e580952dSDimitry Andric   if (MDValueID) {
281e580952dSDimitry Andric     // Increment use count.
282e580952dSDimitry Andric     MDValues[MDValueID-1].second++;
283f22ef01cSRoman Divacky     return;
284f22ef01cSRoman Divacky   }
285e580952dSDimitry Andric   MDValues.push_back(std::make_pair(N, 1U));
286f22ef01cSRoman Divacky   MDValueID = MDValues.size();
287e580952dSDimitry Andric 
288e580952dSDimitry Andric   // To incoroporate function-local information visit all function-local
289e580952dSDimitry Andric   // MDNodes and all function-local values they reference.
290e580952dSDimitry Andric   for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i)
291e580952dSDimitry Andric     if (Value *V = N->getOperand(i)) {
292e580952dSDimitry Andric       if (MDNode *O = dyn_cast<MDNode>(V)) {
293e580952dSDimitry Andric         if (O->isFunctionLocal() && O->getFunction())
294e580952dSDimitry Andric           EnumerateFunctionLocalMetadata(O);
295e580952dSDimitry Andric       } else if (isa<Instruction>(V) || isa<Argument>(V))
296e580952dSDimitry Andric         EnumerateValue(V);
297e580952dSDimitry Andric     }
298e580952dSDimitry Andric 
299e580952dSDimitry Andric   // Also, collect all function-local MDNodes for easy access.
300e580952dSDimitry Andric   FunctionLocalMDs.push_back(N);
301f22ef01cSRoman Divacky }
302f22ef01cSRoman Divacky 
303f22ef01cSRoman Divacky void ValueEnumerator::EnumerateValue(const Value *V) {
304f22ef01cSRoman Divacky   assert(!V->getType()->isVoidTy() && "Can't insert void values!");
305e580952dSDimitry Andric   assert(!isa<MDNode>(V) && !isa<MDString>(V) &&
306e580952dSDimitry Andric          "EnumerateValue doesn't handle Metadata!");
307f22ef01cSRoman Divacky 
308f22ef01cSRoman Divacky   // Check to see if it's already in!
309f22ef01cSRoman Divacky   unsigned &ValueID = ValueMap[V];
310f22ef01cSRoman Divacky   if (ValueID) {
311f22ef01cSRoman Divacky     // Increment use count.
312f22ef01cSRoman Divacky     Values[ValueID-1].second++;
313f22ef01cSRoman Divacky     return;
314f22ef01cSRoman Divacky   }
315f22ef01cSRoman Divacky 
31691bc56edSDimitry Andric   if (auto *GO = dyn_cast<GlobalObject>(V))
31791bc56edSDimitry Andric     if (const Comdat *C = GO->getComdat())
31891bc56edSDimitry Andric       Comdats.insert(C);
31991bc56edSDimitry Andric 
320f22ef01cSRoman Divacky   // Enumerate the type of this value.
321f22ef01cSRoman Divacky   EnumerateType(V->getType());
322f22ef01cSRoman Divacky 
323f22ef01cSRoman Divacky   if (const Constant *C = dyn_cast<Constant>(V)) {
324f22ef01cSRoman Divacky     if (isa<GlobalValue>(C)) {
325f22ef01cSRoman Divacky       // Initializers for globals are handled explicitly elsewhere.
326f22ef01cSRoman Divacky     } else if (C->getNumOperands()) {
327f22ef01cSRoman Divacky       // If a constant has operands, enumerate them.  This makes sure that if a
328f22ef01cSRoman Divacky       // constant has uses (for example an array of const ints), that they are
329f22ef01cSRoman Divacky       // inserted also.
330f22ef01cSRoman Divacky 
331f22ef01cSRoman Divacky       // We prefer to enumerate them with values before we enumerate the user
332f22ef01cSRoman Divacky       // itself.  This makes it more likely that we can avoid forward references
333f22ef01cSRoman Divacky       // in the reader.  We know that there can be no cycles in the constants
334f22ef01cSRoman Divacky       // graph that don't go through a global variable.
335f22ef01cSRoman Divacky       for (User::const_op_iterator I = C->op_begin(), E = C->op_end();
336f22ef01cSRoman Divacky            I != E; ++I)
337f22ef01cSRoman Divacky         if (!isa<BasicBlock>(*I)) // Don't enumerate BB operand to BlockAddress.
338f22ef01cSRoman Divacky           EnumerateValue(*I);
339f22ef01cSRoman Divacky 
340f22ef01cSRoman Divacky       // Finally, add the value.  Doing this could make the ValueID reference be
341f22ef01cSRoman Divacky       // dangling, don't reuse it.
342f22ef01cSRoman Divacky       Values.push_back(std::make_pair(V, 1U));
343f22ef01cSRoman Divacky       ValueMap[V] = Values.size();
344f22ef01cSRoman Divacky       return;
345f22ef01cSRoman Divacky     }
346f22ef01cSRoman Divacky   }
347f22ef01cSRoman Divacky 
348f22ef01cSRoman Divacky   // Add the value.
349f22ef01cSRoman Divacky   Values.push_back(std::make_pair(V, 1U));
350f22ef01cSRoman Divacky   ValueID = Values.size();
351f22ef01cSRoman Divacky }
352f22ef01cSRoman Divacky 
353f22ef01cSRoman Divacky 
3546122f3e6SDimitry Andric void ValueEnumerator::EnumerateType(Type *Ty) {
35517a519f9SDimitry Andric   unsigned *TypeID = &TypeMap[Ty];
356f22ef01cSRoman Divacky 
3573b0f4066SDimitry Andric   // We've already seen this type.
35817a519f9SDimitry Andric   if (*TypeID)
359f22ef01cSRoman Divacky     return;
360f22ef01cSRoman Divacky 
36117a519f9SDimitry Andric   // If it is a non-anonymous struct, mark the type as being visited so that we
36217a519f9SDimitry Andric   // don't recursively visit it.  This is safe because we allow forward
36317a519f9SDimitry Andric   // references of these in the bitcode reader.
3646122f3e6SDimitry Andric   if (StructType *STy = dyn_cast<StructType>(Ty))
3656122f3e6SDimitry Andric     if (!STy->isLiteral())
36617a519f9SDimitry Andric       *TypeID = ~0U;
367f22ef01cSRoman Divacky 
36817a519f9SDimitry Andric   // Enumerate all of the subtypes before we enumerate this type.  This ensures
36917a519f9SDimitry Andric   // that the type will be enumerated in an order that can be directly built.
370f22ef01cSRoman Divacky   for (Type::subtype_iterator I = Ty->subtype_begin(), E = Ty->subtype_end();
371f22ef01cSRoman Divacky        I != E; ++I)
372f22ef01cSRoman Divacky     EnumerateType(*I);
37317a519f9SDimitry Andric 
37417a519f9SDimitry Andric   // Refresh the TypeID pointer in case the table rehashed.
37517a519f9SDimitry Andric   TypeID = &TypeMap[Ty];
37617a519f9SDimitry Andric 
37717a519f9SDimitry Andric   // Check to see if we got the pointer another way.  This can happen when
37817a519f9SDimitry Andric   // enumerating recursive types that hit the base case deeper than they start.
37917a519f9SDimitry Andric   //
38017a519f9SDimitry Andric   // If this is actually a struct that we are treating as forward ref'able,
38117a519f9SDimitry Andric   // then emit the definition now that all of its contents are available.
38217a519f9SDimitry Andric   if (*TypeID && *TypeID != ~0U)
38317a519f9SDimitry Andric     return;
38417a519f9SDimitry Andric 
38517a519f9SDimitry Andric   // Add this type now that its contents are all happily enumerated.
38617a519f9SDimitry Andric   Types.push_back(Ty);
38717a519f9SDimitry Andric 
38817a519f9SDimitry Andric   *TypeID = Types.size();
389f22ef01cSRoman Divacky }
390f22ef01cSRoman Divacky 
391f22ef01cSRoman Divacky // Enumerate the types for the specified value.  If the value is a constant,
392f22ef01cSRoman Divacky // walk through it, enumerating the types of the constant.
393f22ef01cSRoman Divacky void ValueEnumerator::EnumerateOperandType(const Value *V) {
394f22ef01cSRoman Divacky   EnumerateType(V->getType());
395f22ef01cSRoman Divacky 
396f22ef01cSRoman Divacky   if (const Constant *C = dyn_cast<Constant>(V)) {
397f22ef01cSRoman Divacky     // If this constant is already enumerated, ignore it, we know its type must
398f22ef01cSRoman Divacky     // be enumerated.
399f22ef01cSRoman Divacky     if (ValueMap.count(V)) return;
400f22ef01cSRoman Divacky 
401f22ef01cSRoman Divacky     // This constant may have operands, make sure to enumerate the types in
402f22ef01cSRoman Divacky     // them.
403f22ef01cSRoman Divacky     for (unsigned i = 0, e = C->getNumOperands(); i != e; ++i) {
4043b0f4066SDimitry Andric       const Value *Op = C->getOperand(i);
405f22ef01cSRoman Divacky 
406f22ef01cSRoman Divacky       // Don't enumerate basic blocks here, this happens as operands to
407f22ef01cSRoman Divacky       // blockaddress.
408f22ef01cSRoman Divacky       if (isa<BasicBlock>(Op)) continue;
409f22ef01cSRoman Divacky 
410e580952dSDimitry Andric       EnumerateOperandType(Op);
411f22ef01cSRoman Divacky     }
412f22ef01cSRoman Divacky 
413f22ef01cSRoman Divacky     if (const MDNode *N = dyn_cast<MDNode>(V)) {
414f22ef01cSRoman Divacky       for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i)
415f22ef01cSRoman Divacky         if (Value *Elem = N->getOperand(i))
416f22ef01cSRoman Divacky           EnumerateOperandType(Elem);
417f22ef01cSRoman Divacky     }
418f22ef01cSRoman Divacky   } else if (isa<MDString>(V) || isa<MDNode>(V))
419e580952dSDimitry Andric     EnumerateMetadata(V);
420f22ef01cSRoman Divacky }
421f22ef01cSRoman Divacky 
422139f7f9bSDimitry Andric void ValueEnumerator::EnumerateAttributes(AttributeSet PAL) {
423f22ef01cSRoman Divacky   if (PAL.isEmpty()) return;  // null is always 0.
424139f7f9bSDimitry Andric 
425f22ef01cSRoman Divacky   // Do a lookup.
426139f7f9bSDimitry Andric   unsigned &Entry = AttributeMap[PAL];
427f22ef01cSRoman Divacky   if (Entry == 0) {
428f22ef01cSRoman Divacky     // Never saw this before, add it.
429139f7f9bSDimitry Andric     Attribute.push_back(PAL);
430139f7f9bSDimitry Andric     Entry = Attribute.size();
431139f7f9bSDimitry Andric   }
432139f7f9bSDimitry Andric 
433139f7f9bSDimitry Andric   // Do lookups for all attribute groups.
434139f7f9bSDimitry Andric   for (unsigned i = 0, e = PAL.getNumSlots(); i != e; ++i) {
435139f7f9bSDimitry Andric     AttributeSet AS = PAL.getSlotAttributes(i);
436139f7f9bSDimitry Andric     unsigned &Entry = AttributeGroupMap[AS];
437139f7f9bSDimitry Andric     if (Entry == 0) {
438139f7f9bSDimitry Andric       AttributeGroups.push_back(AS);
439139f7f9bSDimitry Andric       Entry = AttributeGroups.size();
440139f7f9bSDimitry Andric     }
441f22ef01cSRoman Divacky   }
442f22ef01cSRoman Divacky }
443f22ef01cSRoman Divacky 
444f22ef01cSRoman Divacky void ValueEnumerator::incorporateFunction(const Function &F) {
445f22ef01cSRoman Divacky   InstructionCount = 0;
446f22ef01cSRoman Divacky   NumModuleValues = Values.size();
447e580952dSDimitry Andric   NumModuleMDValues = MDValues.size();
448f22ef01cSRoman Divacky 
449f22ef01cSRoman Divacky   // Adding function arguments to the value table.
450f22ef01cSRoman Divacky   for (Function::const_arg_iterator I = F.arg_begin(), E = F.arg_end();
451f22ef01cSRoman Divacky        I != E; ++I)
452f22ef01cSRoman Divacky     EnumerateValue(I);
453f22ef01cSRoman Divacky 
454f22ef01cSRoman Divacky   FirstFuncConstantID = Values.size();
455f22ef01cSRoman Divacky 
456f22ef01cSRoman Divacky   // Add all function-level constants to the value table.
457f22ef01cSRoman Divacky   for (Function::const_iterator BB = F.begin(), E = F.end(); BB != E; ++BB) {
458f22ef01cSRoman Divacky     for (BasicBlock::const_iterator I = BB->begin(), E = BB->end(); I!=E; ++I)
459f22ef01cSRoman Divacky       for (User::const_op_iterator OI = I->op_begin(), E = I->op_end();
460f22ef01cSRoman Divacky            OI != E; ++OI) {
461f22ef01cSRoman Divacky         if ((isa<Constant>(*OI) && !isa<GlobalValue>(*OI)) ||
462f22ef01cSRoman Divacky             isa<InlineAsm>(*OI))
463f22ef01cSRoman Divacky           EnumerateValue(*OI);
464f22ef01cSRoman Divacky       }
465f22ef01cSRoman Divacky     BasicBlocks.push_back(BB);
466f22ef01cSRoman Divacky     ValueMap[BB] = BasicBlocks.size();
467f22ef01cSRoman Divacky   }
468f22ef01cSRoman Divacky 
469f22ef01cSRoman Divacky   // Optimize the constant layout.
470f22ef01cSRoman Divacky   OptimizeConstants(FirstFuncConstantID, Values.size());
471f22ef01cSRoman Divacky 
472f22ef01cSRoman Divacky   // Add the function's parameter attributes so they are available for use in
473f22ef01cSRoman Divacky   // the function's instruction.
474f22ef01cSRoman Divacky   EnumerateAttributes(F.getAttributes());
475f22ef01cSRoman Divacky 
476f22ef01cSRoman Divacky   FirstInstID = Values.size();
477f22ef01cSRoman Divacky 
478ffd1746dSEd Schouten   SmallVector<MDNode *, 8> FnLocalMDVector;
479f22ef01cSRoman Divacky   // Add all of the instructions.
480f22ef01cSRoman Divacky   for (Function::const_iterator BB = F.begin(), E = F.end(); BB != E; ++BB) {
481f22ef01cSRoman Divacky     for (BasicBlock::const_iterator I = BB->begin(), E = BB->end(); I!=E; ++I) {
482f22ef01cSRoman Divacky       for (User::const_op_iterator OI = I->op_begin(), E = I->op_end();
483f22ef01cSRoman Divacky            OI != E; ++OI) {
484f22ef01cSRoman Divacky         if (MDNode *MD = dyn_cast<MDNode>(*OI))
485f22ef01cSRoman Divacky           if (MD->isFunctionLocal() && MD->getFunction())
486f22ef01cSRoman Divacky             // Enumerate metadata after the instructions they might refer to.
487ffd1746dSEd Schouten             FnLocalMDVector.push_back(MD);
488f22ef01cSRoman Divacky       }
489e580952dSDimitry Andric 
490e580952dSDimitry Andric       SmallVector<std::pair<unsigned, MDNode*>, 8> MDs;
491e580952dSDimitry Andric       I->getAllMetadataOtherThanDebugLoc(MDs);
492e580952dSDimitry Andric       for (unsigned i = 0, e = MDs.size(); i != e; ++i) {
493e580952dSDimitry Andric         MDNode *N = MDs[i].second;
494e580952dSDimitry Andric         if (N->isFunctionLocal() && N->getFunction())
495e580952dSDimitry Andric           FnLocalMDVector.push_back(N);
496e580952dSDimitry Andric       }
497e580952dSDimitry Andric 
498f22ef01cSRoman Divacky       if (!I->getType()->isVoidTy())
499f22ef01cSRoman Divacky         EnumerateValue(I);
500f22ef01cSRoman Divacky     }
501f22ef01cSRoman Divacky   }
502f22ef01cSRoman Divacky 
503f22ef01cSRoman Divacky   // Add all of the function-local metadata.
504ffd1746dSEd Schouten   for (unsigned i = 0, e = FnLocalMDVector.size(); i != e; ++i)
505e580952dSDimitry Andric     EnumerateFunctionLocalMetadata(FnLocalMDVector[i]);
506f22ef01cSRoman Divacky }
507f22ef01cSRoman Divacky 
508f22ef01cSRoman Divacky void ValueEnumerator::purgeFunction() {
509f22ef01cSRoman Divacky   /// Remove purged values from the ValueMap.
510f22ef01cSRoman Divacky   for (unsigned i = NumModuleValues, e = Values.size(); i != e; ++i)
511f22ef01cSRoman Divacky     ValueMap.erase(Values[i].first);
512e580952dSDimitry Andric   for (unsigned i = NumModuleMDValues, e = MDValues.size(); i != e; ++i)
513e580952dSDimitry Andric     MDValueMap.erase(MDValues[i].first);
514f22ef01cSRoman Divacky   for (unsigned i = 0, e = BasicBlocks.size(); i != e; ++i)
515f22ef01cSRoman Divacky     ValueMap.erase(BasicBlocks[i]);
516f22ef01cSRoman Divacky 
517f22ef01cSRoman Divacky   Values.resize(NumModuleValues);
518e580952dSDimitry Andric   MDValues.resize(NumModuleMDValues);
519f22ef01cSRoman Divacky   BasicBlocks.clear();
520e580952dSDimitry Andric   FunctionLocalMDs.clear();
521f22ef01cSRoman Divacky }
522f22ef01cSRoman Divacky 
523f22ef01cSRoman Divacky static void IncorporateFunctionInfoGlobalBBIDs(const Function *F,
524f22ef01cSRoman Divacky                                  DenseMap<const BasicBlock*, unsigned> &IDMap) {
525f22ef01cSRoman Divacky   unsigned Counter = 0;
526f22ef01cSRoman Divacky   for (Function::const_iterator BB = F->begin(), E = F->end(); BB != E; ++BB)
527f22ef01cSRoman Divacky     IDMap[BB] = ++Counter;
528f22ef01cSRoman Divacky }
529f22ef01cSRoman Divacky 
530f22ef01cSRoman Divacky /// getGlobalBasicBlockID - This returns the function-specific ID for the
531f22ef01cSRoman Divacky /// specified basic block.  This is relatively expensive information, so it
532f22ef01cSRoman Divacky /// should only be used by rare constructs such as address-of-label.
533f22ef01cSRoman Divacky unsigned ValueEnumerator::getGlobalBasicBlockID(const BasicBlock *BB) const {
534f22ef01cSRoman Divacky   unsigned &Idx = GlobalBasicBlockIDs[BB];
535f22ef01cSRoman Divacky   if (Idx != 0)
536f22ef01cSRoman Divacky     return Idx-1;
537f22ef01cSRoman Divacky 
538f22ef01cSRoman Divacky   IncorporateFunctionInfoGlobalBBIDs(BB->getParent(), GlobalBasicBlockIDs);
539f22ef01cSRoman Divacky   return getGlobalBasicBlockID(BB);
540f22ef01cSRoman Divacky }
541f22ef01cSRoman Divacky 
542