14cc499d6e5ec602309501873449c938af61170b2Stephen Hines//===-- Bitcode/Writer/ValueEnumerator.h - Number values --------*- C++ -*-===//
24cc499d6e5ec602309501873449c938af61170b2Stephen Hines//
34cc499d6e5ec602309501873449c938af61170b2Stephen Hines//                     The LLVM Compiler Infrastructure
44cc499d6e5ec602309501873449c938af61170b2Stephen Hines//
54cc499d6e5ec602309501873449c938af61170b2Stephen Hines// This file is distributed under the University of Illinois Open Source
64cc499d6e5ec602309501873449c938af61170b2Stephen Hines// License. See LICENSE.TXT for details.
74cc499d6e5ec602309501873449c938af61170b2Stephen Hines//
84cc499d6e5ec602309501873449c938af61170b2Stephen Hines//===----------------------------------------------------------------------===//
94cc499d6e5ec602309501873449c938af61170b2Stephen Hines//
104cc499d6e5ec602309501873449c938af61170b2Stephen Hines// This class gives values and types Unique ID's.
114cc499d6e5ec602309501873449c938af61170b2Stephen Hines//
124cc499d6e5ec602309501873449c938af61170b2Stephen Hines//===----------------------------------------------------------------------===//
134cc499d6e5ec602309501873449c938af61170b2Stephen Hines
144cc499d6e5ec602309501873449c938af61170b2Stephen Hines#ifndef VALUE_ENUMERATOR_H
154cc499d6e5ec602309501873449c938af61170b2Stephen Hines#define VALUE_ENUMERATOR_H
164cc499d6e5ec602309501873449c938af61170b2Stephen Hines
174cc499d6e5ec602309501873449c938af61170b2Stephen Hines#include "llvm/ADT/DenseMap.h"
184cc499d6e5ec602309501873449c938af61170b2Stephen Hines#include "llvm/ADT/SmallVector.h"
1923c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines#include "llvm/IR/Attributes.h"
204cc499d6e5ec602309501873449c938af61170b2Stephen Hines#include <vector>
214cc499d6e5ec602309501873449c938af61170b2Stephen Hines
224cc499d6e5ec602309501873449c938af61170b2Stephen Hinesnamespace llvm {
234cc499d6e5ec602309501873449c938af61170b2Stephen Hines
244cc499d6e5ec602309501873449c938af61170b2Stephen Hinesclass Type;
254cc499d6e5ec602309501873449c938af61170b2Stephen Hinesclass Value;
264cc499d6e5ec602309501873449c938af61170b2Stephen Hinesclass Instruction;
274cc499d6e5ec602309501873449c938af61170b2Stephen Hinesclass BasicBlock;
284cc499d6e5ec602309501873449c938af61170b2Stephen Hinesclass Function;
294cc499d6e5ec602309501873449c938af61170b2Stephen Hinesclass Module;
30c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hinesclass Metadata;
31c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hinesclass LocalAsMetadata;
324cc499d6e5ec602309501873449c938af61170b2Stephen Hinesclass MDNode;
334cc499d6e5ec602309501873449c938af61170b2Stephen Hinesclass NamedMDNode;
3423c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hinesclass AttributeSet;
354cc499d6e5ec602309501873449c938af61170b2Stephen Hinesclass ValueSymbolTable;
364cc499d6e5ec602309501873449c938af61170b2Stephen Hinesclass MDSymbolTable;
3701a90ee2d2f65a01931d932d437a8f79c35c0553Stephen Hinesclass raw_ostream;
384cc499d6e5ec602309501873449c938af61170b2Stephen Hines
3901a90ee2d2f65a01931d932d437a8f79c35c0553Stephen Hines}  // end llvm namespace
40331994bf987efa0d40f33b5fdcdc01330c2aefe7Stephen Hines
41331994bf987efa0d40f33b5fdcdc01330c2aefe7Stephen Hinesnamespace llvm_2_9 {
42331994bf987efa0d40f33b5fdcdc01330c2aefe7Stephen Hines
434cc499d6e5ec602309501873449c938af61170b2Stephen Hinesclass ValueEnumerator {
444cc499d6e5ec602309501873449c938af61170b2Stephen Hinespublic:
45331994bf987efa0d40f33b5fdcdc01330c2aefe7Stephen Hines  typedef std::vector<llvm::Type*> TypeList;
464cc499d6e5ec602309501873449c938af61170b2Stephen Hines
474cc499d6e5ec602309501873449c938af61170b2Stephen Hines  // For each value, we remember its Value* and occurrence frequency.
48331994bf987efa0d40f33b5fdcdc01330c2aefe7Stephen Hines  typedef std::vector<std::pair<const llvm::Value*, unsigned> > ValueList;
494cc499d6e5ec602309501873449c938af61170b2Stephen Hinesprivate:
50331994bf987efa0d40f33b5fdcdc01330c2aefe7Stephen Hines  typedef llvm::DenseMap<llvm::Type*, unsigned> TypeMapType;
514cc499d6e5ec602309501873449c938af61170b2Stephen Hines  TypeMapType TypeMap;
524cc499d6e5ec602309501873449c938af61170b2Stephen Hines  TypeList Types;
534cc499d6e5ec602309501873449c938af61170b2Stephen Hines
54331994bf987efa0d40f33b5fdcdc01330c2aefe7Stephen Hines  typedef llvm::DenseMap<const llvm::Value*, unsigned> ValueMapType;
554cc499d6e5ec602309501873449c938af61170b2Stephen Hines  ValueMapType ValueMap;
564cc499d6e5ec602309501873449c938af61170b2Stephen Hines  ValueList Values;
57c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines
58c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines
59c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines  std::vector<const llvm::Metadata *> MDs;
60c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines  llvm::SmallVector<const llvm::LocalAsMetadata *, 8> FunctionLocalMDs;
61c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines  typedef llvm::DenseMap<const llvm::Metadata *, unsigned> MetadataMapType;
62c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines  MetadataMapType MDValueMap;
63c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines  bool HasMDString;
641906a00dce8e32fe3bb8a957e333ebbbee0888e3Pirama Arumuga Nainar  bool HasDILocation;
6523c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines
660da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines  typedef llvm::DenseMap<llvm::AttributeSet, unsigned> AttributeGroupMapType;
670da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines  AttributeGroupMapType AttributeGroupMap;
680da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines  std::vector<llvm::AttributeSet> AttributeGroups;
690da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines
700da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines  typedef llvm::DenseMap<llvm::AttributeSet, unsigned> AttributeMapType;
714cc499d6e5ec602309501873449c938af61170b2Stephen Hines  AttributeMapType AttributeMap;
7223c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines  std::vector<llvm::AttributeSet> Attribute;
7323c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines
744cc499d6e5ec602309501873449c938af61170b2Stephen Hines  /// GlobalBasicBlockIDs - This map memoizes the basic block ID's referenced by
754cc499d6e5ec602309501873449c938af61170b2Stephen Hines  /// the "getGlobalBasicBlockID" method.
76331994bf987efa0d40f33b5fdcdc01330c2aefe7Stephen Hines  mutable llvm::DenseMap<const llvm::BasicBlock*, unsigned> GlobalBasicBlockIDs;
7723c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines
78331994bf987efa0d40f33b5fdcdc01330c2aefe7Stephen Hines  typedef llvm::DenseMap<const llvm::Instruction*, unsigned> InstructionMapType;
794cc499d6e5ec602309501873449c938af61170b2Stephen Hines  InstructionMapType InstructionMap;
804cc499d6e5ec602309501873449c938af61170b2Stephen Hines  unsigned InstructionCount;
814cc499d6e5ec602309501873449c938af61170b2Stephen Hines
824cc499d6e5ec602309501873449c938af61170b2Stephen Hines  /// BasicBlocks - This contains all the basic blocks for the currently
834cc499d6e5ec602309501873449c938af61170b2Stephen Hines  /// incorporated function.  Their reverse mapping is stored in ValueMap.
84331994bf987efa0d40f33b5fdcdc01330c2aefe7Stephen Hines  std::vector<const llvm::BasicBlock*> BasicBlocks;
8523c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines
864cc499d6e5ec602309501873449c938af61170b2Stephen Hines  /// When a function is incorporated, this is the size of the Values list
874cc499d6e5ec602309501873449c938af61170b2Stephen Hines  /// before incorporation.
884cc499d6e5ec602309501873449c938af61170b2Stephen Hines  unsigned NumModuleValues;
894cc499d6e5ec602309501873449c938af61170b2Stephen Hines
904cc499d6e5ec602309501873449c938af61170b2Stephen Hines  /// When a function is incorporated, this is the size of the MDValues list
914cc499d6e5ec602309501873449c938af61170b2Stephen Hines  /// before incorporation.
92c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines  unsigned NumModuleMDs;
934cc499d6e5ec602309501873449c938af61170b2Stephen Hines
944cc499d6e5ec602309501873449c938af61170b2Stephen Hines  unsigned FirstFuncConstantID;
954cc499d6e5ec602309501873449c938af61170b2Stephen Hines  unsigned FirstInstID;
9623c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines
97c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines  ValueEnumerator(const ValueEnumerator &) = delete;
98c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines  void operator=(const ValueEnumerator &) = delete;
994cc499d6e5ec602309501873449c938af61170b2Stephen Hinespublic:
100e2ead846c1d78a6e7108e521ffd15850bd9eed3cChih-Hung Hsieh  explicit ValueEnumerator(const llvm::Module &M);
1014cc499d6e5ec602309501873449c938af61170b2Stephen Hines
10201a90ee2d2f65a01931d932d437a8f79c35c0553Stephen Hines  void dump() const;
10301a90ee2d2f65a01931d932d437a8f79c35c0553Stephen Hines  void print(llvm::raw_ostream &OS, const ValueMapType &Map, const char *Name) const;
104c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines  void print(llvm::raw_ostream &OS, const MetadataMapType &Map,
105c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines             const char *Name) const;
10601a90ee2d2f65a01931d932d437a8f79c35c0553Stephen Hines
107331994bf987efa0d40f33b5fdcdc01330c2aefe7Stephen Hines  unsigned getValueID(const llvm::Value *V) const;
108c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines  unsigned getMetadataID(const llvm::Metadata *MD) const {
109c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines    auto ID = getMetadataOrNullID(MD);
110c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines    assert(ID != 0 && "Metadata not in slotcalculator!");
111c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines    return ID - 1;
112c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines  }
113c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines  unsigned getMetadataOrNullID(const llvm::Metadata *MD) const {
114c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines    return MDValueMap.lookup(MD);
115c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines  }
116c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines
117c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines  bool hasMDString() const { return HasMDString; }
1181906a00dce8e32fe3bb8a957e333ebbbee0888e3Pirama Arumuga Nainar  bool hasDILocation() const { return HasDILocation; }
1194cc499d6e5ec602309501873449c938af61170b2Stephen Hines
120331994bf987efa0d40f33b5fdcdc01330c2aefe7Stephen Hines  unsigned getTypeID(llvm::Type *T) const {
1214cc499d6e5ec602309501873449c938af61170b2Stephen Hines    TypeMapType::const_iterator I = TypeMap.find(T);
1224cc499d6e5ec602309501873449c938af61170b2Stephen Hines    assert(I != TypeMap.end() && "Type not in ValueEnumerator!");
1234cc499d6e5ec602309501873449c938af61170b2Stephen Hines    return I->second-1;
1244cc499d6e5ec602309501873449c938af61170b2Stephen Hines  }
1254cc499d6e5ec602309501873449c938af61170b2Stephen Hines
126331994bf987efa0d40f33b5fdcdc01330c2aefe7Stephen Hines  unsigned getInstructionID(const llvm::Instruction *I) const;
127331994bf987efa0d40f33b5fdcdc01330c2aefe7Stephen Hines  void setInstructionID(const llvm::Instruction *I);
1284cc499d6e5ec602309501873449c938af61170b2Stephen Hines
1290da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines  unsigned getAttributeID(llvm::AttributeSet PAL) const {
1304cc499d6e5ec602309501873449c938af61170b2Stephen Hines    if (PAL.isEmpty()) return 0;  // Null maps to zero.
1310da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines    AttributeMapType::const_iterator I = AttributeMap.find(PAL);
1324cc499d6e5ec602309501873449c938af61170b2Stephen Hines    assert(I != AttributeMap.end() && "Attribute not in ValueEnumerator!");
1334cc499d6e5ec602309501873449c938af61170b2Stephen Hines    return I->second;
1344cc499d6e5ec602309501873449c938af61170b2Stephen Hines  }
1354cc499d6e5ec602309501873449c938af61170b2Stephen Hines
1360da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines  unsigned getAttributeGroupID(llvm::AttributeSet PAL) const {
1370da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines    if (PAL.isEmpty()) return 0;  // Null maps to zero.
1380da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines    AttributeGroupMapType::const_iterator I = AttributeGroupMap.find(PAL);
1390da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines    assert(I != AttributeGroupMap.end() && "Attribute not in ValueEnumerator!");
1400da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines    return I->second;
1410da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines  }
1420da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines
1434cc499d6e5ec602309501873449c938af61170b2Stephen Hines  /// getFunctionConstantRange - Return the range of values that corresponds to
1444cc499d6e5ec602309501873449c938af61170b2Stephen Hines  /// function-local constants.
1454cc499d6e5ec602309501873449c938af61170b2Stephen Hines  void getFunctionConstantRange(unsigned &Start, unsigned &End) const {
1464cc499d6e5ec602309501873449c938af61170b2Stephen Hines    Start = FirstFuncConstantID;
1474cc499d6e5ec602309501873449c938af61170b2Stephen Hines    End = FirstInstID;
1484cc499d6e5ec602309501873449c938af61170b2Stephen Hines  }
14923c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines
1504cc499d6e5ec602309501873449c938af61170b2Stephen Hines  const ValueList &getValues() const { return Values; }
151c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines  const std::vector<const llvm::Metadata *> &getMDs() const { return MDs; }
152c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines  const llvm::SmallVectorImpl<const llvm::LocalAsMetadata *> &getFunctionLocalMDs() const {
1534cc499d6e5ec602309501873449c938af61170b2Stephen Hines    return FunctionLocalMDs;
1544cc499d6e5ec602309501873449c938af61170b2Stephen Hines  }
1554cc499d6e5ec602309501873449c938af61170b2Stephen Hines  const TypeList &getTypes() const { return Types; }
156331994bf987efa0d40f33b5fdcdc01330c2aefe7Stephen Hines  const std::vector<const llvm::BasicBlock*> &getBasicBlocks() const {
15723c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines    return BasicBlocks;
1584cc499d6e5ec602309501873449c938af61170b2Stephen Hines  }
15923c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines  const std::vector<llvm::AttributeSet> &getAttributes() const {
16023c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines    return Attribute;
1614cc499d6e5ec602309501873449c938af61170b2Stephen Hines  }
1620da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines  const std::vector<llvm::AttributeSet> &getAttributeGroups() const {
1630da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines    return AttributeGroups;
1640da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines  }
16523c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines
1664cc499d6e5ec602309501873449c938af61170b2Stephen Hines  /// getGlobalBasicBlockID - This returns the function-specific ID for the
1674cc499d6e5ec602309501873449c938af61170b2Stephen Hines  /// specified basic block.  This is relatively expensive information, so it
1684cc499d6e5ec602309501873449c938af61170b2Stephen Hines  /// should only be used by rare constructs such as address-of-label.
169331994bf987efa0d40f33b5fdcdc01330c2aefe7Stephen Hines  unsigned getGlobalBasicBlockID(const llvm::BasicBlock *BB) const;
1704cc499d6e5ec602309501873449c938af61170b2Stephen Hines
1714cc499d6e5ec602309501873449c938af61170b2Stephen Hines  /// incorporateFunction/purgeFunction - If you'd like to deal with a function,
1724cc499d6e5ec602309501873449c938af61170b2Stephen Hines  /// use these two methods to get its data into the ValueEnumerator!
1734cc499d6e5ec602309501873449c938af61170b2Stephen Hines  ///
174331994bf987efa0d40f33b5fdcdc01330c2aefe7Stephen Hines  void incorporateFunction(const llvm::Function &F);
1754cc499d6e5ec602309501873449c938af61170b2Stephen Hines  void purgeFunction();
1764cc499d6e5ec602309501873449c938af61170b2Stephen Hines
1774cc499d6e5ec602309501873449c938af61170b2Stephen Hinesprivate:
1784cc499d6e5ec602309501873449c938af61170b2Stephen Hines  void OptimizeConstants(unsigned CstStart, unsigned CstEnd);
17923c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines
180331994bf987efa0d40f33b5fdcdc01330c2aefe7Stephen Hines  void EnumerateMDNodeOperands(const llvm::MDNode *N);
181c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines  void EnumerateMetadata(const llvm::Metadata *MD);
182c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines  void EnumerateFunctionLocalMetadata(const llvm::LocalAsMetadata *Local);
183331994bf987efa0d40f33b5fdcdc01330c2aefe7Stephen Hines  void EnumerateNamedMDNode(const llvm::NamedMDNode *NMD);
184331994bf987efa0d40f33b5fdcdc01330c2aefe7Stephen Hines  void EnumerateValue(const llvm::Value *V);
185331994bf987efa0d40f33b5fdcdc01330c2aefe7Stephen Hines  void EnumerateType(llvm::Type *T);
186331994bf987efa0d40f33b5fdcdc01330c2aefe7Stephen Hines  void EnumerateOperandType(const llvm::Value *V);
1870da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines  void EnumerateAttributes(llvm::AttributeSet PAL);
18823c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines
189331994bf987efa0d40f33b5fdcdc01330c2aefe7Stephen Hines  void EnumerateValueSymbolTable(const llvm::ValueSymbolTable &ST);
190c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines  void EnumerateNamedMetadata(const llvm::Module &M);
1914cc499d6e5ec602309501873449c938af61170b2Stephen Hines};
1924cc499d6e5ec602309501873449c938af61170b2Stephen Hines
193331994bf987efa0d40f33b5fdcdc01330c2aefe7Stephen Hines}  // end llvm_2_9 namespace
1944cc499d6e5ec602309501873449c938af61170b2Stephen Hines
1954cc499d6e5ec602309501873449c938af61170b2Stephen Hines#endif
196