OLD | NEW |
---|---|
1 //===-- ValueEnumerator.cpp - Number values and types for bitcode writer --===// | 1 //===-- ValueEnumerator.cpp - Number values and types for bitcode writer --===// |
Karl
2013/04/25 20:48:17
Fixed this to be NaClValueEnumerator.cpp
| |
2 // | 2 // |
3 // The LLVM Compiler Infrastructure | 3 // The LLVM Compiler Infrastructure |
4 // | 4 // |
5 // This file is distributed under the University of Illinois Open Source | 5 // This file is distributed under the University of Illinois Open Source |
6 // License. See LICENSE.TXT for details. | 6 // License. See LICENSE.TXT for details. |
7 // | 7 // |
8 //===----------------------------------------------------------------------===// | 8 //===----------------------------------------------------------------------===// |
9 // | 9 // |
10 // This file implements the ValueEnumerator class. | 10 // This file implements the PNaClValueEnumerator class. |
Karl
2013/04/25 20:48:17
applied to file: PNaCl -> NaCl
| |
11 // | 11 // |
12 //===----------------------------------------------------------------------===// | 12 //===----------------------------------------------------------------------===// |
13 | 13 |
14 #include "ValueEnumerator.h" | 14 #include "NaClValueEnumerator.h" |
15 #include "llvm/ADT/STLExtras.h" | 15 #include "llvm/ADT/STLExtras.h" |
16 #include "llvm/ADT/SmallPtrSet.h" | 16 #include "llvm/ADT/SmallPtrSet.h" |
17 #include "llvm/IR/Constants.h" | 17 #include "llvm/IR/Constants.h" |
18 #include "llvm/IR/DerivedTypes.h" | 18 #include "llvm/IR/DerivedTypes.h" |
19 #include "llvm/IR/Instructions.h" | 19 #include "llvm/IR/Instructions.h" |
20 #include "llvm/IR/Module.h" | 20 #include "llvm/IR/Module.h" |
21 #include "llvm/IR/ValueSymbolTable.h" | 21 #include "llvm/IR/ValueSymbolTable.h" |
22 #include "llvm/Support/Debug.h" | 22 #include "llvm/Support/Debug.h" |
23 #include "llvm/Support/raw_ostream.h" | 23 #include "llvm/Support/raw_ostream.h" |
24 #include <algorithm> | 24 #include <algorithm> |
25 using namespace llvm; | 25 using namespace llvm; |
26 | 26 |
27 static bool isIntOrIntVectorValue(const std::pair<const Value*, unsigned> &V) { | 27 static bool isIntOrIntVectorValue(const std::pair<const Value*, unsigned> &V) { |
28 return V.first->getType()->isIntOrIntVectorTy(); | 28 return V.first->getType()->isIntOrIntVectorTy(); |
29 } | 29 } |
30 | 30 |
31 /// ValueEnumerator - Enumerate module-level information. | 31 /// PNaClValueEnumerator - Enumerate module-level information. |
32 ValueEnumerator::ValueEnumerator(const Module *M) { | 32 PNaClValueEnumerator::PNaClValueEnumerator(const Module *M) { |
33 // Enumerate the global variables. | 33 // Enumerate the global variables. |
34 for (Module::const_global_iterator I = M->global_begin(), | 34 for (Module::const_global_iterator I = M->global_begin(), |
35 E = M->global_end(); I != E; ++I) | 35 E = M->global_end(); I != E; ++I) |
36 EnumerateValue(I); | 36 EnumerateValue(I); |
37 | 37 |
38 // Enumerate the functions. | 38 // Enumerate the functions. |
39 for (Module::const_iterator I = M->begin(), E = M->end(); I != E; ++I) { | 39 for (Module::const_iterator I = M->begin(), E = M->end(); I != E; ++I) { |
40 EnumerateValue(I); | 40 EnumerateValue(I); |
41 EnumerateAttributes(cast<Function>(I)->getAttributes()); | 41 EnumerateAttributes(cast<Function>(I)->getAttributes()); |
42 } | 42 } |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
102 if (Scope) EnumerateMetadata(Scope); | 102 if (Scope) EnumerateMetadata(Scope); |
103 if (IA) EnumerateMetadata(IA); | 103 if (IA) EnumerateMetadata(IA); |
104 } | 104 } |
105 } | 105 } |
106 } | 106 } |
107 | 107 |
108 // Optimize constant ordering. | 108 // Optimize constant ordering. |
109 OptimizeConstants(FirstConstant, Values.size()); | 109 OptimizeConstants(FirstConstant, Values.size()); |
110 } | 110 } |
111 | 111 |
112 unsigned ValueEnumerator::getInstructionID(const Instruction *Inst) const { | 112 unsigned PNaClValueEnumerator::getInstructionID(const Instruction *Inst) const { |
113 InstructionMapType::const_iterator I = InstructionMap.find(Inst); | 113 InstructionMapType::const_iterator I = InstructionMap.find(Inst); |
114 assert(I != InstructionMap.end() && "Instruction is not mapped!"); | 114 assert(I != InstructionMap.end() && "Instruction is not mapped!"); |
115 return I->second; | 115 return I->second; |
116 } | 116 } |
117 | 117 |
118 void ValueEnumerator::setInstructionID(const Instruction *I) { | 118 void PNaClValueEnumerator::setInstructionID(const Instruction *I) { |
119 InstructionMap[I] = InstructionCount++; | 119 InstructionMap[I] = InstructionCount++; |
120 } | 120 } |
121 | 121 |
122 unsigned ValueEnumerator::getValueID(const Value *V) const { | 122 unsigned PNaClValueEnumerator::getValueID(const Value *V) const { |
123 if (isa<MDNode>(V) || isa<MDString>(V)) { | 123 if (isa<MDNode>(V) || isa<MDString>(V)) { |
124 ValueMapType::const_iterator I = MDValueMap.find(V); | 124 ValueMapType::const_iterator I = MDValueMap.find(V); |
125 assert(I != MDValueMap.end() && "Value not in slotcalculator!"); | 125 assert(I != MDValueMap.end() && "Value not in slotcalculator!"); |
126 return I->second-1; | 126 return I->second-1; |
127 } | 127 } |
128 | 128 |
129 ValueMapType::const_iterator I = ValueMap.find(V); | 129 ValueMapType::const_iterator I = ValueMap.find(V); |
130 assert(I != ValueMap.end() && "Value not in slotcalculator!"); | 130 assert(I != ValueMap.end() && "Value not in slotcalculator!"); |
131 return I->second-1; | 131 return I->second-1; |
132 } | 132 } |
133 | 133 |
134 void ValueEnumerator::dump() const { | 134 void PNaClValueEnumerator::dump() const { |
135 print(dbgs(), ValueMap, "Default"); | 135 print(dbgs(), ValueMap, "Default"); |
136 dbgs() << '\n'; | 136 dbgs() << '\n'; |
137 print(dbgs(), MDValueMap, "MetaData"); | 137 print(dbgs(), MDValueMap, "MetaData"); |
138 dbgs() << '\n'; | 138 dbgs() << '\n'; |
139 } | 139 } |
140 | 140 |
141 void ValueEnumerator::print(raw_ostream &OS, const ValueMapType &Map, | 141 void PNaClValueEnumerator::print(raw_ostream &OS, const ValueMapType &Map, |
142 const char *Name) const { | 142 const char *Name) const { |
143 | 143 |
144 OS << "Map Name: " << Name << "\n"; | 144 OS << "Map Name: " << Name << "\n"; |
145 OS << "Size: " << Map.size() << "\n"; | 145 OS << "Size: " << Map.size() << "\n"; |
146 for (ValueMapType::const_iterator I = Map.begin(), | 146 for (ValueMapType::const_iterator I = Map.begin(), |
147 E = Map.end(); I != E; ++I) { | 147 E = Map.end(); I != E; ++I) { |
148 | 148 |
149 const Value *V = I->first; | 149 const Value *V = I->first; |
150 if (V->hasName()) | 150 if (V->hasName()) |
151 OS << "Value: " << V->getName(); | 151 OS << "Value: " << V->getName(); |
(...skipping 12 matching lines...) Expand all Loading... | |
164 OS << " [null]"; | 164 OS << " [null]"; |
165 | 165 |
166 } | 166 } |
167 OS << "\n\n"; | 167 OS << "\n\n"; |
168 } | 168 } |
169 } | 169 } |
170 | 170 |
171 // Optimize constant ordering. | 171 // Optimize constant ordering. |
172 namespace { | 172 namespace { |
173 struct CstSortPredicate { | 173 struct CstSortPredicate { |
174 ValueEnumerator &VE; | 174 PNaClValueEnumerator &VE; |
175 explicit CstSortPredicate(ValueEnumerator &ve) : VE(ve) {} | 175 explicit CstSortPredicate(PNaClValueEnumerator &ve) : VE(ve) {} |
176 bool operator()(const std::pair<const Value*, unsigned> &LHS, | 176 bool operator()(const std::pair<const Value*, unsigned> &LHS, |
177 const std::pair<const Value*, unsigned> &RHS) { | 177 const std::pair<const Value*, unsigned> &RHS) { |
178 // Sort by plane. | 178 // Sort by plane. |
179 if (LHS.first->getType() != RHS.first->getType()) | 179 if (LHS.first->getType() != RHS.first->getType()) |
180 return VE.getTypeID(LHS.first->getType()) < | 180 return VE.getTypeID(LHS.first->getType()) < |
181 VE.getTypeID(RHS.first->getType()); | 181 VE.getTypeID(RHS.first->getType()); |
182 // Then by frequency. | 182 // Then by frequency. |
183 return LHS.second > RHS.second; | 183 return LHS.second > RHS.second; |
184 } | 184 } |
185 }; | 185 }; |
186 } | 186 } |
187 | 187 |
188 /// OptimizeConstants - Reorder constant pool for denser encoding. | 188 /// OptimizeConstants - Reorder constant pool for denser encoding. |
189 void ValueEnumerator::OptimizeConstants(unsigned CstStart, unsigned CstEnd) { | 189 void PNaClValueEnumerator::OptimizeConstants(unsigned CstStart, unsigned CstEnd) { |
190 if (CstStart == CstEnd || CstStart+1 == CstEnd) return; | 190 if (CstStart == CstEnd || CstStart+1 == CstEnd) return; |
191 | 191 |
192 CstSortPredicate P(*this); | 192 CstSortPredicate P(*this); |
193 std::stable_sort(Values.begin()+CstStart, Values.begin()+CstEnd, P); | 193 std::stable_sort(Values.begin()+CstStart, Values.begin()+CstEnd, P); |
194 | 194 |
195 // Ensure that integer and vector of integer constants are at the start of the | 195 // Ensure that integer and vector of integer constants are at the start of the |
196 // constant pool. This is important so that GEP structure indices come before | 196 // constant pool. This is important so that GEP structure indices come before |
197 // gep constant exprs. | 197 // gep constant exprs. |
198 std::partition(Values.begin()+CstStart, Values.begin()+CstEnd, | 198 std::partition(Values.begin()+CstStart, Values.begin()+CstEnd, |
199 isIntOrIntVectorValue); | 199 isIntOrIntVectorValue); |
200 | 200 |
201 // Rebuild the modified portion of ValueMap. | 201 // Rebuild the modified portion of ValueMap. |
202 for (; CstStart != CstEnd; ++CstStart) | 202 for (; CstStart != CstEnd; ++CstStart) |
203 ValueMap[Values[CstStart].first] = CstStart+1; | 203 ValueMap[Values[CstStart].first] = CstStart+1; |
204 } | 204 } |
205 | 205 |
206 | 206 |
207 /// EnumerateValueSymbolTable - Insert all of the values in the specified symbol | 207 /// EnumerateValueSymbolTable - Insert all of the values in the specified symbol |
208 /// table into the values table. | 208 /// table into the values table. |
209 void ValueEnumerator::EnumerateValueSymbolTable(const ValueSymbolTable &VST) { | 209 void PNaClValueEnumerator::EnumerateValueSymbolTable(const ValueSymbolTable &VST ) { |
210 for (ValueSymbolTable::const_iterator VI = VST.begin(), VE = VST.end(); | 210 for (ValueSymbolTable::const_iterator VI = VST.begin(), VE = VST.end(); |
211 VI != VE; ++VI) | 211 VI != VE; ++VI) |
212 EnumerateValue(VI->getValue()); | 212 EnumerateValue(VI->getValue()); |
213 } | 213 } |
214 | 214 |
215 /// EnumerateNamedMetadata - Insert all of the values referenced by | 215 /// EnumerateNamedMetadata - Insert all of the values referenced by |
216 /// named metadata in the specified module. | 216 /// named metadata in the specified module. |
217 void ValueEnumerator::EnumerateNamedMetadata(const Module *M) { | 217 void PNaClValueEnumerator::EnumerateNamedMetadata(const Module *M) { |
218 for (Module::const_named_metadata_iterator I = M->named_metadata_begin(), | 218 for (Module::const_named_metadata_iterator I = M->named_metadata_begin(), |
219 E = M->named_metadata_end(); I != E; ++I) | 219 E = M->named_metadata_end(); I != E; ++I) |
220 EnumerateNamedMDNode(I); | 220 EnumerateNamedMDNode(I); |
221 } | 221 } |
222 | 222 |
223 void ValueEnumerator::EnumerateNamedMDNode(const NamedMDNode *MD) { | 223 void PNaClValueEnumerator::EnumerateNamedMDNode(const NamedMDNode *MD) { |
224 for (unsigned i = 0, e = MD->getNumOperands(); i != e; ++i) | 224 for (unsigned i = 0, e = MD->getNumOperands(); i != e; ++i) |
225 EnumerateMetadata(MD->getOperand(i)); | 225 EnumerateMetadata(MD->getOperand(i)); |
226 } | 226 } |
227 | 227 |
228 /// EnumerateMDNodeOperands - Enumerate all non-function-local values | 228 /// EnumerateMDNodeOperands - Enumerate all non-function-local values |
229 /// and types referenced by the given MDNode. | 229 /// and types referenced by the given MDNode. |
230 void ValueEnumerator::EnumerateMDNodeOperands(const MDNode *N) { | 230 void PNaClValueEnumerator::EnumerateMDNodeOperands(const MDNode *N) { |
231 for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i) { | 231 for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i) { |
232 if (Value *V = N->getOperand(i)) { | 232 if (Value *V = N->getOperand(i)) { |
233 if (isa<MDNode>(V) || isa<MDString>(V)) | 233 if (isa<MDNode>(V) || isa<MDString>(V)) |
234 EnumerateMetadata(V); | 234 EnumerateMetadata(V); |
235 else if (!isa<Instruction>(V) && !isa<Argument>(V)) | 235 else if (!isa<Instruction>(V) && !isa<Argument>(V)) |
236 EnumerateValue(V); | 236 EnumerateValue(V); |
237 } else | 237 } else |
238 EnumerateType(Type::getVoidTy(N->getContext())); | 238 EnumerateType(Type::getVoidTy(N->getContext())); |
239 } | 239 } |
240 } | 240 } |
241 | 241 |
242 void ValueEnumerator::EnumerateMetadata(const Value *MD) { | 242 void PNaClValueEnumerator::EnumerateMetadata(const Value *MD) { |
243 assert((isa<MDNode>(MD) || isa<MDString>(MD)) && "Invalid metadata kind"); | 243 assert((isa<MDNode>(MD) || isa<MDString>(MD)) && "Invalid metadata kind"); |
244 | 244 |
245 // Enumerate the type of this value. | 245 // Enumerate the type of this value. |
246 EnumerateType(MD->getType()); | 246 EnumerateType(MD->getType()); |
247 | 247 |
248 const MDNode *N = dyn_cast<MDNode>(MD); | 248 const MDNode *N = dyn_cast<MDNode>(MD); |
249 | 249 |
250 // In the module-level pass, skip function-local nodes themselves, but | 250 // In the module-level pass, skip function-local nodes themselves, but |
251 // do walk their operands. | 251 // do walk their operands. |
252 if (N && N->isFunctionLocal() && N->getFunction()) { | 252 if (N && N->isFunctionLocal() && N->getFunction()) { |
(...skipping 11 matching lines...) Expand all Loading... | |
264 MDValues.push_back(std::make_pair(MD, 1U)); | 264 MDValues.push_back(std::make_pair(MD, 1U)); |
265 MDValueID = MDValues.size(); | 265 MDValueID = MDValues.size(); |
266 | 266 |
267 // Enumerate all non-function-local operands. | 267 // Enumerate all non-function-local operands. |
268 if (N) | 268 if (N) |
269 EnumerateMDNodeOperands(N); | 269 EnumerateMDNodeOperands(N); |
270 } | 270 } |
271 | 271 |
272 /// EnumerateFunctionLocalMetadataa - Incorporate function-local metadata | 272 /// EnumerateFunctionLocalMetadataa - Incorporate function-local metadata |
273 /// information reachable from the given MDNode. | 273 /// information reachable from the given MDNode. |
274 void ValueEnumerator::EnumerateFunctionLocalMetadata(const MDNode *N) { | 274 void PNaClValueEnumerator::EnumerateFunctionLocalMetadata(const MDNode *N) { |
275 assert(N->isFunctionLocal() && N->getFunction() && | 275 assert(N->isFunctionLocal() && N->getFunction() && |
276 "EnumerateFunctionLocalMetadata called on non-function-local mdnode!"); | 276 "EnumerateFunctionLocalMetadata called on non-function-local mdnode!"); |
277 | 277 |
278 // Enumerate the type of this value. | 278 // Enumerate the type of this value. |
279 EnumerateType(N->getType()); | 279 EnumerateType(N->getType()); |
280 | 280 |
281 // Check to see if it's already in! | 281 // Check to see if it's already in! |
282 unsigned &MDValueID = MDValueMap[N]; | 282 unsigned &MDValueID = MDValueMap[N]; |
283 if (MDValueID) { | 283 if (MDValueID) { |
284 // Increment use count. | 284 // Increment use count. |
(...skipping 11 matching lines...) Expand all Loading... | |
296 if (O->isFunctionLocal() && O->getFunction()) | 296 if (O->isFunctionLocal() && O->getFunction()) |
297 EnumerateFunctionLocalMetadata(O); | 297 EnumerateFunctionLocalMetadata(O); |
298 } else if (isa<Instruction>(V) || isa<Argument>(V)) | 298 } else if (isa<Instruction>(V) || isa<Argument>(V)) |
299 EnumerateValue(V); | 299 EnumerateValue(V); |
300 } | 300 } |
301 | 301 |
302 // Also, collect all function-local MDNodes for easy access. | 302 // Also, collect all function-local MDNodes for easy access. |
303 FunctionLocalMDs.push_back(N); | 303 FunctionLocalMDs.push_back(N); |
304 } | 304 } |
305 | 305 |
306 void ValueEnumerator::EnumerateValue(const Value *V) { | 306 void PNaClValueEnumerator::EnumerateValue(const Value *V) { |
307 assert(!V->getType()->isVoidTy() && "Can't insert void values!"); | 307 assert(!V->getType()->isVoidTy() && "Can't insert void values!"); |
308 assert(!isa<MDNode>(V) && !isa<MDString>(V) && | 308 assert(!isa<MDNode>(V) && !isa<MDString>(V) && |
309 "EnumerateValue doesn't handle Metadata!"); | 309 "EnumerateValue doesn't handle Metadata!"); |
310 | 310 |
311 // Check to see if it's already in! | 311 // Check to see if it's already in! |
312 unsigned &ValueID = ValueMap[V]; | 312 unsigned &ValueID = ValueMap[V]; |
313 if (ValueID) { | 313 if (ValueID) { |
314 // Increment use count. | 314 // Increment use count. |
315 Values[ValueID-1].second++; | 315 Values[ValueID-1].second++; |
316 return; | 316 return; |
(...skipping 26 matching lines...) Expand all Loading... | |
343 return; | 343 return; |
344 } | 344 } |
345 } | 345 } |
346 | 346 |
347 // Add the value. | 347 // Add the value. |
348 Values.push_back(std::make_pair(V, 1U)); | 348 Values.push_back(std::make_pair(V, 1U)); |
349 ValueID = Values.size(); | 349 ValueID = Values.size(); |
350 } | 350 } |
351 | 351 |
352 | 352 |
353 void ValueEnumerator::EnumerateType(Type *Ty) { | 353 void PNaClValueEnumerator::EnumerateType(Type *Ty) { |
354 unsigned *TypeID = &TypeMap[Ty]; | 354 unsigned *TypeID = &TypeMap[Ty]; |
355 | 355 |
356 // We've already seen this type. | 356 // We've already seen this type. |
357 if (*TypeID) | 357 if (*TypeID) |
358 return; | 358 return; |
359 | 359 |
360 // If it is a non-anonymous struct, mark the type as being visited so that we | 360 // If it is a non-anonymous struct, mark the type as being visited so that we |
361 // don't recursively visit it. This is safe because we allow forward | 361 // don't recursively visit it. This is safe because we allow forward |
362 // references of these in the bitcode reader. | 362 // references of these in the bitcode reader. |
363 if (StructType *STy = dyn_cast<StructType>(Ty)) | 363 if (StructType *STy = dyn_cast<StructType>(Ty)) |
(...skipping 18 matching lines...) Expand all Loading... | |
382 return; | 382 return; |
383 | 383 |
384 // Add this type now that its contents are all happily enumerated. | 384 // Add this type now that its contents are all happily enumerated. |
385 Types.push_back(Ty); | 385 Types.push_back(Ty); |
386 | 386 |
387 *TypeID = Types.size(); | 387 *TypeID = Types.size(); |
388 } | 388 } |
389 | 389 |
390 // Enumerate the types for the specified value. If the value is a constant, | 390 // Enumerate the types for the specified value. If the value is a constant, |
391 // walk through it, enumerating the types of the constant. | 391 // walk through it, enumerating the types of the constant. |
392 void ValueEnumerator::EnumerateOperandType(const Value *V) { | 392 void PNaClValueEnumerator::EnumerateOperandType(const Value *V) { |
393 EnumerateType(V->getType()); | 393 EnumerateType(V->getType()); |
394 | 394 |
395 if (const Constant *C = dyn_cast<Constant>(V)) { | 395 if (const Constant *C = dyn_cast<Constant>(V)) { |
396 // If this constant is already enumerated, ignore it, we know its type must | 396 // If this constant is already enumerated, ignore it, we know its type must |
397 // be enumerated. | 397 // be enumerated. |
398 if (ValueMap.count(V)) return; | 398 if (ValueMap.count(V)) return; |
399 | 399 |
400 // This constant may have operands, make sure to enumerate the types in | 400 // This constant may have operands, make sure to enumerate the types in |
401 // them. | 401 // them. |
402 for (unsigned i = 0, e = C->getNumOperands(); i != e; ++i) { | 402 for (unsigned i = 0, e = C->getNumOperands(); i != e; ++i) { |
403 const Value *Op = C->getOperand(i); | 403 const Value *Op = C->getOperand(i); |
404 | 404 |
405 // Don't enumerate basic blocks here, this happens as operands to | 405 // Don't enumerate basic blocks here, this happens as operands to |
406 // blockaddress. | 406 // blockaddress. |
407 if (isa<BasicBlock>(Op)) continue; | 407 if (isa<BasicBlock>(Op)) continue; |
408 | 408 |
409 EnumerateOperandType(Op); | 409 EnumerateOperandType(Op); |
410 } | 410 } |
411 | 411 |
412 if (const MDNode *N = dyn_cast<MDNode>(V)) { | 412 if (const MDNode *N = dyn_cast<MDNode>(V)) { |
413 for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i) | 413 for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i) |
414 if (Value *Elem = N->getOperand(i)) | 414 if (Value *Elem = N->getOperand(i)) |
415 EnumerateOperandType(Elem); | 415 EnumerateOperandType(Elem); |
416 } | 416 } |
417 } else if (isa<MDString>(V) || isa<MDNode>(V)) | 417 } else if (isa<MDString>(V) || isa<MDNode>(V)) |
418 EnumerateMetadata(V); | 418 EnumerateMetadata(V); |
419 } | 419 } |
420 | 420 |
421 void ValueEnumerator::EnumerateAttributes(AttributeSet PAL) { | 421 void PNaClValueEnumerator::EnumerateAttributes(AttributeSet PAL) { |
422 if (PAL.isEmpty()) return; // null is always 0. | 422 if (PAL.isEmpty()) return; // null is always 0. |
423 | 423 |
424 // Do a lookup. | 424 // Do a lookup. |
425 unsigned &Entry = AttributeMap[PAL]; | 425 unsigned &Entry = AttributeMap[PAL]; |
426 if (Entry == 0) { | 426 if (Entry == 0) { |
427 // Never saw this before, add it. | 427 // Never saw this before, add it. |
428 Attribute.push_back(PAL); | 428 Attribute.push_back(PAL); |
429 Entry = Attribute.size(); | 429 Entry = Attribute.size(); |
430 } | 430 } |
431 | 431 |
432 // Do lookups for all attribute groups. | 432 // Do lookups for all attribute groups. |
433 for (unsigned i = 0, e = PAL.getNumSlots(); i != e; ++i) { | 433 for (unsigned i = 0, e = PAL.getNumSlots(); i != e; ++i) { |
434 AttributeSet AS = PAL.getSlotAttributes(i); | 434 AttributeSet AS = PAL.getSlotAttributes(i); |
435 unsigned &Entry = AttributeGroupMap[AS]; | 435 unsigned &Entry = AttributeGroupMap[AS]; |
436 if (Entry == 0) { | 436 if (Entry == 0) { |
437 AttributeGroups.push_back(AS); | 437 AttributeGroups.push_back(AS); |
438 Entry = AttributeGroups.size(); | 438 Entry = AttributeGroups.size(); |
439 } | 439 } |
440 } | 440 } |
441 } | 441 } |
442 | 442 |
443 void ValueEnumerator::incorporateFunction(const Function &F) { | 443 void PNaClValueEnumerator::incorporateFunction(const Function &F) { |
444 InstructionCount = 0; | 444 InstructionCount = 0; |
445 NumModuleValues = Values.size(); | 445 NumModuleValues = Values.size(); |
446 NumModuleMDValues = MDValues.size(); | 446 NumModuleMDValues = MDValues.size(); |
447 | 447 |
448 // Adding function arguments to the value table. | 448 // Adding function arguments to the value table. |
449 for (Function::const_arg_iterator I = F.arg_begin(), E = F.arg_end(); | 449 for (Function::const_arg_iterator I = F.arg_begin(), E = F.arg_end(); |
450 I != E; ++I) | 450 I != E; ++I) |
451 EnumerateValue(I); | 451 EnumerateValue(I); |
452 | 452 |
453 FirstFuncConstantID = Values.size(); | 453 FirstFuncConstantID = Values.size(); |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
497 if (!I->getType()->isVoidTy()) | 497 if (!I->getType()->isVoidTy()) |
498 EnumerateValue(I); | 498 EnumerateValue(I); |
499 } | 499 } |
500 } | 500 } |
501 | 501 |
502 // Add all of the function-local metadata. | 502 // Add all of the function-local metadata. |
503 for (unsigned i = 0, e = FnLocalMDVector.size(); i != e; ++i) | 503 for (unsigned i = 0, e = FnLocalMDVector.size(); i != e; ++i) |
504 EnumerateFunctionLocalMetadata(FnLocalMDVector[i]); | 504 EnumerateFunctionLocalMetadata(FnLocalMDVector[i]); |
505 } | 505 } |
506 | 506 |
507 void ValueEnumerator::purgeFunction() { | 507 void PNaClValueEnumerator::purgeFunction() { |
508 /// Remove purged values from the ValueMap. | 508 /// Remove purged values from the ValueMap. |
509 for (unsigned i = NumModuleValues, e = Values.size(); i != e; ++i) | 509 for (unsigned i = NumModuleValues, e = Values.size(); i != e; ++i) |
510 ValueMap.erase(Values[i].first); | 510 ValueMap.erase(Values[i].first); |
511 for (unsigned i = NumModuleMDValues, e = MDValues.size(); i != e; ++i) | 511 for (unsigned i = NumModuleMDValues, e = MDValues.size(); i != e; ++i) |
512 MDValueMap.erase(MDValues[i].first); | 512 MDValueMap.erase(MDValues[i].first); |
513 for (unsigned i = 0, e = BasicBlocks.size(); i != e; ++i) | 513 for (unsigned i = 0, e = BasicBlocks.size(); i != e; ++i) |
514 ValueMap.erase(BasicBlocks[i]); | 514 ValueMap.erase(BasicBlocks[i]); |
515 | 515 |
516 Values.resize(NumModuleValues); | 516 Values.resize(NumModuleValues); |
517 MDValues.resize(NumModuleMDValues); | 517 MDValues.resize(NumModuleMDValues); |
518 BasicBlocks.clear(); | 518 BasicBlocks.clear(); |
519 FunctionLocalMDs.clear(); | 519 FunctionLocalMDs.clear(); |
520 } | 520 } |
521 | 521 |
522 static void IncorporateFunctionInfoGlobalBBIDs(const Function *F, | 522 static void IncorporateFunctionInfoGlobalBBIDs(const Function *F, |
523 DenseMap<const BasicBlock*, unsigned> &IDMap) { | 523 DenseMap<const BasicBlock*, unsigned> &IDMap) { |
524 unsigned Counter = 0; | 524 unsigned Counter = 0; |
525 for (Function::const_iterator BB = F->begin(), E = F->end(); BB != E; ++BB) | 525 for (Function::const_iterator BB = F->begin(), E = F->end(); BB != E; ++BB) |
526 IDMap[BB] = ++Counter; | 526 IDMap[BB] = ++Counter; |
527 } | 527 } |
528 | 528 |
529 /// getGlobalBasicBlockID - This returns the function-specific ID for the | 529 /// getGlobalBasicBlockID - This returns the function-specific ID for the |
530 /// specified basic block. This is relatively expensive information, so it | 530 /// specified basic block. This is relatively expensive information, so it |
531 /// should only be used by rare constructs such as address-of-label. | 531 /// should only be used by rare constructs such as address-of-label. |
532 unsigned ValueEnumerator::getGlobalBasicBlockID(const BasicBlock *BB) const { | 532 unsigned PNaClValueEnumerator::getGlobalBasicBlockID(const BasicBlock *BB) const { |
533 unsigned &Idx = GlobalBasicBlockIDs[BB]; | 533 unsigned &Idx = GlobalBasicBlockIDs[BB]; |
534 if (Idx != 0) | 534 if (Idx != 0) |
535 return Idx-1; | 535 return Idx-1; |
536 | 536 |
537 IncorporateFunctionInfoGlobalBBIDs(BB->getParent(), GlobalBasicBlockIDs); | 537 IncorporateFunctionInfoGlobalBBIDs(BB->getParent(), GlobalBasicBlockIDs); |
538 return getGlobalBasicBlockID(BB); | 538 return getGlobalBasicBlockID(BB); |
539 } | 539 } |
540 | 540 |
OLD | NEW |