1d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines//===-- Bitcode/Writer/ValueEnumerator.h - Number values --------*- C++ -*-===//
2d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines//
3d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines//                     The LLVM Compiler Infrastructure
4d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines//
5d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines// This file is distributed under the University of Illinois Open Source
6d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines// License. See LICENSE.TXT for details.
7d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines//
8d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines//===----------------------------------------------------------------------===//
9d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines//
10d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines// This class gives values and types Unique ID's.
11d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines//
12d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines//===----------------------------------------------------------------------===//
13d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines
14d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines#ifndef VALUE_ENUMERATOR_H
15d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines#define VALUE_ENUMERATOR_H
16d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines
17d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines#include "llvm/ADT/DenseMap.h"
18d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines#include "llvm/ADT/SmallVector.h"
1923c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines#include "llvm/IR/Attributes.h"
20c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines#include "llvm/IR/UseListOrder.h"
21d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines#include <vector>
22d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines
23d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hinesnamespace llvm {
24d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines
25d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hinesclass Type;
26d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hinesclass Value;
27d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hinesclass Instruction;
28d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hinesclass BasicBlock;
29d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hinesclass Function;
30d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hinesclass Module;
31c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hinesclass Metadata;
32c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hinesclass LocalAsMetadata;
33d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hinesclass MDNode;
34d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hinesclass NamedMDNode;
3523c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hinesclass AttributeSet;
36d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hinesclass ValueSymbolTable;
37d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hinesclass MDSymbolTable;
38d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hinesclass raw_ostream;
39d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines
40d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines}  // end llvm namespace
41d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines
42d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hinesnamespace llvm_3_2 {
43d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines
44d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hinesclass ValueEnumerator {
45d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hinespublic:
46d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines  typedef std::vector<llvm::Type*> TypeList;
47d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines
48d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines  // For each value, we remember its Value* and occurrence frequency.
49d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines  typedef std::vector<std::pair<const llvm::Value*, unsigned> > ValueList;
50c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines
51c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines  llvm::UseListOrderStack UseListOrders;
52d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hinesprivate:
53d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines  typedef llvm::DenseMap<llvm::Type*, unsigned> TypeMapType;
54d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines  TypeMapType TypeMap;
55d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines  TypeList Types;
56d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines
57d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines  typedef llvm::DenseMap<const llvm::Value*, unsigned> ValueMapType;
58d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines  ValueMapType ValueMap;
59d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines  ValueList Values;
60c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines
61c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines
62c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines  std::vector<const llvm::Metadata *> MDs;
63c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines  llvm::SmallVector<const llvm::LocalAsMetadata *, 8> FunctionLocalMDs;
64c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines  typedef llvm::DenseMap<const llvm::Metadata *, unsigned> MetadataMapType;
65c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines  MetadataMapType MDValueMap;
66c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines  bool HasMDString;
671906a00dce8e32fe3bb8a957e333ebbbee0888e3Pirama Arumuga Nainar  bool HasDILocation;
6823c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines
690da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines  typedef llvm::DenseMap<llvm::AttributeSet, unsigned> AttributeGroupMapType;
700da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines  AttributeGroupMapType AttributeGroupMap;
710da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines  std::vector<llvm::AttributeSet> AttributeGroups;
720da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines
730da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines  typedef llvm::DenseMap<llvm::AttributeSet, unsigned> AttributeMapType;
74d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines  AttributeMapType AttributeMap;
7523c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines  std::vector<llvm::AttributeSet> Attribute;
7623c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines
77d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines  /// GlobalBasicBlockIDs - This map memoizes the basic block ID's referenced by
78d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines  /// the "getGlobalBasicBlockID" method.
79d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines  mutable llvm::DenseMap<const llvm::BasicBlock*, unsigned> GlobalBasicBlockIDs;
8023c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines
81d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines  typedef llvm::DenseMap<const llvm::Instruction*, unsigned> InstructionMapType;
82d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines  InstructionMapType InstructionMap;
83d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines  unsigned InstructionCount;
84d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines
85d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines  /// BasicBlocks - This contains all the basic blocks for the currently
86d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines  /// incorporated function.  Their reverse mapping is stored in ValueMap.
87d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines  std::vector<const llvm::BasicBlock*> BasicBlocks;
8823c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines
89d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines  /// When a function is incorporated, this is the size of the Values list
90d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines  /// before incorporation.
91d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines  unsigned NumModuleValues;
92d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines
93d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines  /// When a function is incorporated, this is the size of the MDValues list
94d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines  /// before incorporation.
95c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines  unsigned NumModuleMDs;
96d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines
97d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines  unsigned FirstFuncConstantID;
98d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines  unsigned FirstInstID;
9923c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines
100c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines  ValueEnumerator(const ValueEnumerator &) = delete;
101c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines  void operator=(const ValueEnumerator &) = delete;
102d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hinespublic:
103c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines  ValueEnumerator(const llvm::Module &M);
104d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines
105d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines  void dump() const;
106d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines  void print(llvm::raw_ostream &OS, const ValueMapType &Map, const char *Name) const;
107c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines  void print(llvm::raw_ostream &OS, const MetadataMapType &Map,
108c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines             const char *Name) const;
109d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines
110d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines  unsigned getValueID(const llvm::Value *V) const;
111c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines  unsigned getMetadataID(const llvm::Metadata *MD) const {
112c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines    auto ID = getMetadataOrNullID(MD);
113c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines    assert(ID != 0 && "Metadata not in slotcalculator!");
114c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines    return ID - 1;
115c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines  }
116c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines  unsigned getMetadataOrNullID(const llvm::Metadata *MD) const {
117c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines    return MDValueMap.lookup(MD);
118c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines  }
119c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines
120c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines  bool hasMDString() const { return HasMDString; }
1211906a00dce8e32fe3bb8a957e333ebbbee0888e3Pirama Arumuga Nainar  bool hasDILocation() const { return HasDILocation; }
122d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines
123d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines  unsigned getTypeID(llvm::Type *T) const {
124d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines    TypeMapType::const_iterator I = TypeMap.find(T);
125d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines    assert(I != TypeMap.end() && "Type not in ValueEnumerator!");
126d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines    return I->second-1;
127d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines  }
128d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines
129d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines  unsigned getInstructionID(const llvm::Instruction *I) const;
130d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines  void setInstructionID(const llvm::Instruction *I);
131d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines
1320da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines  unsigned getAttributeID(llvm::AttributeSet PAL) const {
133d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines    if (PAL.isEmpty()) return 0;  // Null maps to zero.
1340da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines    AttributeMapType::const_iterator I = AttributeMap.find(PAL);
135d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines    assert(I != AttributeMap.end() && "Attribute not in ValueEnumerator!");
136d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines    return I->second;
137d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines  }
138d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines
1390da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines  unsigned getAttributeGroupID(llvm::AttributeSet PAL) const {
1400da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines    if (PAL.isEmpty()) return 0;  // Null maps to zero.
1410da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines    AttributeGroupMapType::const_iterator I = AttributeGroupMap.find(PAL);
1420da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines    assert(I != AttributeGroupMap.end() && "Attribute not in ValueEnumerator!");
1430da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines    return I->second;
1440da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines  }
1450da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines
146d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines  /// getFunctionConstantRange - Return the range of values that corresponds to
147d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines  /// function-local constants.
148d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines  void getFunctionConstantRange(unsigned &Start, unsigned &End) const {
149d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines    Start = FirstFuncConstantID;
150d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines    End = FirstInstID;
151d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines  }
15223c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines
153d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines  const ValueList &getValues() const { return Values; }
154c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines  const std::vector<const llvm::Metadata *> &getMDs() const { return MDs; }
155c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines  const llvm::SmallVectorImpl<const llvm::LocalAsMetadata *> &getFunctionLocalMDs() const {
156d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines    return FunctionLocalMDs;
157d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines  }
158d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines  const TypeList &getTypes() const { return Types; }
159d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines  const std::vector<const llvm::BasicBlock*> &getBasicBlocks() const {
16023c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines    return BasicBlocks;
161d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines  }
16223c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines  const std::vector<llvm::AttributeSet> &getAttributes() const {
16323c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines    return Attribute;
164d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines  }
1650da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines  const std::vector<llvm::AttributeSet> &getAttributeGroups() const {
1660da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines    return AttributeGroups;
1670da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines  }
16823c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines
169d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines  /// getGlobalBasicBlockID - This returns the function-specific ID for the
170d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines  /// specified basic block.  This is relatively expensive information, so it
171d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines  /// should only be used by rare constructs such as address-of-label.
172d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines  unsigned getGlobalBasicBlockID(const llvm::BasicBlock *BB) const;
173d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines
174d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines  /// incorporateFunction/purgeFunction - If you'd like to deal with a function,
175d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines  /// use these two methods to get its data into the ValueEnumerator!
176d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines  ///
177d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines  void incorporateFunction(const llvm::Function &F);
178d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines  void purgeFunction();
179d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines
180d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hinesprivate:
181d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines  void OptimizeConstants(unsigned CstStart, unsigned CstEnd);
18223c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines
183d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines  void EnumerateMDNodeOperands(const llvm::MDNode *N);
184c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines  void EnumerateMetadata(const llvm::Metadata *MD);
185c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines  void EnumerateFunctionLocalMetadata(const llvm::LocalAsMetadata *Local);
186d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines  void EnumerateNamedMDNode(const llvm::NamedMDNode *NMD);
187d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines  void EnumerateValue(const llvm::Value *V);
188d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines  void EnumerateType(llvm::Type *T);
189d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines  void EnumerateOperandType(const llvm::Value *V);
1900da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines  void EnumerateAttributes(llvm::AttributeSet PAL);
19123c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines
192d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines  void EnumerateValueSymbolTable(const llvm::ValueSymbolTable &ST);
193c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines  void EnumerateNamedMetadata(const llvm::Module &M);
194d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines};
195d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines
196d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines}  // End llvm_3_2 namespace
197d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines
198d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines#endif
199