1fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattner//===-- Bitcode/Writer/ValueEnumerator.h - Number values --------*- C++ -*-===//
2fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattner//
3fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattner//                     The LLVM Compiler Infrastructure
4fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattner//
54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source
64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// License. See LICENSE.TXT for details.
7fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattner//
8fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattner//===----------------------------------------------------------------------===//
9fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattner//
10fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattner// This class gives values and types Unique ID's.
11fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattner//
12fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattner//===----------------------------------------------------------------------===//
13fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattner
1437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#ifndef LLVM_LIB_BITCODE_WRITER_VALUEENUMERATOR_H
1537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#define LLVM_LIB_BITCODE_WRITER_VALUEENUMERATOR_H
16fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattner
17fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattner#include "llvm/ADT/DenseMap.h"
18c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines#include "llvm/ADT/UniqueVector.h"
190b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Attributes.h"
20de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/IR/Metadata.h"
21de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/IR/Type.h"
2237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#include "llvm/IR/UseListOrder.h"
23fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattner#include <vector>
24fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattner
25fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattnernamespace llvm {
26fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattner
27fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattnerclass Type;
28c59c0afd7d24480f5a23d8fd6764ecfd6d4424ccChris Lattnerclass Value;
29e8e0213cc3daa2d0457c22e4c12e6973f21fc942Devang Patelclass Instruction;
30c59c0afd7d24480f5a23d8fd6764ecfd6d4424ccChris Lattnerclass BasicBlock;
31c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hinesclass Comdat;
32fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattnerclass Function;
33c59c0afd7d24480f5a23d8fd6764ecfd6d4424ccChris Lattnerclass Module;
34ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesclass Metadata;
35ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesclass LocalAsMetadata;
366209869f83979319e2e5791382f09b83e54191e0Devang Patelclass MDNode;
37de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarclass MDOperand;
388fba578be72dc98497508dec053e966858571f6aDevang Patelclass NamedMDNode;
3999faa3b4ec6d03ac7808fe4ff3fbf3d04e375502Bill Wendlingclass AttributeSet;
40fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattnerclass ValueSymbolTable;
410386f01e061513094504bc11f8352a40173cada7Devang Patelclass MDSymbolTable;
424e6c03fc3de8885b9a0a0b8069123b86d4834f08Chad Rosierclass raw_ostream;
43fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattner
44fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattnerclass ValueEnumerator {
45fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattnerpublic:
46db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner  typedef std::vector<Type*> TypeList;
47fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattner
48fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattner  // For each value, we remember its Value* and occurrence frequency.
49fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattner  typedef std::vector<std::pair<const Value*, unsigned> > ValueList;
5037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
5137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  UseListOrderStack UseListOrders;
5237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
53fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattnerprivate:
54db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner  typedef DenseMap<Type*, unsigned> TypeMapType;
55fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattner  TypeMapType TypeMap;
562edd22b959f0d8f897cce397730a881c708e474aChris Lattner  TypeList Types;
57fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattner
58fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattner  typedef DenseMap<const Value*, unsigned> ValueMapType;
59fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattner  ValueMapType ValueMap;
602edd22b959f0d8f897cce397730a881c708e474aChris Lattner  ValueList Values;
61c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines
62c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  typedef UniqueVector<const Comdat *> ComdatSetType;
63c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  ComdatSetType Comdats;
64c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines
65ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  std::vector<const Metadata *> MDs;
66de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  std::vector<const Metadata *> FunctionMDs;
67de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
68de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  /// Index of information about a piece of metadata.
69de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  struct MDIndex {
70de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    unsigned F = 0;  ///< The ID of the function for this metadata, if any.
71de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    unsigned ID = 0; ///< The implicit ID of this metadata in bitcode.
72de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
73de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    MDIndex() = default;
74de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    explicit MDIndex(unsigned F) : F(F) {}
75de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
76de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    /// Check if this has a function tag, and it's different from NewF.
77de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    bool hasDifferentFunction(unsigned NewF) const { return F && F != NewF; }
78de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
79de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    /// Fetch the MD this references out of the given metadata array.
80de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    const Metadata *get(ArrayRef<const Metadata *> MDs) const {
81de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      assert(ID && "Expected non-zero ID");
82de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      assert(ID <= MDs.size() && "Expected valid ID");
83de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      return MDs[ID - 1];
84de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    }
85de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  };
86de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
87de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  typedef DenseMap<const Metadata *, MDIndex> MetadataMapType;
88de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  MetadataMapType MetadataMap;
89de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
90de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  /// Range of metadata IDs, as a half-open range.
91de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  struct MDRange {
92de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    unsigned First = 0;
93de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    unsigned Last = 0;
94de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
95de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    /// Number of strings in the prefix of the metadata range.
96de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    unsigned NumStrings = 0;
97de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
98de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    MDRange() = default;
99de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    explicit MDRange(unsigned First) : First(First) {}
100de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  };
101de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  SmallDenseMap<unsigned, MDRange, 1> FunctionMDInfo;
102de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
1030c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  bool ShouldPreserveUseListOrder;
104170a15e98dc6900df1ae40d03c5f0622d792fb45Joe Abbey
105e9229a6a9614cbde1bff2bd6ffae3b7336db5702Bill Wendling  typedef DenseMap<AttributeSet, unsigned> AttributeGroupMapType;
106e9229a6a9614cbde1bff2bd6ffae3b7336db5702Bill Wendling  AttributeGroupMapType AttributeGroupMap;
107e9229a6a9614cbde1bff2bd6ffae3b7336db5702Bill Wendling  std::vector<AttributeSet> AttributeGroups;
1088c2e77f895301967bf37d04e905fb1f069ec91b2Bill Wendling
109105ea3d49d4a458af8779ae7f144f00d19c4168fBill Wendling  typedef DenseMap<AttributeSet, unsigned> AttributeMapType;
1100598866c052147c31b808391f58434ce3dbfb838Devang Patel  AttributeMapType AttributeMap;
111034b94b17006f51722886b0f2283fb6fb19aca1fBill Wendling  std::vector<AttributeSet> Attribute;
112170a15e98dc6900df1ae40d03c5f0622d792fb45Joe Abbey
113837e04a8bf13712a4a8ae279daab65a048b21f7dChris Lattner  /// GlobalBasicBlockIDs - This map memoizes the basic block ID's referenced by
114837e04a8bf13712a4a8ae279daab65a048b21f7dChris Lattner  /// the "getGlobalBasicBlockID" method.
115837e04a8bf13712a4a8ae279daab65a048b21f7dChris Lattner  mutable DenseMap<const BasicBlock*, unsigned> GlobalBasicBlockIDs;
116170a15e98dc6900df1ae40d03c5f0622d792fb45Joe Abbey
117e8e0213cc3daa2d0457c22e4c12e6973f21fc942Devang Patel  typedef DenseMap<const Instruction*, unsigned> InstructionMapType;
118e8e0213cc3daa2d0457c22e4c12e6973f21fc942Devang Patel  InstructionMapType InstructionMap;
119e8e0213cc3daa2d0457c22e4c12e6973f21fc942Devang Patel  unsigned InstructionCount;
120e8e0213cc3daa2d0457c22e4c12e6973f21fc942Devang Patel
121c59c0afd7d24480f5a23d8fd6764ecfd6d4424ccChris Lattner  /// BasicBlocks - This contains all the basic blocks for the currently
122c59c0afd7d24480f5a23d8fd6764ecfd6d4424ccChris Lattner  /// incorporated function.  Their reverse mapping is stored in ValueMap.
123c59c0afd7d24480f5a23d8fd6764ecfd6d4424ccChris Lattner  std::vector<const BasicBlock*> BasicBlocks;
124170a15e98dc6900df1ae40d03c5f0622d792fb45Joe Abbey
1258d35c79f273b74df1e95b4472620e31e81342037Chris Lattner  /// When a function is incorporated, this is the size of the Values list
1268d35c79f273b74df1e95b4472620e31e81342037Chris Lattner  /// before incorporation.
127b9d0c2a6a0ef5e19b2d30180ce7d6a10ffa1f5c5Chris Lattner  unsigned NumModuleValues;
128309b3af547a60bedd74daa2a94ebd3d3ed5f06e9Dan Gohman
129de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  /// When a function is incorporated, this is the size of the Metadatas list
130309b3af547a60bedd74daa2a94ebd3d3ed5f06e9Dan Gohman  /// before incorporation.
131de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  unsigned NumModuleMDs = 0;
132de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  unsigned NumMDStrings = 0;
133309b3af547a60bedd74daa2a94ebd3d3ed5f06e9Dan Gohman
134b9d0c2a6a0ef5e19b2d30180ce7d6a10ffa1f5c5Chris Lattner  unsigned FirstFuncConstantID;
135b9d0c2a6a0ef5e19b2d30180ce7d6a10ffa1f5c5Chris Lattner  unsigned FirstInstID;
13686a1c32e67b23c5e9e42dff9eb86e99ba15bb42fCraig Topper
137ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  ValueEnumerator(const ValueEnumerator &) = delete;
138ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  void operator=(const ValueEnumerator &) = delete;
139fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattnerpublic:
1400c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  ValueEnumerator(const Module &M, bool ShouldPreserveUseListOrder);
141fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattner
1424e6c03fc3de8885b9a0a0b8069123b86d4834f08Chad Rosier  void dump() const;
1434e6c03fc3de8885b9a0a0b8069123b86d4834f08Chad Rosier  void print(raw_ostream &OS, const ValueMapType &Map, const char *Name) const;
144ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  void print(raw_ostream &OS, const MetadataMapType &Map,
145ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines             const char *Name) const;
1464e6c03fc3de8885b9a0a0b8069123b86d4834f08Chad Rosier
147d5ac40457b62f37f0abfb1d61064f7c7300e91eeDevang Patel  unsigned getValueID(const Value *V) const;
148ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  unsigned getMetadataID(const Metadata *MD) const {
149ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    auto ID = getMetadataOrNullID(MD);
150ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    assert(ID != 0 && "Metadata not in slotcalculator!");
151ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    return ID - 1;
152ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  }
153ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  unsigned getMetadataOrNullID(const Metadata *MD) const {
154de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return MetadataMap.lookup(MD).ID;
155ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  }
156f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  unsigned numMDs() const { return MDs.size(); }
157ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
1580c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  bool shouldPreserveUseListOrder() const { return ShouldPreserveUseListOrder; }
1590c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar
160db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner  unsigned getTypeID(Type *T) const {
161fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattner    TypeMapType::const_iterator I = TypeMap.find(T);
162fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattner    assert(I != TypeMap.end() && "Type not in ValueEnumerator!");
163fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattner    return I->second-1;
164fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattner  }
165e8e0213cc3daa2d0457c22e4c12e6973f21fc942Devang Patel
166e8e0213cc3daa2d0457c22e4c12e6973f21fc942Devang Patel  unsigned getInstructionID(const Instruction *I) const;
167e8e0213cc3daa2d0457c22e4c12e6973f21fc942Devang Patel  void setInstructionID(const Instruction *I);
168e8e0213cc3daa2d0457c22e4c12e6973f21fc942Devang Patel
169e9229a6a9614cbde1bff2bd6ffae3b7336db5702Bill Wendling  unsigned getAttributeID(AttributeSet PAL) const {
17058d74910c6b82e622ecbb57d6644d48fec5a5c0fChris Lattner    if (PAL.isEmpty()) return 0;  // Null maps to zero.
171105ea3d49d4a458af8779ae7f144f00d19c4168fBill Wendling    AttributeMapType::const_iterator I = AttributeMap.find(PAL);
1720598866c052147c31b808391f58434ce3dbfb838Devang Patel    assert(I != AttributeMap.end() && "Attribute not in ValueEnumerator!");
17350954f5cba406a88011cc8ade3ceb4235830f907Chris Lattner    return I->second;
17450954f5cba406a88011cc8ade3ceb4235830f907Chris Lattner  }
175fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattner
176e9229a6a9614cbde1bff2bd6ffae3b7336db5702Bill Wendling  unsigned getAttributeGroupID(AttributeSet PAL) const {
1778c2e77f895301967bf37d04e905fb1f069ec91b2Bill Wendling    if (PAL.isEmpty()) return 0;  // Null maps to zero.
178e9229a6a9614cbde1bff2bd6ffae3b7336db5702Bill Wendling    AttributeGroupMapType::const_iterator I = AttributeGroupMap.find(PAL);
179e9229a6a9614cbde1bff2bd6ffae3b7336db5702Bill Wendling    assert(I != AttributeGroupMap.end() && "Attribute not in ValueEnumerator!");
1808c2e77f895301967bf37d04e905fb1f069ec91b2Bill Wendling    return I->second;
1818c2e77f895301967bf37d04e905fb1f069ec91b2Bill Wendling  }
1828c2e77f895301967bf37d04e905fb1f069ec91b2Bill Wendling
183b9d0c2a6a0ef5e19b2d30180ce7d6a10ffa1f5c5Chris Lattner  /// getFunctionConstantRange - Return the range of values that corresponds to
184b9d0c2a6a0ef5e19b2d30180ce7d6a10ffa1f5c5Chris Lattner  /// function-local constants.
185b9d0c2a6a0ef5e19b2d30180ce7d6a10ffa1f5c5Chris Lattner  void getFunctionConstantRange(unsigned &Start, unsigned &End) const {
186b9d0c2a6a0ef5e19b2d30180ce7d6a10ffa1f5c5Chris Lattner    Start = FirstFuncConstantID;
187b9d0c2a6a0ef5e19b2d30180ce7d6a10ffa1f5c5Chris Lattner    End = FirstInstID;
188b9d0c2a6a0ef5e19b2d30180ce7d6a10ffa1f5c5Chris Lattner  }
189170a15e98dc6900df1ae40d03c5f0622d792fb45Joe Abbey
1902edd22b959f0d8f897cce397730a881c708e474aChris Lattner  const ValueList &getValues() const { return Values; }
191de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
192de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  /// Check whether the current block has any metadata to emit.
193de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  bool hasMDs() const { return NumModuleMDs < MDs.size(); }
194de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
195de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  /// Get the MDString metadata for this block.
196de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ArrayRef<const Metadata *> getMDStrings() const {
197de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return makeArrayRef(MDs).slice(NumModuleMDs, NumMDStrings);
198de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
199de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
200de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  /// Get the non-MDString metadata for this block.
201de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ArrayRef<const Metadata *> getNonMDStrings() const {
202de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return makeArrayRef(MDs).slice(NumModuleMDs).slice(NumMDStrings);
2036209869f83979319e2e5791382f09b83e54191e0Devang Patel  }
204de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
205fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattner  const TypeList &getTypes() const { return Types; }
206c59c0afd7d24480f5a23d8fd6764ecfd6d4424ccChris Lattner  const std::vector<const BasicBlock*> &getBasicBlocks() const {
207170a15e98dc6900df1ae40d03c5f0622d792fb45Joe Abbey    return BasicBlocks;
208c59c0afd7d24480f5a23d8fd6764ecfd6d4424ccChris Lattner  }
20999faa3b4ec6d03ac7808fe4ff3fbf3d04e375502Bill Wendling  const std::vector<AttributeSet> &getAttributes() const {
210034b94b17006f51722886b0f2283fb6fb19aca1fBill Wendling    return Attribute;
21150954f5cba406a88011cc8ade3ceb4235830f907Chris Lattner  }
212e9229a6a9614cbde1bff2bd6ffae3b7336db5702Bill Wendling  const std::vector<AttributeSet> &getAttributeGroups() const {
213e9229a6a9614cbde1bff2bd6ffae3b7336db5702Bill Wendling    return AttributeGroups;
2148c2e77f895301967bf37d04e905fb1f069ec91b2Bill Wendling  }
215170a15e98dc6900df1ae40d03c5f0622d792fb45Joe Abbey
216c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  const ComdatSetType &getComdats() const { return Comdats; }
217c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  unsigned getComdatID(const Comdat *C) const;
218c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines
219837e04a8bf13712a4a8ae279daab65a048b21f7dChris Lattner  /// getGlobalBasicBlockID - This returns the function-specific ID for the
220837e04a8bf13712a4a8ae279daab65a048b21f7dChris Lattner  /// specified basic block.  This is relatively expensive information, so it
221837e04a8bf13712a4a8ae279daab65a048b21f7dChris Lattner  /// should only be used by rare constructs such as address-of-label.
222837e04a8bf13712a4a8ae279daab65a048b21f7dChris Lattner  unsigned getGlobalBasicBlockID(const BasicBlock *BB) const;
223fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattner
2246a0c04dff288b7eaa0459cc7419159765bb5a0b9Chad Rosier  /// incorporateFunction/purgeFunction - If you'd like to deal with a function,
225fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattner  /// use these two methods to get its data into the ValueEnumerator!
226fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattner  ///
2276a0c04dff288b7eaa0459cc7419159765bb5a0b9Chad Rosier  void incorporateFunction(const Function &F);
2286a0c04dff288b7eaa0459cc7419159765bb5a0b9Chad Rosier  void purgeFunction();
229ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  uint64_t computeBitsRequiredForTypeIndicies() const;
230fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattner
231fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattnerprivate:
2326da91d3c2c138eb1d9739701a1314ba3580df897Chris Lattner  void OptimizeConstants(unsigned CstStart, unsigned CstEnd);
233170a15e98dc6900df1ae40d03c5f0622d792fb45Joe Abbey
234de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  /// Reorder the reachable metadata.
235de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ///
236de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  /// This is not just an optimization, but is mandatory for emitting MDString
237de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  /// correctly.
238de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  void organizeMetadata();
239de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
240de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  /// Drop the function tag from the transitive operands of the given node.
241de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  void dropFunctionFromMetadata(MetadataMapType::value_type &FirstMD);
242de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
243de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  /// Incorporate the function metadata.
244de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ///
245de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  /// This should be called before enumerating LocalAsMetadata for the
246de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  /// function.
247de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  void incorporateFunctionMetadata(const Function &F);
248de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
249de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  /// Enumerate a single instance of metadata with the given function tag.
250de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ///
251de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  /// If \c MD has already been enumerated, check that \c F matches its
252de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  /// function tag.  If not, call \a dropFunctionFromMetadata().
253de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ///
254de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  /// Otherwise, mark \c MD as visited.  Assign it an ID, or just return it if
255de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  /// it's an \a MDNode.
256de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  const MDNode *enumerateMetadataImpl(unsigned F, const Metadata *MD);
257de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
258de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  unsigned getMetadataFunctionID(const Function *F) const;
259de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
260de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  /// Enumerate reachable metadata in (almost) post-order.
261de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ///
262de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  /// Enumerate all the metadata reachable from MD.  We want to minimize the
263de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  /// cost of reading bitcode records, and so the primary consideration is that
264de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  /// operands of uniqued nodes are resolved before the nodes are read.  This
265de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  /// avoids re-uniquing them on the context and factors away RAUW support.
266de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ///
267de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  /// This algorithm guarantees that subgraphs of uniqued nodes are in
268de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  /// post-order.  Distinct subgraphs reachable only from a single uniqued node
269de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  /// will be in post-order.
270de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ///
271de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  /// \note The relative order of a distinct and uniqued node is irrelevant.
272de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  /// \a organizeMetadata() will later partition distinct nodes ahead of
273de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  /// uniqued ones.
274de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ///{
275de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  void EnumerateMetadata(const Function *F, const Metadata *MD);
276de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  void EnumerateMetadata(unsigned F, const Metadata *MD);
277de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ///}
278de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
279de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  void EnumerateFunctionLocalMetadata(const Function &F,
280de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                      const LocalAsMetadata *Local);
281de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  void EnumerateFunctionLocalMetadata(unsigned F, const LocalAsMetadata *Local);
2828fba578be72dc98497508dec053e966858571f6aDevang Patel  void EnumerateNamedMDNode(const NamedMDNode *NMD);
283d7e6457c3faf6c5530a4c8224e2dfcf91b57093bVictor Hernandez  void EnumerateValue(const Value *V);
284db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner  void EnumerateType(Type *T);
285d7e6457c3faf6c5530a4c8224e2dfcf91b57093bVictor Hernandez  void EnumerateOperandType(const Value *V);
286105ea3d49d4a458af8779ae7f144f00d19c4168fBill Wendling  void EnumerateAttributes(AttributeSet PAL);
287170a15e98dc6900df1ae40d03c5f0622d792fb45Joe Abbey
288fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattner  void EnumerateValueSymbolTable(const ValueSymbolTable &ST);
28937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  void EnumerateNamedMetadata(const Module &M);
290fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattner};
291fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattner
292fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattner} // End llvm namespace
293fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattner
294fd57cecd2cb3ac726942e0101de6a82dc5a958a6Chris Lattner#endif
295