1 | //===- ValueEnumerator.cpp - Number values and types for bitcode writer ---===// |
2 | // |
3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
4 | // See https://llvm.org/LICENSE.txt for license information. |
5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
6 | // |
7 | //===----------------------------------------------------------------------===// |
8 | // |
9 | // This file implements the ValueEnumerator class. |
10 | // |
11 | //===----------------------------------------------------------------------===// |
12 | |
13 | #include "ValueEnumerator.h" |
14 | #include "llvm/ADT/SmallVector.h" |
15 | #include "llvm/Config/llvm-config.h" |
16 | #include "llvm/IR/Argument.h" |
17 | #include "llvm/IR/BasicBlock.h" |
18 | #include "llvm/IR/Constant.h" |
19 | #include "llvm/IR/DebugInfoMetadata.h" |
20 | #include "llvm/IR/DerivedTypes.h" |
21 | #include "llvm/IR/Function.h" |
22 | #include "llvm/IR/GlobalAlias.h" |
23 | #include "llvm/IR/GlobalIFunc.h" |
24 | #include "llvm/IR/GlobalObject.h" |
25 | #include "llvm/IR/GlobalValue.h" |
26 | #include "llvm/IR/GlobalVariable.h" |
27 | #include "llvm/IR/Instruction.h" |
28 | #include "llvm/IR/Instructions.h" |
29 | #include "llvm/IR/Metadata.h" |
30 | #include "llvm/IR/Module.h" |
31 | #include "llvm/IR/Operator.h" |
32 | #include "llvm/IR/Type.h" |
33 | #include "llvm/IR/Use.h" |
34 | #include "llvm/IR/User.h" |
35 | #include "llvm/IR/Value.h" |
36 | #include "llvm/IR/ValueSymbolTable.h" |
37 | #include "llvm/Support/Casting.h" |
38 | #include "llvm/Support/Compiler.h" |
39 | #include "llvm/Support/Debug.h" |
40 | #include "llvm/Support/MathExtras.h" |
41 | #include "llvm/Support/raw_ostream.h" |
42 | #include <algorithm> |
43 | #include <cstddef> |
44 | #include <iterator> |
45 | #include <tuple> |
46 | |
47 | using namespace llvm; |
48 | |
49 | namespace { |
50 | |
51 | struct OrderMap { |
52 | DenseMap<const Value *, std::pair<unsigned, bool>> IDs; |
53 | unsigned LastGlobalValueID = 0; |
54 | |
55 | OrderMap() = default; |
56 | |
57 | bool isGlobalValue(unsigned ID) const { |
58 | return ID <= LastGlobalValueID; |
59 | } |
60 | |
61 | unsigned size() const { return IDs.size(); } |
62 | std::pair<unsigned, bool> &operator[](const Value *V) { return IDs[V]; } |
63 | |
64 | std::pair<unsigned, bool> lookup(const Value *V) const { |
65 | return IDs.lookup(Val: V); |
66 | } |
67 | |
68 | void index(const Value *V) { |
69 | // Explicitly sequence get-size and insert-value operations to avoid UB. |
70 | unsigned ID = IDs.size() + 1; |
71 | IDs[V].first = ID; |
72 | } |
73 | }; |
74 | |
75 | } // end anonymous namespace |
76 | |
77 | static void orderValue(const Value *V, OrderMap &OM) { |
78 | if (OM.lookup(V).first) |
79 | return; |
80 | |
81 | if (const Constant *C = dyn_cast<Constant>(Val: V)) { |
82 | if (C->getNumOperands()) { |
83 | for (const Value *Op : C->operands()) |
84 | if (!isa<BasicBlock>(Val: Op) && !isa<GlobalValue>(Val: Op)) |
85 | orderValue(V: Op, OM); |
86 | if (auto *CE = dyn_cast<ConstantExpr>(Val: C)) |
87 | if (CE->getOpcode() == Instruction::ShuffleVector) |
88 | orderValue(V: CE->getShuffleMaskForBitcode(), OM); |
89 | } |
90 | } |
91 | |
92 | // Note: we cannot cache this lookup above, since inserting into the map |
93 | // changes the map's size, and thus affects the other IDs. |
94 | OM.index(V); |
95 | } |
96 | |
97 | static OrderMap orderModule(const Module &M) { |
98 | // This needs to match the order used by ValueEnumerator::ValueEnumerator() |
99 | // and ValueEnumerator::incorporateFunction(). |
100 | OrderMap OM; |
101 | |
102 | // Initializers of GlobalValues are processed in |
103 | // BitcodeReader::ResolveGlobalAndAliasInits(). Match the order there rather |
104 | // than ValueEnumerator, and match the code in predictValueUseListOrderImpl() |
105 | // by giving IDs in reverse order. |
106 | // |
107 | // Since GlobalValues never reference each other directly (just through |
108 | // initializers), their relative IDs only matter for determining order of |
109 | // uses in their initializers. |
110 | for (const GlobalVariable &G : reverse(C: M.globals())) |
111 | orderValue(V: &G, OM); |
112 | for (const GlobalAlias &A : reverse(C: M.aliases())) |
113 | orderValue(V: &A, OM); |
114 | for (const GlobalIFunc &I : reverse(C: M.ifuncs())) |
115 | orderValue(V: &I, OM); |
116 | for (const Function &F : reverse(C: M)) |
117 | orderValue(V: &F, OM); |
118 | OM.LastGlobalValueID = OM.size(); |
119 | |
120 | auto orderConstantValue = [&OM](const Value *V) { |
121 | if (isa<Constant>(Val: V) || isa<InlineAsm>(Val: V)) |
122 | orderValue(V, OM); |
123 | }; |
124 | |
125 | for (const Function &F : M) { |
126 | if (F.isDeclaration()) |
127 | continue; |
128 | // Here we need to match the union of ValueEnumerator::incorporateFunction() |
129 | // and WriteFunction(). Basic blocks are implicitly declared before |
130 | // anything else (by declaring their size). |
131 | for (const BasicBlock &BB : F) |
132 | orderValue(V: &BB, OM); |
133 | |
134 | // Metadata used by instructions is decoded before the actual instructions, |
135 | // so visit any constants used by it beforehand. |
136 | for (const BasicBlock &BB : F) |
137 | for (const Instruction &I : BB) { |
138 | auto OrderConstantFromMetadata = [&](Metadata *MD) { |
139 | if (const auto *VAM = dyn_cast<ValueAsMetadata>(Val: MD)) { |
140 | orderConstantValue(VAM->getValue()); |
141 | } else if (const auto *AL = dyn_cast<DIArgList>(Val: MD)) { |
142 | for (const auto *VAM : AL->getArgs()) |
143 | orderConstantValue(VAM->getValue()); |
144 | } |
145 | }; |
146 | |
147 | for (DbgVariableRecord &DVR : filterDbgVars(R: I.getDbgRecordRange())) { |
148 | OrderConstantFromMetadata(DVR.getRawLocation()); |
149 | if (DVR.isDbgAssign()) |
150 | OrderConstantFromMetadata(DVR.getRawAddress()); |
151 | } |
152 | |
153 | for (const Value *V : I.operands()) { |
154 | if (const auto *MAV = dyn_cast<MetadataAsValue>(Val: V)) |
155 | OrderConstantFromMetadata(MAV->getMetadata()); |
156 | } |
157 | } |
158 | |
159 | for (const Argument &A : F.args()) |
160 | orderValue(V: &A, OM); |
161 | for (const BasicBlock &BB : F) |
162 | for (const Instruction &I : BB) { |
163 | for (const Value *Op : I.operands()) |
164 | orderConstantValue(Op); |
165 | if (auto *SVI = dyn_cast<ShuffleVectorInst>(Val: &I)) |
166 | orderValue(V: SVI->getShuffleMaskForBitcode(), OM); |
167 | orderValue(V: &I, OM); |
168 | } |
169 | } |
170 | return OM; |
171 | } |
172 | |
173 | static void predictValueUseListOrderImpl(const Value *V, const Function *F, |
174 | unsigned ID, const OrderMap &OM, |
175 | UseListOrderStack &Stack) { |
176 | // Predict use-list order for this one. |
177 | using Entry = std::pair<const Use *, unsigned>; |
178 | SmallVector<Entry, 64> List; |
179 | for (const Use &U : V->uses()) |
180 | // Check if this user will be serialized. |
181 | if (OM.lookup(V: U.getUser()).first) |
182 | List.push_back(Elt: std::make_pair(x: &U, y: List.size())); |
183 | |
184 | if (List.size() < 2) |
185 | // We may have lost some users. |
186 | return; |
187 | |
188 | bool IsGlobalValue = OM.isGlobalValue(ID); |
189 | llvm::sort(C&: List, Comp: [&](const Entry &L, const Entry &R) { |
190 | const Use *LU = L.first; |
191 | const Use *RU = R.first; |
192 | if (LU == RU) |
193 | return false; |
194 | |
195 | auto LID = OM.lookup(V: LU->getUser()).first; |
196 | auto RID = OM.lookup(V: RU->getUser()).first; |
197 | |
198 | // If ID is 4, then expect: 7 6 5 1 2 3. |
199 | if (LID < RID) { |
200 | if (RID <= ID) |
201 | if (!IsGlobalValue) // GlobalValue uses don't get reversed. |
202 | return true; |
203 | return false; |
204 | } |
205 | if (RID < LID) { |
206 | if (LID <= ID) |
207 | if (!IsGlobalValue) // GlobalValue uses don't get reversed. |
208 | return false; |
209 | return true; |
210 | } |
211 | |
212 | // LID and RID are equal, so we have different operands of the same user. |
213 | // Assume operands are added in order for all instructions. |
214 | if (LID <= ID) |
215 | if (!IsGlobalValue) // GlobalValue uses don't get reversed. |
216 | return LU->getOperandNo() < RU->getOperandNo(); |
217 | return LU->getOperandNo() > RU->getOperandNo(); |
218 | }); |
219 | |
220 | if (llvm::is_sorted(Range&: List, C: llvm::less_second())) |
221 | // Order is already correct. |
222 | return; |
223 | |
224 | // Store the shuffle. |
225 | Stack.emplace_back(args&: V, args&: F, args: List.size()); |
226 | assert(List.size() == Stack.back().Shuffle.size() && "Wrong size" ); |
227 | for (size_t I = 0, E = List.size(); I != E; ++I) |
228 | Stack.back().Shuffle[I] = List[I].second; |
229 | } |
230 | |
231 | static void predictValueUseListOrder(const Value *V, const Function *F, |
232 | OrderMap &OM, UseListOrderStack &Stack) { |
233 | if (!V->hasUseList()) |
234 | return; |
235 | |
236 | auto &IDPair = OM[V]; |
237 | assert(IDPair.first && "Unmapped value" ); |
238 | if (IDPair.second) |
239 | // Already predicted. |
240 | return; |
241 | |
242 | // Do the actual prediction. |
243 | IDPair.second = true; |
244 | if (!V->use_empty() && std::next(x: V->use_begin()) != V->use_end()) |
245 | predictValueUseListOrderImpl(V, F, ID: IDPair.first, OM, Stack); |
246 | |
247 | // Recursive descent into constants. |
248 | if (const Constant *C = dyn_cast<Constant>(Val: V)) { |
249 | if (C->getNumOperands()) { // Visit GlobalValues. |
250 | for (const Value *Op : C->operands()) |
251 | if (isa<Constant>(Val: Op)) // Visit GlobalValues. |
252 | predictValueUseListOrder(V: Op, F, OM, Stack); |
253 | if (auto *CE = dyn_cast<ConstantExpr>(Val: C)) |
254 | if (CE->getOpcode() == Instruction::ShuffleVector) |
255 | predictValueUseListOrder(V: CE->getShuffleMaskForBitcode(), F, OM, |
256 | Stack); |
257 | } |
258 | } |
259 | } |
260 | |
261 | static UseListOrderStack predictUseListOrder(const Module &M) { |
262 | OrderMap OM = orderModule(M); |
263 | |
264 | // Use-list orders need to be serialized after all the users have been added |
265 | // to a value, or else the shuffles will be incomplete. Store them per |
266 | // function in a stack. |
267 | // |
268 | // Aside from function order, the order of values doesn't matter much here. |
269 | UseListOrderStack Stack; |
270 | |
271 | // We want to visit the functions backward now so we can list function-local |
272 | // constants in the last Function they're used in. Module-level constants |
273 | // have already been visited above. |
274 | for (const Function &F : llvm::reverse(C: M)) { |
275 | auto PredictValueOrderFromMetadata = [&](Metadata *MD) { |
276 | if (const auto *VAM = dyn_cast<ValueAsMetadata>(Val: MD)) { |
277 | predictValueUseListOrder(V: VAM->getValue(), F: &F, OM, Stack); |
278 | } else if (const auto *AL = dyn_cast<DIArgList>(Val: MD)) { |
279 | for (const auto *VAM : AL->getArgs()) |
280 | predictValueUseListOrder(V: VAM->getValue(), F: &F, OM, Stack); |
281 | } |
282 | }; |
283 | if (F.isDeclaration()) |
284 | continue; |
285 | for (const BasicBlock &BB : F) |
286 | predictValueUseListOrder(V: &BB, F: &F, OM, Stack); |
287 | for (const Argument &A : F.args()) |
288 | predictValueUseListOrder(V: &A, F: &F, OM, Stack); |
289 | for (const BasicBlock &BB : F) { |
290 | for (const Instruction &I : BB) { |
291 | for (DbgVariableRecord &DVR : filterDbgVars(R: I.getDbgRecordRange())) { |
292 | PredictValueOrderFromMetadata(DVR.getRawLocation()); |
293 | if (DVR.isDbgAssign()) |
294 | PredictValueOrderFromMetadata(DVR.getRawAddress()); |
295 | } |
296 | for (const Value *Op : I.operands()) { |
297 | if (isa<Constant>(Val: *Op) || isa<InlineAsm>(Val: *Op)) // Visit GlobalValues. |
298 | predictValueUseListOrder(V: Op, F: &F, OM, Stack); |
299 | if (const auto *MAV = dyn_cast<MetadataAsValue>(Val: Op)) |
300 | PredictValueOrderFromMetadata(MAV->getMetadata()); |
301 | } |
302 | if (auto *SVI = dyn_cast<ShuffleVectorInst>(Val: &I)) |
303 | predictValueUseListOrder(V: SVI->getShuffleMaskForBitcode(), F: &F, OM, |
304 | Stack); |
305 | predictValueUseListOrder(V: &I, F: &F, OM, Stack); |
306 | } |
307 | } |
308 | } |
309 | |
310 | // Visit globals last, since the module-level use-list block will be seen |
311 | // before the function bodies are processed. |
312 | for (const GlobalVariable &G : M.globals()) |
313 | predictValueUseListOrder(V: &G, F: nullptr, OM, Stack); |
314 | for (const Function &F : M) |
315 | predictValueUseListOrder(V: &F, F: nullptr, OM, Stack); |
316 | for (const GlobalAlias &A : M.aliases()) |
317 | predictValueUseListOrder(V: &A, F: nullptr, OM, Stack); |
318 | for (const GlobalIFunc &I : M.ifuncs()) |
319 | predictValueUseListOrder(V: &I, F: nullptr, OM, Stack); |
320 | for (const GlobalVariable &G : M.globals()) |
321 | if (G.hasInitializer()) |
322 | predictValueUseListOrder(V: G.getInitializer(), F: nullptr, OM, Stack); |
323 | for (const GlobalAlias &A : M.aliases()) |
324 | predictValueUseListOrder(V: A.getAliasee(), F: nullptr, OM, Stack); |
325 | for (const GlobalIFunc &I : M.ifuncs()) |
326 | predictValueUseListOrder(V: I.getResolver(), F: nullptr, OM, Stack); |
327 | for (const Function &F : M) { |
328 | for (const Use &U : F.operands()) |
329 | predictValueUseListOrder(V: U.get(), F: nullptr, OM, Stack); |
330 | } |
331 | |
332 | return Stack; |
333 | } |
334 | |
335 | static bool isIntOrIntVectorValue(const std::pair<const Value*, unsigned> &V) { |
336 | return V.first->getType()->isIntOrIntVectorTy(); |
337 | } |
338 | |
339 | ValueEnumerator::ValueEnumerator(const Module &M, |
340 | bool ShouldPreserveUseListOrder) |
341 | : ShouldPreserveUseListOrder(ShouldPreserveUseListOrder) { |
342 | if (ShouldPreserveUseListOrder) |
343 | UseListOrders = predictUseListOrder(M); |
344 | |
345 | // Enumerate the global variables. |
346 | for (const GlobalVariable &GV : M.globals()) { |
347 | EnumerateValue(V: &GV); |
348 | EnumerateType(T: GV.getValueType()); |
349 | } |
350 | |
351 | // Enumerate the functions. |
352 | for (const Function & F : M) { |
353 | EnumerateValue(V: &F); |
354 | EnumerateType(T: F.getValueType()); |
355 | EnumerateAttributes(PAL: F.getAttributes()); |
356 | } |
357 | |
358 | // Enumerate the aliases. |
359 | for (const GlobalAlias &GA : M.aliases()) { |
360 | EnumerateValue(V: &GA); |
361 | EnumerateType(T: GA.getValueType()); |
362 | } |
363 | |
364 | // Enumerate the ifuncs. |
365 | for (const GlobalIFunc &GIF : M.ifuncs()) { |
366 | EnumerateValue(V: &GIF); |
367 | EnumerateType(T: GIF.getValueType()); |
368 | } |
369 | |
370 | // Remember what is the cutoff between globalvalue's and other constants. |
371 | unsigned FirstConstant = Values.size(); |
372 | |
373 | // Enumerate the global variable initializers and attributes. |
374 | for (const GlobalVariable &GV : M.globals()) { |
375 | if (GV.hasInitializer()) |
376 | EnumerateValue(V: GV.getInitializer()); |
377 | if (GV.hasAttributes()) |
378 | EnumerateAttributes(PAL: GV.getAttributesAsList(index: AttributeList::FunctionIndex)); |
379 | } |
380 | |
381 | // Enumerate the aliasees. |
382 | for (const GlobalAlias &GA : M.aliases()) |
383 | EnumerateValue(V: GA.getAliasee()); |
384 | |
385 | // Enumerate the ifunc resolvers. |
386 | for (const GlobalIFunc &GIF : M.ifuncs()) |
387 | EnumerateValue(V: GIF.getResolver()); |
388 | |
389 | // Enumerate any optional Function data. |
390 | for (const Function &F : M) |
391 | for (const Use &U : F.operands()) |
392 | EnumerateValue(V: U.get()); |
393 | |
394 | // Enumerate the metadata type. |
395 | // |
396 | // TODO: Move this to ValueEnumerator::EnumerateOperandType() once bitcode |
397 | // only encodes the metadata type when it's used as a value. |
398 | EnumerateType(T: Type::getMetadataTy(C&: M.getContext())); |
399 | |
400 | // Insert constants and metadata that are named at module level into the slot |
401 | // pool so that the module symbol table can refer to them... |
402 | EnumerateValueSymbolTable(ST: M.getValueSymbolTable()); |
403 | EnumerateNamedMetadata(M); |
404 | |
405 | SmallVector<std::pair<unsigned, MDNode *>, 8> MDs; |
406 | for (const GlobalVariable &GV : M.globals()) { |
407 | MDs.clear(); |
408 | GV.getAllMetadata(MDs); |
409 | for (const auto &I : MDs) |
410 | // FIXME: Pass GV to EnumerateMetadata and arrange for the bitcode writer |
411 | // to write metadata to the global variable's own metadata block |
412 | // (PR28134). |
413 | EnumerateMetadata(F: nullptr, MD: I.second); |
414 | } |
415 | |
416 | // Enumerate types used by function bodies and argument lists. |
417 | for (const Function &F : M) { |
418 | for (const Argument &A : F.args()) |
419 | EnumerateType(T: A.getType()); |
420 | |
421 | // Enumerate metadata attached to this function. |
422 | MDs.clear(); |
423 | F.getAllMetadata(MDs); |
424 | for (const auto &I : MDs) |
425 | EnumerateMetadata(F: F.isDeclaration() ? nullptr : &F, MD: I.second); |
426 | |
427 | for (const BasicBlock &BB : F) |
428 | for (const Instruction &I : BB) { |
429 | // Local metadata is enumerated during function-incorporation, but |
430 | // any ConstantAsMetadata arguments in a DIArgList should be examined |
431 | // now. |
432 | auto EnumerateNonLocalValuesFromMetadata = [&](Metadata *MD) { |
433 | assert(MD && "Metadata unexpectedly null" ); |
434 | if (const auto *AL = dyn_cast<DIArgList>(Val: MD)) { |
435 | for (const auto *VAM : AL->getArgs()) { |
436 | if (isa<ConstantAsMetadata>(Val: VAM)) |
437 | EnumerateMetadata(F: &F, MD: VAM); |
438 | } |
439 | return; |
440 | } |
441 | |
442 | if (!isa<LocalAsMetadata>(Val: MD)) |
443 | EnumerateMetadata(F: &F, MD); |
444 | }; |
445 | |
446 | for (DbgRecord &DR : I.getDbgRecordRange()) { |
447 | if (DbgLabelRecord *DLR = dyn_cast<DbgLabelRecord>(Val: &DR)) { |
448 | EnumerateMetadata(F: &F, MD: DLR->getLabel()); |
449 | EnumerateMetadata(F: &F, MD: &*DLR->getDebugLoc()); |
450 | continue; |
451 | } |
452 | // Enumerate non-local location metadata. |
453 | DbgVariableRecord &DVR = cast<DbgVariableRecord>(Val&: DR); |
454 | EnumerateNonLocalValuesFromMetadata(DVR.getRawLocation()); |
455 | EnumerateMetadata(F: &F, MD: DVR.getExpression()); |
456 | EnumerateMetadata(F: &F, MD: DVR.getVariable()); |
457 | EnumerateMetadata(F: &F, MD: &*DVR.getDebugLoc()); |
458 | if (DVR.isDbgAssign()) { |
459 | EnumerateNonLocalValuesFromMetadata(DVR.getRawAddress()); |
460 | EnumerateMetadata(F: &F, MD: DVR.getAssignID()); |
461 | EnumerateMetadata(F: &F, MD: DVR.getAddressExpression()); |
462 | } |
463 | } |
464 | for (const Use &Op : I.operands()) { |
465 | auto *MD = dyn_cast<MetadataAsValue>(Val: &Op); |
466 | if (!MD) { |
467 | EnumerateOperandType(V: Op); |
468 | continue; |
469 | } |
470 | |
471 | EnumerateNonLocalValuesFromMetadata(MD->getMetadata()); |
472 | } |
473 | if (auto *SVI = dyn_cast<ShuffleVectorInst>(Val: &I)) |
474 | EnumerateType(T: SVI->getShuffleMaskForBitcode()->getType()); |
475 | if (auto *GEP = dyn_cast<GetElementPtrInst>(Val: &I)) |
476 | EnumerateType(T: GEP->getSourceElementType()); |
477 | if (auto *AI = dyn_cast<AllocaInst>(Val: &I)) |
478 | EnumerateType(T: AI->getAllocatedType()); |
479 | EnumerateType(T: I.getType()); |
480 | if (const auto *Call = dyn_cast<CallBase>(Val: &I)) { |
481 | EnumerateAttributes(PAL: Call->getAttributes()); |
482 | EnumerateType(T: Call->getFunctionType()); |
483 | } |
484 | |
485 | // Enumerate metadata attached with this instruction. |
486 | MDs.clear(); |
487 | I.getAllMetadataOtherThanDebugLoc(MDs); |
488 | for (const auto &MD : MDs) |
489 | EnumerateMetadata(F: &F, MD: MD.second); |
490 | |
491 | // Don't enumerate the location directly -- it has a special record |
492 | // type -- but enumerate its operands. |
493 | if (DILocation *L = I.getDebugLoc()) |
494 | for (const Metadata *Op : L->operands()) |
495 | EnumerateMetadata(F: &F, MD: Op); |
496 | } |
497 | } |
498 | |
499 | // Optimize constant ordering. |
500 | OptimizeConstants(CstStart: FirstConstant, CstEnd: Values.size()); |
501 | |
502 | // Organize metadata ordering. |
503 | organizeMetadata(); |
504 | } |
505 | |
506 | unsigned ValueEnumerator::getInstructionID(const Instruction *Inst) const { |
507 | InstructionMapType::const_iterator I = InstructionMap.find(Val: Inst); |
508 | assert(I != InstructionMap.end() && "Instruction is not mapped!" ); |
509 | return I->second; |
510 | } |
511 | |
512 | unsigned ValueEnumerator::getComdatID(const Comdat *C) const { |
513 | unsigned ComdatID = Comdats.idFor(Entry: C); |
514 | assert(ComdatID && "Comdat not found!" ); |
515 | return ComdatID; |
516 | } |
517 | |
518 | void ValueEnumerator::setInstructionID(const Instruction *I) { |
519 | InstructionMap[I] = InstructionCount++; |
520 | } |
521 | |
522 | unsigned ValueEnumerator::getValueID(const Value *V) const { |
523 | if (auto *MD = dyn_cast<MetadataAsValue>(Val: V)) |
524 | return getMetadataID(MD: MD->getMetadata()); |
525 | |
526 | ValueMapType::const_iterator I = ValueMap.find(Val: V); |
527 | assert(I != ValueMap.end() && "Value not in slotcalculator!" ); |
528 | return I->second-1; |
529 | } |
530 | |
531 | #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) |
532 | LLVM_DUMP_METHOD void ValueEnumerator::dump() const { |
533 | print(dbgs(), ValueMap, "Default" ); |
534 | dbgs() << '\n'; |
535 | print(dbgs(), MetadataMap, "MetaData" ); |
536 | dbgs() << '\n'; |
537 | } |
538 | #endif |
539 | |
540 | void ValueEnumerator::print(raw_ostream &OS, const ValueMapType &Map, |
541 | const char *Name) const { |
542 | OS << "Map Name: " << Name << "\n" ; |
543 | OS << "Size: " << Map.size() << "\n" ; |
544 | for (const auto &I : Map) { |
545 | const Value *V = I.first; |
546 | if (V->hasName()) |
547 | OS << "Value: " << V->getName(); |
548 | else |
549 | OS << "Value: [null]\n" ; |
550 | V->print(O&: errs()); |
551 | errs() << '\n'; |
552 | |
553 | OS << " Uses(" << V->getNumUses() << "):" ; |
554 | for (const Use &U : V->uses()) { |
555 | if (&U != &*V->use_begin()) |
556 | OS << "," ; |
557 | if(U->hasName()) |
558 | OS << " " << U->getName(); |
559 | else |
560 | OS << " [null]" ; |
561 | |
562 | } |
563 | OS << "\n\n" ; |
564 | } |
565 | } |
566 | |
567 | void ValueEnumerator::print(raw_ostream &OS, const MetadataMapType &Map, |
568 | const char *Name) const { |
569 | OS << "Map Name: " << Name << "\n" ; |
570 | OS << "Size: " << Map.size() << "\n" ; |
571 | for (const auto &I : Map) { |
572 | const Metadata *MD = I.first; |
573 | OS << "Metadata: slot = " << I.second.ID << "\n" ; |
574 | OS << "Metadata: function = " << I.second.F << "\n" ; |
575 | MD->print(OS); |
576 | OS << "\n" ; |
577 | } |
578 | } |
579 | |
580 | /// OptimizeConstants - Reorder constant pool for denser encoding. |
581 | void ValueEnumerator::OptimizeConstants(unsigned CstStart, unsigned CstEnd) { |
582 | if (CstStart == CstEnd || CstStart+1 == CstEnd) return; |
583 | |
584 | if (ShouldPreserveUseListOrder) |
585 | // Optimizing constants makes the use-list order difficult to predict. |
586 | // Disable it for now when trying to preserve the order. |
587 | return; |
588 | |
589 | std::stable_sort(first: Values.begin() + CstStart, last: Values.begin() + CstEnd, |
590 | comp: [this](const std::pair<const Value *, unsigned> &LHS, |
591 | const std::pair<const Value *, unsigned> &RHS) { |
592 | // Sort by plane. |
593 | if (LHS.first->getType() != RHS.first->getType()) |
594 | return getTypeID(T: LHS.first->getType()) < getTypeID(T: RHS.first->getType()); |
595 | // Then by frequency. |
596 | return LHS.second > RHS.second; |
597 | }); |
598 | |
599 | // Ensure that integer and vector of integer constants are at the start of the |
600 | // constant pool. This is important so that GEP structure indices come before |
601 | // gep constant exprs. |
602 | std::stable_partition(first: Values.begin() + CstStart, last: Values.begin() + CstEnd, |
603 | pred: isIntOrIntVectorValue); |
604 | |
605 | // Rebuild the modified portion of ValueMap. |
606 | for (; CstStart != CstEnd; ++CstStart) |
607 | ValueMap[Values[CstStart].first] = CstStart+1; |
608 | } |
609 | |
610 | /// EnumerateValueSymbolTable - Insert all of the values in the specified symbol |
611 | /// table into the values table. |
612 | void ValueEnumerator::EnumerateValueSymbolTable(const ValueSymbolTable &VST) { |
613 | for (ValueSymbolTable::const_iterator VI = VST.begin(), VE = VST.end(); |
614 | VI != VE; ++VI) |
615 | EnumerateValue(V: VI->getValue()); |
616 | } |
617 | |
618 | /// Insert all of the values referenced by named metadata in the specified |
619 | /// module. |
620 | void ValueEnumerator::EnumerateNamedMetadata(const Module &M) { |
621 | for (const auto &I : M.named_metadata()) |
622 | EnumerateNamedMDNode(NMD: &I); |
623 | } |
624 | |
625 | void ValueEnumerator::EnumerateNamedMDNode(const NamedMDNode *MD) { |
626 | for (const MDNode *N : MD->operands()) |
627 | EnumerateMetadata(F: nullptr, MD: N); |
628 | } |
629 | |
630 | unsigned ValueEnumerator::getMetadataFunctionID(const Function *F) const { |
631 | return F ? getValueID(V: F) + 1 : 0; |
632 | } |
633 | |
634 | void ValueEnumerator::EnumerateMetadata(const Function *F, const Metadata *MD) { |
635 | EnumerateMetadata(F: getMetadataFunctionID(F), MD); |
636 | } |
637 | |
638 | void ValueEnumerator::EnumerateFunctionLocalMetadata( |
639 | const Function &F, const LocalAsMetadata *Local) { |
640 | EnumerateFunctionLocalMetadata(F: getMetadataFunctionID(F: &F), Local); |
641 | } |
642 | |
643 | void ValueEnumerator::EnumerateFunctionLocalListMetadata( |
644 | const Function &F, const DIArgList *ArgList) { |
645 | EnumerateFunctionLocalListMetadata(F: getMetadataFunctionID(F: &F), Arglist: ArgList); |
646 | } |
647 | |
648 | void ValueEnumerator::dropFunctionFromMetadata( |
649 | MetadataMapType::value_type &FirstMD) { |
650 | SmallVector<const MDNode *, 64> Worklist; |
651 | auto push = [&Worklist](MetadataMapType::value_type &MD) { |
652 | auto &Entry = MD.second; |
653 | |
654 | // Nothing to do if this metadata isn't tagged. |
655 | if (!Entry.F) |
656 | return; |
657 | |
658 | // Drop the function tag. |
659 | Entry.F = 0; |
660 | |
661 | // If this is has an ID and is an MDNode, then its operands have entries as |
662 | // well. We need to drop the function from them too. |
663 | if (Entry.ID) |
664 | if (auto *N = dyn_cast<MDNode>(Val: MD.first)) |
665 | Worklist.push_back(Elt: N); |
666 | }; |
667 | push(FirstMD); |
668 | while (!Worklist.empty()) |
669 | for (const Metadata *Op : Worklist.pop_back_val()->operands()) { |
670 | if (!Op) |
671 | continue; |
672 | auto MD = MetadataMap.find(Val: Op); |
673 | if (MD != MetadataMap.end()) |
674 | push(*MD); |
675 | } |
676 | } |
677 | |
678 | void ValueEnumerator::EnumerateMetadata(unsigned F, const Metadata *MD) { |
679 | // It's vital for reader efficiency that uniqued subgraphs are done in |
680 | // post-order; it's expensive when their operands have forward references. |
681 | // If a distinct node is referenced from a uniqued node, it'll be delayed |
682 | // until the uniqued subgraph has been completely traversed. |
683 | SmallVector<const MDNode *, 32> DelayedDistinctNodes; |
684 | |
685 | // Start by enumerating MD, and then work through its transitive operands in |
686 | // post-order. This requires a depth-first search. |
687 | SmallVector<std::pair<const MDNode *, MDNode::op_iterator>, 32> Worklist; |
688 | if (const MDNode *N = enumerateMetadataImpl(F, MD)) |
689 | Worklist.push_back(Elt: std::make_pair(x&: N, y: N->op_begin())); |
690 | |
691 | while (!Worklist.empty()) { |
692 | const MDNode *N = Worklist.back().first; |
693 | |
694 | // Enumerate operands until we hit a new node. We need to traverse these |
695 | // nodes' operands before visiting the rest of N's operands. |
696 | MDNode::op_iterator I = std::find_if( |
697 | first: Worklist.back().second, last: N->op_end(), |
698 | pred: [&](const Metadata *MD) { return enumerateMetadataImpl(F, MD); }); |
699 | if (I != N->op_end()) { |
700 | auto *Op = cast<MDNode>(Val: *I); |
701 | Worklist.back().second = ++I; |
702 | |
703 | // Delay traversing Op if it's a distinct node and N is uniqued. |
704 | if (Op->isDistinct() && !N->isDistinct()) |
705 | DelayedDistinctNodes.push_back(Elt: Op); |
706 | else |
707 | Worklist.push_back(Elt: std::make_pair(x&: Op, y: Op->op_begin())); |
708 | continue; |
709 | } |
710 | |
711 | // All the operands have been visited. Now assign an ID. |
712 | Worklist.pop_back(); |
713 | MDs.push_back(x: N); |
714 | MetadataMap[N].ID = MDs.size(); |
715 | |
716 | // Flush out any delayed distinct nodes; these are all the distinct nodes |
717 | // that are leaves in last uniqued subgraph. |
718 | if (Worklist.empty() || Worklist.back().first->isDistinct()) { |
719 | for (const MDNode *N : DelayedDistinctNodes) |
720 | Worklist.push_back(Elt: std::make_pair(x&: N, y: N->op_begin())); |
721 | DelayedDistinctNodes.clear(); |
722 | } |
723 | } |
724 | } |
725 | |
726 | const MDNode *ValueEnumerator::enumerateMetadataImpl(unsigned F, const Metadata *MD) { |
727 | if (!MD) |
728 | return nullptr; |
729 | |
730 | assert( |
731 | (isa<MDNode>(MD) || isa<MDString>(MD) || isa<ConstantAsMetadata>(MD)) && |
732 | "Invalid metadata kind" ); |
733 | |
734 | auto Insertion = MetadataMap.insert(KV: std::make_pair(x&: MD, y: MDIndex(F))); |
735 | MDIndex &Entry = Insertion.first->second; |
736 | if (!Insertion.second) { |
737 | // Already mapped. If F doesn't match the function tag, drop it. |
738 | if (Entry.hasDifferentFunction(NewF: F)) |
739 | dropFunctionFromMetadata(FirstMD&: *Insertion.first); |
740 | return nullptr; |
741 | } |
742 | |
743 | // Don't assign IDs to metadata nodes. |
744 | if (auto *N = dyn_cast<MDNode>(Val: MD)) |
745 | return N; |
746 | |
747 | // Save the metadata. |
748 | MDs.push_back(x: MD); |
749 | Entry.ID = MDs.size(); |
750 | |
751 | // Enumerate the constant, if any. |
752 | if (auto *C = dyn_cast<ConstantAsMetadata>(Val: MD)) |
753 | EnumerateValue(V: C->getValue()); |
754 | |
755 | return nullptr; |
756 | } |
757 | |
758 | /// EnumerateFunctionLocalMetadata - Incorporate function-local metadata |
759 | /// information reachable from the metadata. |
760 | void ValueEnumerator::EnumerateFunctionLocalMetadata( |
761 | unsigned F, const LocalAsMetadata *Local) { |
762 | assert(F && "Expected a function" ); |
763 | |
764 | // Check to see if it's already in! |
765 | MDIndex &Index = MetadataMap[Local]; |
766 | if (Index.ID) { |
767 | assert(Index.F == F && "Expected the same function" ); |
768 | return; |
769 | } |
770 | |
771 | MDs.push_back(x: Local); |
772 | Index.F = F; |
773 | Index.ID = MDs.size(); |
774 | |
775 | EnumerateValue(V: Local->getValue()); |
776 | } |
777 | |
778 | /// EnumerateFunctionLocalListMetadata - Incorporate function-local metadata |
779 | /// information reachable from the metadata. |
780 | void ValueEnumerator::EnumerateFunctionLocalListMetadata( |
781 | unsigned F, const DIArgList *ArgList) { |
782 | assert(F && "Expected a function" ); |
783 | |
784 | // Check to see if it's already in! |
785 | MDIndex &Index = MetadataMap[ArgList]; |
786 | if (Index.ID) { |
787 | assert(Index.F == F && "Expected the same function" ); |
788 | return; |
789 | } |
790 | |
791 | for (ValueAsMetadata *VAM : ArgList->getArgs()) { |
792 | if (isa<LocalAsMetadata>(Val: VAM)) { |
793 | assert(MetadataMap.count(VAM) && |
794 | "LocalAsMetadata should be enumerated before DIArgList" ); |
795 | assert(MetadataMap[VAM].F == F && |
796 | "Expected LocalAsMetadata in the same function" ); |
797 | } else { |
798 | assert(isa<ConstantAsMetadata>(VAM) && |
799 | "Expected LocalAsMetadata or ConstantAsMetadata" ); |
800 | assert(ValueMap.count(VAM->getValue()) && |
801 | "Constant should be enumerated beforeDIArgList" ); |
802 | EnumerateMetadata(F, MD: VAM); |
803 | } |
804 | } |
805 | |
806 | MDs.push_back(x: ArgList); |
807 | Index.F = F; |
808 | Index.ID = MDs.size(); |
809 | } |
810 | |
811 | static unsigned getMetadataTypeOrder(const Metadata *MD) { |
812 | // Strings are emitted in bulk and must come first. |
813 | if (isa<MDString>(Val: MD)) |
814 | return 0; |
815 | |
816 | // ConstantAsMetadata doesn't reference anything. We may as well shuffle it |
817 | // to the front since we can detect it. |
818 | auto *N = dyn_cast<MDNode>(Val: MD); |
819 | if (!N) |
820 | return 1; |
821 | |
822 | // The reader is fast forward references for distinct node operands, but slow |
823 | // when uniqued operands are unresolved. |
824 | return N->isDistinct() ? 2 : 3; |
825 | } |
826 | |
827 | void ValueEnumerator::organizeMetadata() { |
828 | assert(MetadataMap.size() == MDs.size() && |
829 | "Metadata map and vector out of sync" ); |
830 | |
831 | if (MDs.empty()) |
832 | return; |
833 | |
834 | // Copy out the index information from MetadataMap in order to choose a new |
835 | // order. |
836 | SmallVector<MDIndex, 64> Order; |
837 | Order.reserve(N: MetadataMap.size()); |
838 | for (const Metadata *MD : MDs) |
839 | Order.push_back(Elt: MetadataMap.lookup(Val: MD)); |
840 | |
841 | // Partition: |
842 | // - by function, then |
843 | // - by isa<MDString> |
844 | // and then sort by the original/current ID. Since the IDs are guaranteed to |
845 | // be unique, the result of llvm::sort will be deterministic. There's no need |
846 | // for std::stable_sort. |
847 | llvm::sort(C&: Order, Comp: [this](MDIndex LHS, MDIndex RHS) { |
848 | return std::make_tuple(args&: LHS.F, args: getMetadataTypeOrder(MD: LHS.get(MDs)), args&: LHS.ID) < |
849 | std::make_tuple(args&: RHS.F, args: getMetadataTypeOrder(MD: RHS.get(MDs)), args&: RHS.ID); |
850 | }); |
851 | |
852 | // Rebuild MDs, index the metadata ranges for each function in FunctionMDs, |
853 | // and fix up MetadataMap. |
854 | std::vector<const Metadata *> OldMDs; |
855 | MDs.swap(x&: OldMDs); |
856 | MDs.reserve(n: OldMDs.size()); |
857 | for (unsigned I = 0, E = Order.size(); I != E && !Order[I].F; ++I) { |
858 | auto *MD = Order[I].get(MDs: OldMDs); |
859 | MDs.push_back(x: MD); |
860 | MetadataMap[MD].ID = I + 1; |
861 | if (isa<MDString>(Val: MD)) |
862 | ++NumMDStrings; |
863 | } |
864 | |
865 | // Return early if there's nothing for the functions. |
866 | if (MDs.size() == Order.size()) |
867 | return; |
868 | |
869 | // Build the function metadata ranges. |
870 | MDRange R; |
871 | FunctionMDs.reserve(n: OldMDs.size()); |
872 | unsigned PrevF = 0; |
873 | for (unsigned I = MDs.size(), E = Order.size(), ID = MDs.size(); I != E; |
874 | ++I) { |
875 | unsigned F = Order[I].F; |
876 | if (!PrevF) { |
877 | PrevF = F; |
878 | } else if (PrevF != F) { |
879 | R.Last = FunctionMDs.size(); |
880 | std::swap(a&: R, b&: FunctionMDInfo[PrevF]); |
881 | R.First = FunctionMDs.size(); |
882 | |
883 | ID = MDs.size(); |
884 | PrevF = F; |
885 | } |
886 | |
887 | auto *MD = Order[I].get(MDs: OldMDs); |
888 | FunctionMDs.push_back(x: MD); |
889 | MetadataMap[MD].ID = ++ID; |
890 | if (isa<MDString>(Val: MD)) |
891 | ++R.NumStrings; |
892 | } |
893 | R.Last = FunctionMDs.size(); |
894 | FunctionMDInfo[PrevF] = R; |
895 | } |
896 | |
897 | void ValueEnumerator::incorporateFunctionMetadata(const Function &F) { |
898 | NumModuleMDs = MDs.size(); |
899 | |
900 | auto R = FunctionMDInfo.lookup(Val: getValueID(V: &F) + 1); |
901 | NumMDStrings = R.NumStrings; |
902 | MDs.insert(position: MDs.end(), first: FunctionMDs.begin() + R.First, |
903 | last: FunctionMDs.begin() + R.Last); |
904 | } |
905 | |
906 | void ValueEnumerator::EnumerateValue(const Value *V) { |
907 | assert(!V->getType()->isVoidTy() && "Can't insert void values!" ); |
908 | assert(!isa<MetadataAsValue>(V) && "EnumerateValue doesn't handle Metadata!" ); |
909 | |
910 | // Check to see if it's already in! |
911 | unsigned &ValueID = ValueMap[V]; |
912 | if (ValueID) { |
913 | // Increment use count. |
914 | Values[ValueID-1].second++; |
915 | return; |
916 | } |
917 | |
918 | if (auto *GO = dyn_cast<GlobalObject>(Val: V)) |
919 | if (const Comdat *C = GO->getComdat()) |
920 | Comdats.insert(Entry: C); |
921 | |
922 | // Enumerate the type of this value. |
923 | EnumerateType(T: V->getType()); |
924 | |
925 | if (const Constant *C = dyn_cast<Constant>(Val: V)) { |
926 | if (isa<GlobalValue>(Val: C)) { |
927 | // Initializers for globals are handled explicitly elsewhere. |
928 | } else if (C->getNumOperands()) { |
929 | // If a constant has operands, enumerate them. This makes sure that if a |
930 | // constant has uses (for example an array of const ints), that they are |
931 | // inserted also. |
932 | |
933 | // We prefer to enumerate them with values before we enumerate the user |
934 | // itself. This makes it more likely that we can avoid forward references |
935 | // in the reader. We know that there can be no cycles in the constants |
936 | // graph that don't go through a global variable. |
937 | for (const Use &U : C->operands()) |
938 | if (!isa<BasicBlock>(Val: U)) // Don't enumerate BB operand to BlockAddress. |
939 | EnumerateValue(V: U); |
940 | if (auto *CE = dyn_cast<ConstantExpr>(Val: C)) { |
941 | if (CE->getOpcode() == Instruction::ShuffleVector) |
942 | EnumerateValue(V: CE->getShuffleMaskForBitcode()); |
943 | if (auto *GEP = dyn_cast<GEPOperator>(Val: CE)) |
944 | EnumerateType(T: GEP->getSourceElementType()); |
945 | } |
946 | |
947 | // Finally, add the value. Doing this could make the ValueID reference be |
948 | // dangling, don't reuse it. |
949 | Values.push_back(x: std::make_pair(x&: V, y: 1U)); |
950 | ValueMap[V] = Values.size(); |
951 | return; |
952 | } |
953 | } |
954 | |
955 | // Add the value. |
956 | Values.push_back(x: std::make_pair(x&: V, y: 1U)); |
957 | ValueID = Values.size(); |
958 | } |
959 | |
960 | |
961 | void ValueEnumerator::EnumerateType(Type *Ty) { |
962 | unsigned *TypeID = &TypeMap[Ty]; |
963 | |
964 | // We've already seen this type. |
965 | if (*TypeID) |
966 | return; |
967 | |
968 | // If it is a non-anonymous struct, mark the type as being visited so that we |
969 | // don't recursively visit it. This is safe because we allow forward |
970 | // references of these in the bitcode reader. |
971 | if (StructType *STy = dyn_cast<StructType>(Val: Ty)) |
972 | if (!STy->isLiteral()) |
973 | *TypeID = ~0U; |
974 | |
975 | // Enumerate all of the subtypes before we enumerate this type. This ensures |
976 | // that the type will be enumerated in an order that can be directly built. |
977 | for (Type *SubTy : Ty->subtypes()) |
978 | EnumerateType(Ty: SubTy); |
979 | |
980 | // Refresh the TypeID pointer in case the table rehashed. |
981 | TypeID = &TypeMap[Ty]; |
982 | |
983 | // Check to see if we got the pointer another way. This can happen when |
984 | // enumerating recursive types that hit the base case deeper than they start. |
985 | // |
986 | // If this is actually a struct that we are treating as forward ref'able, |
987 | // then emit the definition now that all of its contents are available. |
988 | if (*TypeID && *TypeID != ~0U) |
989 | return; |
990 | |
991 | // Add this type now that its contents are all happily enumerated. |
992 | Types.push_back(x: Ty); |
993 | |
994 | *TypeID = Types.size(); |
995 | } |
996 | |
997 | // Enumerate the types for the specified value. If the value is a constant, |
998 | // walk through it, enumerating the types of the constant. |
999 | void ValueEnumerator::EnumerateOperandType(const Value *V) { |
1000 | EnumerateType(Ty: V->getType()); |
1001 | |
1002 | assert(!isa<MetadataAsValue>(V) && "Unexpected metadata operand" ); |
1003 | |
1004 | const Constant *C = dyn_cast<Constant>(Val: V); |
1005 | if (!C) |
1006 | return; |
1007 | |
1008 | // If this constant is already enumerated, ignore it, we know its type must |
1009 | // be enumerated. |
1010 | if (ValueMap.count(Val: C)) |
1011 | return; |
1012 | |
1013 | // This constant may have operands, make sure to enumerate the types in |
1014 | // them. |
1015 | for (const Value *Op : C->operands()) { |
1016 | // Don't enumerate basic blocks here, this happens as operands to |
1017 | // blockaddress. |
1018 | if (isa<BasicBlock>(Val: Op)) |
1019 | continue; |
1020 | |
1021 | EnumerateOperandType(V: Op); |
1022 | } |
1023 | if (auto *CE = dyn_cast<ConstantExpr>(Val: C)) { |
1024 | if (CE->getOpcode() == Instruction::ShuffleVector) |
1025 | EnumerateOperandType(V: CE->getShuffleMaskForBitcode()); |
1026 | if (CE->getOpcode() == Instruction::GetElementPtr) |
1027 | EnumerateType(Ty: cast<GEPOperator>(Val: CE)->getSourceElementType()); |
1028 | } |
1029 | } |
1030 | |
1031 | void ValueEnumerator::EnumerateAttributes(AttributeList PAL) { |
1032 | if (PAL.isEmpty()) return; // null is always 0. |
1033 | |
1034 | // Do a lookup. |
1035 | unsigned &Entry = AttributeListMap[PAL]; |
1036 | if (Entry == 0) { |
1037 | // Never saw this before, add it. |
1038 | AttributeLists.push_back(x: PAL); |
1039 | Entry = AttributeLists.size(); |
1040 | } |
1041 | |
1042 | // Do lookups for all attribute groups. |
1043 | for (unsigned i : PAL.indexes()) { |
1044 | AttributeSet AS = PAL.getAttributes(Index: i); |
1045 | if (!AS.hasAttributes()) |
1046 | continue; |
1047 | IndexAndAttrSet Pair = {i, AS}; |
1048 | unsigned &Entry = AttributeGroupMap[Pair]; |
1049 | if (Entry == 0) { |
1050 | AttributeGroups.push_back(x: Pair); |
1051 | Entry = AttributeGroups.size(); |
1052 | |
1053 | for (Attribute Attr : AS) { |
1054 | if (Attr.isTypeAttribute()) |
1055 | EnumerateType(Ty: Attr.getValueAsType()); |
1056 | } |
1057 | } |
1058 | } |
1059 | } |
1060 | |
1061 | void ValueEnumerator::incorporateFunction(const Function &F) { |
1062 | InstructionCount = 0; |
1063 | NumModuleValues = Values.size(); |
1064 | |
1065 | // Add global metadata to the function block. This doesn't include |
1066 | // LocalAsMetadata. |
1067 | incorporateFunctionMetadata(F); |
1068 | |
1069 | // Adding function arguments to the value table. |
1070 | for (const auto &I : F.args()) { |
1071 | EnumerateValue(V: &I); |
1072 | if (I.hasAttribute(Kind: Attribute::ByVal)) |
1073 | EnumerateType(Ty: I.getParamByValType()); |
1074 | else if (I.hasAttribute(Kind: Attribute::StructRet)) |
1075 | EnumerateType(Ty: I.getParamStructRetType()); |
1076 | else if (I.hasAttribute(Kind: Attribute::ByRef)) |
1077 | EnumerateType(Ty: I.getParamByRefType()); |
1078 | } |
1079 | FirstFuncConstantID = Values.size(); |
1080 | |
1081 | // Add all function-level constants to the value table. |
1082 | for (const BasicBlock &BB : F) { |
1083 | for (const Instruction &I : BB) { |
1084 | for (const Use &OI : I.operands()) { |
1085 | if ((isa<Constant>(Val: OI) && !isa<GlobalValue>(Val: OI)) || isa<InlineAsm>(Val: OI)) |
1086 | EnumerateValue(V: OI); |
1087 | } |
1088 | if (auto *SVI = dyn_cast<ShuffleVectorInst>(Val: &I)) |
1089 | EnumerateValue(V: SVI->getShuffleMaskForBitcode()); |
1090 | } |
1091 | BasicBlocks.push_back(x: &BB); |
1092 | ValueMap[&BB] = BasicBlocks.size(); |
1093 | } |
1094 | |
1095 | // Optimize the constant layout. |
1096 | OptimizeConstants(CstStart: FirstFuncConstantID, CstEnd: Values.size()); |
1097 | |
1098 | // Add the function's parameter attributes so they are available for use in |
1099 | // the function's instruction. |
1100 | EnumerateAttributes(PAL: F.getAttributes()); |
1101 | |
1102 | FirstInstID = Values.size(); |
1103 | |
1104 | SmallVector<LocalAsMetadata *, 8> FnLocalMDVector; |
1105 | SmallVector<DIArgList *, 8> ArgListMDVector; |
1106 | |
1107 | auto AddFnLocalMetadata = [&](Metadata *MD) { |
1108 | if (!MD) |
1109 | return; |
1110 | if (auto *Local = dyn_cast<LocalAsMetadata>(Val: MD)) { |
1111 | // Enumerate metadata after the instructions they might refer to. |
1112 | FnLocalMDVector.push_back(Elt: Local); |
1113 | } else if (auto *ArgList = dyn_cast<DIArgList>(Val: MD)) { |
1114 | ArgListMDVector.push_back(Elt: ArgList); |
1115 | for (ValueAsMetadata *VMD : ArgList->getArgs()) { |
1116 | if (auto *Local = dyn_cast<LocalAsMetadata>(Val: VMD)) { |
1117 | // Enumerate metadata after the instructions they might refer |
1118 | // to. |
1119 | FnLocalMDVector.push_back(Elt: Local); |
1120 | } |
1121 | } |
1122 | } |
1123 | }; |
1124 | |
1125 | // Add all of the instructions. |
1126 | for (const BasicBlock &BB : F) { |
1127 | for (const Instruction &I : BB) { |
1128 | for (const Use &OI : I.operands()) { |
1129 | if (auto *MD = dyn_cast<MetadataAsValue>(Val: &OI)) |
1130 | AddFnLocalMetadata(MD->getMetadata()); |
1131 | } |
1132 | /// RemoveDIs: Add non-instruction function-local metadata uses. |
1133 | for (DbgVariableRecord &DVR : filterDbgVars(R: I.getDbgRecordRange())) { |
1134 | assert(DVR.getRawLocation() && |
1135 | "DbgVariableRecord location unexpectedly null" ); |
1136 | AddFnLocalMetadata(DVR.getRawLocation()); |
1137 | if (DVR.isDbgAssign()) { |
1138 | assert(DVR.getRawAddress() && |
1139 | "DbgVariableRecord location unexpectedly null" ); |
1140 | AddFnLocalMetadata(DVR.getRawAddress()); |
1141 | } |
1142 | } |
1143 | if (!I.getType()->isVoidTy()) |
1144 | EnumerateValue(V: &I); |
1145 | } |
1146 | } |
1147 | |
1148 | // Add all of the function-local metadata. |
1149 | for (const LocalAsMetadata *Local : FnLocalMDVector) { |
1150 | // At this point, every local values have been incorporated, we shouldn't |
1151 | // have a metadata operand that references a value that hasn't been seen. |
1152 | assert(ValueMap.count(Local->getValue()) && |
1153 | "Missing value for metadata operand" ); |
1154 | EnumerateFunctionLocalMetadata(F, Local); |
1155 | } |
1156 | // DIArgList entries must come after function-local metadata, as it is not |
1157 | // possible to forward-reference them. |
1158 | for (const DIArgList *ArgList : ArgListMDVector) |
1159 | EnumerateFunctionLocalListMetadata(F, ArgList); |
1160 | } |
1161 | |
1162 | void ValueEnumerator::purgeFunction() { |
1163 | /// Remove purged values from the ValueMap. |
1164 | for (const auto &V : llvm::drop_begin(RangeOrContainer&: Values, N: NumModuleValues)) |
1165 | ValueMap.erase(Val: V.first); |
1166 | for (const Metadata *MD : llvm::drop_begin(RangeOrContainer&: MDs, N: NumModuleMDs)) |
1167 | MetadataMap.erase(Val: MD); |
1168 | for (const BasicBlock *BB : BasicBlocks) |
1169 | ValueMap.erase(Val: BB); |
1170 | |
1171 | Values.resize(new_size: NumModuleValues); |
1172 | MDs.resize(new_size: NumModuleMDs); |
1173 | BasicBlocks.clear(); |
1174 | NumMDStrings = 0; |
1175 | } |
1176 | |
1177 | static void IncorporateFunctionInfoGlobalBBIDs(const Function *F, |
1178 | DenseMap<const BasicBlock*, unsigned> &IDMap) { |
1179 | unsigned Counter = 0; |
1180 | for (const BasicBlock &BB : *F) |
1181 | IDMap[&BB] = ++Counter; |
1182 | } |
1183 | |
1184 | /// getGlobalBasicBlockID - This returns the function-specific ID for the |
1185 | /// specified basic block. This is relatively expensive information, so it |
1186 | /// should only be used by rare constructs such as address-of-label. |
1187 | unsigned ValueEnumerator::getGlobalBasicBlockID(const BasicBlock *BB) const { |
1188 | unsigned &Idx = GlobalBasicBlockIDs[BB]; |
1189 | if (Idx != 0) |
1190 | return Idx-1; |
1191 | |
1192 | IncorporateFunctionInfoGlobalBBIDs(F: BB->getParent(), IDMap&: GlobalBasicBlockIDs); |
1193 | return getGlobalBasicBlockID(BB); |
1194 | } |
1195 | |
1196 | uint64_t ValueEnumerator::computeBitsRequiredForTypeIndices() const { |
1197 | return Log2_32_Ceil(Value: getTypes().size() + 1); |
1198 | } |
1199 | |