blob: 011356c32601e3d8e1e7a8453a1ccbc0bcffcf31 [file] [log] [blame]
Eugene Zelenko975293f2017-09-07 23:28:24 +00001//===- Bitcode/Writer/ValueEnumerator.h - Number values ---------*- C++ -*-===//
Chris Lattnerc1d10d62007-04-22 06:24:45 +00002//
3// The LLVM Compiler Infrastructure
4//
Chris Lattnerf3ebc3f2007-12-29 20:36:04 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Chris Lattnerc1d10d62007-04-22 06:24:45 +00007//
8//===----------------------------------------------------------------------===//
9//
10// This class gives values and types Unique ID's.
11//
12//===----------------------------------------------------------------------===//
13
Benjamin Kramera7c40ef2014-08-13 16:26:38 +000014#ifndef LLVM_LIB_BITCODE_WRITER_VALUEENUMERATOR_H
15#define LLVM_LIB_BITCODE_WRITER_VALUEENUMERATOR_H
Chris Lattnerc1d10d62007-04-22 06:24:45 +000016
Eugene Zelenko975293f2017-09-07 23:28:24 +000017#include "llvm/ADT/ArrayRef.h"
Chris Lattnerc1d10d62007-04-22 06:24:45 +000018#include "llvm/ADT/DenseMap.h"
David Majnemerdad0a642014-06-27 18:19:56 +000019#include "llvm/ADT/UniqueVector.h"
Chandler Carruth9fb823b2013-01-02 11:36:10 +000020#include "llvm/IR/Attributes.h"
David Blaikie526f30b2017-11-03 20:24:19 +000021#include "llvm/IR/Metadata.h"
22#include "llvm/IR/Type.h"
Duncan P. N. Exon Smith1f66c852014-07-28 21:19:41 +000023#include "llvm/IR/UseListOrder.h"
Eugene Zelenko975293f2017-09-07 23:28:24 +000024#include <cassert>
25#include <cstdint>
26#include <utility>
Chris Lattnerc1d10d62007-04-22 06:24:45 +000027#include <vector>
28
29namespace llvm {
30
Chris Lattner7c37b012007-04-26 04:42:16 +000031class BasicBlock;
David Majnemerdad0a642014-06-27 18:19:56 +000032class Comdat;
Chris Lattnerc1d10d62007-04-22 06:24:45 +000033class Function;
Eugene Zelenko975293f2017-09-07 23:28:24 +000034class Instruction;
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +000035class LocalAsMetadata;
Devang Pateldf84e8b2010-06-02 23:05:04 +000036class MDNode;
Eugene Zelenko975293f2017-09-07 23:28:24 +000037class Metadata;
38class Module;
Devang Patel99ff5a82010-01-09 00:30:14 +000039class NamedMDNode;
Chad Rosier78037a92011-12-07 20:44:46 +000040class raw_ostream;
Eugene Zelenko975293f2017-09-07 23:28:24 +000041class Type;
42class Value;
43class ValueSymbolTable;
Chris Lattnerc1d10d62007-04-22 06:24:45 +000044
Benjamin Kramer079b96e2013-09-11 18:05:11 +000045class ValueEnumerator {
Chris Lattnerc1d10d62007-04-22 06:24:45 +000046public:
Eugene Zelenko975293f2017-09-07 23:28:24 +000047 using TypeList = std::vector<Type *>;
Chris Lattnerc1d10d62007-04-22 06:24:45 +000048
49 // For each value, we remember its Value* and occurrence frequency.
Eugene Zelenko975293f2017-09-07 23:28:24 +000050 using ValueList = std::vector<std::pair<const Value *, unsigned>>;
Duncan P. N. Exon Smith1f66c852014-07-28 21:19:41 +000051
Reid Klecknerb4a2d182017-04-24 20:38:30 +000052 /// Attribute groups as encoded in bitcode are almost AttributeSets, but they
53 /// include the AttributeList index, so we have to track that in our map.
Eugene Zelenko975293f2017-09-07 23:28:24 +000054 using IndexAndAttrSet = std::pair<unsigned, AttributeSet>;
Reid Klecknerb4a2d182017-04-24 20:38:30 +000055
Duncan P. N. Exon Smith1f66c852014-07-28 21:19:41 +000056 UseListOrderStack UseListOrders;
57
Chris Lattnerc1d10d62007-04-22 06:24:45 +000058private:
Eugene Zelenko975293f2017-09-07 23:28:24 +000059 using TypeMapType = DenseMap<Type *, unsigned>;
Chris Lattnerc1d10d62007-04-22 06:24:45 +000060 TypeMapType TypeMap;
Chris Lattner52523562007-04-24 00:16:04 +000061 TypeList Types;
Chris Lattnerc1d10d62007-04-22 06:24:45 +000062
Eugene Zelenko975293f2017-09-07 23:28:24 +000063 using ValueMapType = DenseMap<const Value *, unsigned>;
Chris Lattnerc1d10d62007-04-22 06:24:45 +000064 ValueMapType ValueMap;
Chris Lattner52523562007-04-24 00:16:04 +000065 ValueList Values;
David Majnemerdad0a642014-06-27 18:19:56 +000066
Eugene Zelenko975293f2017-09-07 23:28:24 +000067 using ComdatSetType = UniqueVector<const Comdat *>;
David Majnemerdad0a642014-06-27 18:19:56 +000068 ComdatSetType Comdats;
69
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +000070 std::vector<const Metadata *> MDs;
Duncan P. N. Exon Smith520f8542016-04-02 15:22:57 +000071 std::vector<const Metadata *> FunctionMDs;
72
73 /// Index of information about a piece of metadata.
74 struct MDIndex {
75 unsigned F = 0; ///< The ID of the function for this metadata, if any.
76 unsigned ID = 0; ///< The implicit ID of this metadata in bitcode.
77
78 MDIndex() = default;
79 explicit MDIndex(unsigned F) : F(F) {}
80
81 /// Check if this has a function tag, and it's different from NewF.
82 bool hasDifferentFunction(unsigned NewF) const { return F && F != NewF; }
83
84 /// Fetch the MD this references out of the given metadata array.
85 const Metadata *get(ArrayRef<const Metadata *> MDs) const {
86 assert(ID && "Expected non-zero ID");
87 assert(ID <= MDs.size() && "Expected valid ID");
88 return MDs[ID - 1];
89 }
90 };
Duncan P. N. Exon Smith9695eb32016-04-19 03:46:51 +000091
Eugene Zelenko975293f2017-09-07 23:28:24 +000092 using MetadataMapType = DenseMap<const Metadata *, MDIndex>;
Teresa Johnson61b406e2015-12-29 23:00:22 +000093 MetadataMapType MetadataMap;
Duncan P. N. Exon Smith520f8542016-04-02 15:22:57 +000094
95 /// Range of metadata IDs, as a half-open range.
96 struct MDRange {
97 unsigned First = 0;
98 unsigned Last = 0;
99
100 /// Number of strings in the prefix of the metadata range.
101 unsigned NumStrings = 0;
102
Eugene Zelenko975293f2017-09-07 23:28:24 +0000103 MDRange() = default;
Duncan P. N. Exon Smith520f8542016-04-02 15:22:57 +0000104 explicit MDRange(unsigned First) : First(First) {}
105 };
106 SmallDenseMap<unsigned, MDRange, 1> FunctionMDInfo;
107
Duncan P. N. Exon Smith458593a2015-04-14 23:45:11 +0000108 bool ShouldPreserveUseListOrder;
Joe Abbey2ad8df22012-11-25 15:23:39 +0000109
Eugene Zelenko975293f2017-09-07 23:28:24 +0000110 using AttributeGroupMapType = DenseMap<IndexAndAttrSet, unsigned>;
Bill Wendling92ed7002013-02-11 22:33:26 +0000111 AttributeGroupMapType AttributeGroupMap;
Reid Klecknerb4a2d182017-04-24 20:38:30 +0000112 std::vector<IndexAndAttrSet> AttributeGroups;
Bill Wendling51f612e2013-02-10 23:06:02 +0000113
Eugene Zelenko975293f2017-09-07 23:28:24 +0000114 using AttributeListMapType = DenseMap<AttributeList, unsigned>;
Reid Klecknerb4a2d182017-04-24 20:38:30 +0000115 AttributeListMapType AttributeListMap;
116 std::vector<AttributeList> AttributeLists;
Joe Abbey2ad8df22012-11-25 15:23:39 +0000117
Chris Lattnerf540d742009-10-28 05:24:40 +0000118 /// GlobalBasicBlockIDs - This map memoizes the basic block ID's referenced by
119 /// the "getGlobalBasicBlockID" method.
120 mutable DenseMap<const BasicBlock*, unsigned> GlobalBasicBlockIDs;
Joe Abbey2ad8df22012-11-25 15:23:39 +0000121
Eugene Zelenko975293f2017-09-07 23:28:24 +0000122 using InstructionMapType = DenseMap<const Instruction *, unsigned>;
Devang Patelaf206b82009-09-18 19:26:43 +0000123 InstructionMapType InstructionMap;
124 unsigned InstructionCount;
125
Chris Lattner7c37b012007-04-26 04:42:16 +0000126 /// BasicBlocks - This contains all the basic blocks for the currently
127 /// incorporated function. Their reverse mapping is stored in ValueMap.
128 std::vector<const BasicBlock*> BasicBlocks;
Joe Abbey2ad8df22012-11-25 15:23:39 +0000129
Chris Lattner5f640b92007-04-26 03:50:57 +0000130 /// When a function is incorporated, this is the size of the Values list
131 /// before incorporation.
Chris Lattnere6e364c2007-04-26 05:53:54 +0000132 unsigned NumModuleValues;
Dan Gohmanc828c542010-08-24 02:24:03 +0000133
Teresa Johnson61b406e2015-12-29 23:00:22 +0000134 /// When a function is incorporated, this is the size of the Metadatas list
Dan Gohmanc828c542010-08-24 02:24:03 +0000135 /// before incorporation.
Duncan P. N. Exon Smith93429112016-04-02 15:09:42 +0000136 unsigned NumModuleMDs = 0;
137 unsigned NumMDStrings = 0;
Dan Gohmanc828c542010-08-24 02:24:03 +0000138
Chris Lattnere6e364c2007-04-26 05:53:54 +0000139 unsigned FirstFuncConstantID;
140 unsigned FirstInstID;
Craig Toppera60c0f12012-09-15 17:09:36 +0000141
Chris Lattnerc1d10d62007-04-22 06:24:45 +0000142public:
Duncan P. N. Exon Smith458593a2015-04-14 23:45:11 +0000143 ValueEnumerator(const Module &M, bool ShouldPreserveUseListOrder);
Eugene Zelenko975293f2017-09-07 23:28:24 +0000144 ValueEnumerator(const ValueEnumerator &) = delete;
145 ValueEnumerator &operator=(const ValueEnumerator &) = delete;
Chris Lattnerc1d10d62007-04-22 06:24:45 +0000146
Chad Rosier78037a92011-12-07 20:44:46 +0000147 void dump() const;
148 void print(raw_ostream &OS, const ValueMapType &Map, const char *Name) const;
Duncan P. N. Exon Smith5bf8fef2014-12-09 18:38:53 +0000149 void print(raw_ostream &OS, const MetadataMapType &Map,
150 const char *Name) const;
Chad Rosier78037a92011-12-07 20:44:46 +0000151
Devang Patel05eb6172009-08-04 06:00:18 +0000152 unsigned getValueID(const Value *V) const;
Eugene Zelenko975293f2017-09-07 23:28:24 +0000153
Duncan P. N. Exon Smith9a6f64e2015-01-20 01:00:23 +0000154 unsigned getMetadataID(const Metadata *MD) const {
155 auto ID = getMetadataOrNullID(MD);
156 assert(ID != 0 && "Metadata not in slotcalculator!");
157 return ID - 1;
158 }
Eugene Zelenko975293f2017-09-07 23:28:24 +0000159
Duncan P. N. Exon Smith9a6f64e2015-01-20 01:00:23 +0000160 unsigned getMetadataOrNullID(const Metadata *MD) const {
Duncan P. N. Exon Smith520f8542016-04-02 15:22:57 +0000161 return MetadataMap.lookup(MD).ID;
Duncan P. N. Exon Smith9a6f64e2015-01-20 01:00:23 +0000162 }
Eugene Zelenko975293f2017-09-07 23:28:24 +0000163
Teresa Johnsond4d3dfd2015-11-20 14:51:27 +0000164 unsigned numMDs() const { return MDs.size(); }
Devang Patel05eb6172009-08-04 06:00:18 +0000165
Duncan P. N. Exon Smith458593a2015-04-14 23:45:11 +0000166 bool shouldPreserveUseListOrder() const { return ShouldPreserveUseListOrder; }
167
Chris Lattner229907c2011-07-18 04:54:35 +0000168 unsigned getTypeID(Type *T) const {
Chris Lattnerc1d10d62007-04-22 06:24:45 +0000169 TypeMapType::const_iterator I = TypeMap.find(T);
170 assert(I != TypeMap.end() && "Type not in ValueEnumerator!");
171 return I->second-1;
172 }
Devang Patelaf206b82009-09-18 19:26:43 +0000173
174 unsigned getInstructionID(const Instruction *I) const;
175 void setInstructionID(const Instruction *I);
176
Reid Klecknerb4a2d182017-04-24 20:38:30 +0000177 unsigned getAttributeListID(AttributeList PAL) const {
Chris Lattner8a923e72008-03-12 17:45:29 +0000178 if (PAL.isEmpty()) return 0; // Null maps to zero.
Reid Klecknerb4a2d182017-04-24 20:38:30 +0000179 AttributeListMapType::const_iterator I = AttributeListMap.find(PAL);
180 assert(I != AttributeListMap.end() && "Attribute not in ValueEnumerator!");
Chris Lattnere4bbad62007-05-03 22:46:43 +0000181 return I->second;
182 }
Chris Lattnerc1d10d62007-04-22 06:24:45 +0000183
Reid Klecknerb4a2d182017-04-24 20:38:30 +0000184 unsigned getAttributeGroupID(IndexAndAttrSet Group) const {
185 if (!Group.second.hasAttributes())
186 return 0; // Null maps to zero.
187 AttributeGroupMapType::const_iterator I = AttributeGroupMap.find(Group);
Bill Wendling92ed7002013-02-11 22:33:26 +0000188 assert(I != AttributeGroupMap.end() && "Attribute not in ValueEnumerator!");
Bill Wendling51f612e2013-02-10 23:06:02 +0000189 return I->second;
190 }
191
Chris Lattnere6e364c2007-04-26 05:53:54 +0000192 /// getFunctionConstantRange - Return the range of values that corresponds to
193 /// function-local constants.
194 void getFunctionConstantRange(unsigned &Start, unsigned &End) const {
195 Start = FirstFuncConstantID;
196 End = FirstInstID;
197 }
Joe Abbey2ad8df22012-11-25 15:23:39 +0000198
Chris Lattner52523562007-04-24 00:16:04 +0000199 const ValueList &getValues() const { return Values; }
Duncan P. N. Exon Smith93429112016-04-02 15:09:42 +0000200
201 /// Check whether the current block has any metadata to emit.
202 bool hasMDs() const { return NumModuleMDs < MDs.size(); }
203
Duncan P. N. Exon Smith0b76b722016-04-02 15:16:56 +0000204 /// Get the MDString metadata for this block.
Duncan P. N. Exon Smith6565a0d2016-03-27 23:17:54 +0000205 ArrayRef<const Metadata *> getMDStrings() const {
Duncan P. N. Exon Smith93429112016-04-02 15:09:42 +0000206 return makeArrayRef(MDs).slice(NumModuleMDs, NumMDStrings);
Duncan P. N. Exon Smith6565a0d2016-03-27 23:17:54 +0000207 }
Duncan P. N. Exon Smith93429112016-04-02 15:09:42 +0000208
Duncan P. N. Exon Smith0b76b722016-04-02 15:16:56 +0000209 /// Get the non-MDString metadata for this block.
Duncan P. N. Exon Smith6565a0d2016-03-27 23:17:54 +0000210 ArrayRef<const Metadata *> getNonMDStrings() const {
Duncan P. N. Exon Smith93429112016-04-02 15:09:42 +0000211 return makeArrayRef(MDs).slice(NumModuleMDs).slice(NumMDStrings);
Devang Pateldf84e8b2010-06-02 23:05:04 +0000212 }
Duncan P. N. Exon Smith6565a0d2016-03-27 23:17:54 +0000213
Chris Lattnerc1d10d62007-04-22 06:24:45 +0000214 const TypeList &getTypes() const { return Types; }
Eugene Zelenko975293f2017-09-07 23:28:24 +0000215
Chris Lattner7c37b012007-04-26 04:42:16 +0000216 const std::vector<const BasicBlock*> &getBasicBlocks() const {
Joe Abbey2ad8df22012-11-25 15:23:39 +0000217 return BasicBlocks;
Chris Lattner7c37b012007-04-26 04:42:16 +0000218 }
Eugene Zelenko975293f2017-09-07 23:28:24 +0000219
Reid Klecknerb4a2d182017-04-24 20:38:30 +0000220 const std::vector<AttributeList> &getAttributeLists() const { return AttributeLists; }
Eugene Zelenko975293f2017-09-07 23:28:24 +0000221
Reid Klecknerb4a2d182017-04-24 20:38:30 +0000222 const std::vector<IndexAndAttrSet> &getAttributeGroups() const {
Bill Wendling92ed7002013-02-11 22:33:26 +0000223 return AttributeGroups;
Bill Wendling51f612e2013-02-10 23:06:02 +0000224 }
Joe Abbey2ad8df22012-11-25 15:23:39 +0000225
David Majnemerdad0a642014-06-27 18:19:56 +0000226 const ComdatSetType &getComdats() const { return Comdats; }
227 unsigned getComdatID(const Comdat *C) const;
228
Chris Lattnerf540d742009-10-28 05:24:40 +0000229 /// getGlobalBasicBlockID - This returns the function-specific ID for the
230 /// specified basic block. This is relatively expensive information, so it
231 /// should only be used by rare constructs such as address-of-label.
232 unsigned getGlobalBasicBlockID(const BasicBlock *BB) const;
Chris Lattnerc1d10d62007-04-22 06:24:45 +0000233
Chad Rosier6a11b642011-06-03 17:02:19 +0000234 /// incorporateFunction/purgeFunction - If you'd like to deal with a function,
Chris Lattnerc1d10d62007-04-22 06:24:45 +0000235 /// use these two methods to get its data into the ValueEnumerator!
Chad Rosier6a11b642011-06-03 17:02:19 +0000236 void incorporateFunction(const Function &F);
Eugene Zelenko975293f2017-09-07 23:28:24 +0000237
Chad Rosier6a11b642011-06-03 17:02:19 +0000238 void purgeFunction();
David Blaikie7b028102015-02-25 00:51:52 +0000239 uint64_t computeBitsRequiredForTypeIndicies() const;
Chris Lattnerc1d10d62007-04-22 06:24:45 +0000240
241private:
Chris Lattner430e80d2007-05-04 05:21:47 +0000242 void OptimizeConstants(unsigned CstStart, unsigned CstEnd);
Joe Abbey2ad8df22012-11-25 15:23:39 +0000243
Duncan P. N. Exon Smith520f8542016-04-02 15:22:57 +0000244 /// Reorder the reachable metadata.
245 ///
246 /// This is not just an optimization, but is mandatory for emitting MDString
247 /// correctly.
Duncan P. N. Exon Smith6565a0d2016-03-27 23:17:54 +0000248 void organizeMetadata();
249
Duncan P. N. Exon Smith520f8542016-04-02 15:22:57 +0000250 /// Drop the function tag from the transitive operands of the given node.
Duncan P. N. Exon Smith9695eb32016-04-19 03:46:51 +0000251 void dropFunctionFromMetadata(MetadataMapType::value_type &FirstMD);
Duncan P. N. Exon Smith520f8542016-04-02 15:22:57 +0000252
253 /// Incorporate the function metadata.
254 ///
255 /// This should be called before enumerating LocalAsMetadata for the
256 /// function.
257 void incorporateFunctionMetadata(const Function &F);
258
Duncan P. N. Exon Smith71480bd2016-04-22 02:33:06 +0000259 /// Enumerate a single instance of metadata with the given function tag.
260 ///
261 /// If \c MD has already been enumerated, check that \c F matches its
262 /// function tag. If not, call \a dropFunctionFromMetadata().
263 ///
264 /// Otherwise, mark \c MD as visited. Assign it an ID, or just return it if
265 /// it's an \a MDNode.
266 const MDNode *enumerateMetadataImpl(unsigned F, const Metadata *MD);
Duncan P. N. Exon Smith520f8542016-04-02 15:22:57 +0000267
Peter Collingbourne21521892016-06-21 23:42:48 +0000268 unsigned getMetadataFunctionID(const Function *F) const;
Duncan P. N. Exon Smith30805b22016-04-23 04:59:22 +0000269
270 /// Enumerate reachable metadata in (almost) post-order.
271 ///
272 /// Enumerate all the metadata reachable from MD. We want to minimize the
273 /// cost of reading bitcode records, and so the primary consideration is that
274 /// operands of uniqued nodes are resolved before the nodes are read. This
275 /// avoids re-uniquing them on the context and factors away RAUW support.
276 ///
277 /// This algorithm guarantees that subgraphs of uniqued nodes are in
278 /// post-order. Distinct subgraphs reachable only from a single uniqued node
279 /// will be in post-order.
280 ///
281 /// \note The relative order of a distinct and uniqued node is irrelevant.
282 /// \a organizeMetadata() will later partition distinct nodes ahead of
283 /// uniqued ones.
284 ///{
Peter Collingbourne21521892016-06-21 23:42:48 +0000285 void EnumerateMetadata(const Function *F, const Metadata *MD);
Duncan P. N. Exon Smith520f8542016-04-02 15:22:57 +0000286 void EnumerateMetadata(unsigned F, const Metadata *MD);
Duncan P. N. Exon Smith30805b22016-04-23 04:59:22 +0000287 ///}
288
Duncan P. N. Exon Smith520f8542016-04-02 15:22:57 +0000289 void EnumerateFunctionLocalMetadata(const Function &F,
290 const LocalAsMetadata *Local);
291 void EnumerateFunctionLocalMetadata(unsigned F, const LocalAsMetadata *Local);
Devang Patel99ff5a82010-01-09 00:30:14 +0000292 void EnumerateNamedMDNode(const NamedMDNode *NMD);
Victor Hernandez572218b2010-01-14 19:54:11 +0000293 void EnumerateValue(const Value *V);
Chris Lattner229907c2011-07-18 04:54:35 +0000294 void EnumerateType(Type *T);
Victor Hernandez572218b2010-01-14 19:54:11 +0000295 void EnumerateOperandType(const Value *V);
Reid Klecknerb5180542017-03-21 16:57:19 +0000296 void EnumerateAttributes(AttributeList PAL);
Joe Abbey2ad8df22012-11-25 15:23:39 +0000297
Chris Lattnerc1d10d62007-04-22 06:24:45 +0000298 void EnumerateValueSymbolTable(const ValueSymbolTable &ST);
Rafael Espindola49e9bf82014-11-17 20:06:27 +0000299 void EnumerateNamedMetadata(const Module &M);
Chris Lattnerc1d10d62007-04-22 06:24:45 +0000300};
301
Eugene Zelenko975293f2017-09-07 23:28:24 +0000302} // end namespace llvm
Chris Lattnerc1d10d62007-04-22 06:24:45 +0000303
Eugene Zelenko975293f2017-09-07 23:28:24 +0000304#endif // LLVM_LIB_BITCODE_WRITER_VALUEENUMERATOR_H