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