Index: lib/Bitcode/NaCl/Writer/NaClValueEnumerator.h |
diff --git a/lib/Bitcode/NaCl/Writer/NaClValueEnumerator.h b/lib/Bitcode/NaCl/Writer/NaClValueEnumerator.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..46080df2a574a07264426452074b2eb8856dd57a |
--- /dev/null |
+++ b/lib/Bitcode/NaCl/Writer/NaClValueEnumerator.h |
@@ -0,0 +1,169 @@ |
+//===-- Bitcode/NaCl/Writer/NaClValueEnumerator.h - ----------*- C++ -*-===// |
+// Number values. |
+// |
+// The LLVM Compiler Infrastructure |
+// |
+// This file is distributed under the University of Illinois Open Source |
+// License. See LICENSE.TXT for details. |
+// |
+//===----------------------------------------------------------------------===// |
+// |
+// This class gives values and types Unique ID's. |
+// |
+//===----------------------------------------------------------------------===// |
+ |
+#ifndef NACL_VALUE_ENUMERATOR_H |
+#define NACL_VALUE_ENUMERATOR_H |
+ |
+#include "llvm/ADT/DenseMap.h" |
+#include "llvm/ADT/SmallSet.h" |
+#include "llvm/ADT/SmallVector.h" |
+#include "llvm/Bitcode/NaCl/NaClReaderWriter.h" |
+#include <vector> |
+ |
+namespace llvm { |
+ |
+class Type; |
+class Value; |
+class Instruction; |
+class BasicBlock; |
+class Function; |
+class Module; |
+class ValueSymbolTable; |
+class raw_ostream; |
+ |
+class NaClValueEnumerator { |
+public: |
+ typedef std::vector<Type*> TypeList; |
+ |
+ // For each value, we remember its Value* and occurrence frequency. |
+ typedef std::vector<std::pair<const Value*, unsigned> > ValueList; |
+private: |
+ // Defines unique ID's for each type. |
+ typedef DenseMap<Type*, unsigned> TypeMapType; |
+ TypeMapType TypeMap; |
+ // Defines the number of references to each type. If defined, |
+ // we are in the first pass of collecting types, and reference counts |
+ // should be added to the map. If undefined, we are in the second pass |
+ // that actually assigns type IDs, based on frequency counts found in |
+ // the first pass. |
+ typedef TypeMapType TypeCountMapType; |
+ TypeCountMapType* TypeCountMap; |
+ |
+ TypeList Types; |
+ |
+ typedef DenseMap<const Value*, unsigned> ValueMapType; |
+ ValueMapType ValueMap; |
+ ValueList Values; |
+ |
+ typedef DenseMap<const Instruction*, unsigned> InstructionMapType; |
+ InstructionMapType InstructionMap; |
+ unsigned InstructionCount; |
+ |
+ /// BasicBlocks - This contains all the basic blocks for the currently |
+ /// incorporated function. Their reverse mapping is stored in ValueMap. |
+ std::vector<const BasicBlock*> BasicBlocks; |
+ |
+ /// When a function is incorporated, this is the size of the Values list |
+ /// before incorporation. |
+ unsigned NumModuleValues; |
+ |
+ unsigned FirstFuncConstantID; |
+ unsigned FirstInstID; |
+ |
+ /// Holds values that have been forward referenced within a function. |
+ /// Used to make sure we don't generate more forward reference declarations |
+ /// than necessary. |
+ SmallSet<unsigned, 32> FnForwardTypeRefs; |
+ |
+ // The index of the first global variable ID in the bitcode file. |
+ unsigned FirstGlobalVarID; |
+ // The number of global variable IDs defined in the bitcode file. |
+ unsigned NumGlobalVarIDs; |
+ |
+ /// \brief Integer type use for PNaCl conversion of pointers. |
+ Type *IntPtrType; |
+ |
+ NaClValueEnumerator(const NaClValueEnumerator &) LLVM_DELETED_FUNCTION; |
+ void operator=(const NaClValueEnumerator &) LLVM_DELETED_FUNCTION; |
+public: |
+ NaClValueEnumerator(const Module *M); |
+ |
+ void dump() const; |
+ void print(raw_ostream &OS, const ValueMapType &Map, const char *Name) const; |
+ |
+ unsigned getFirstGlobalVarID() const { |
+ return FirstGlobalVarID; |
+ } |
+ |
+ unsigned getNumGlobalVarIDs() const { |
+ return NumGlobalVarIDs; |
+ } |
+ |
+ unsigned getValueID(const Value *V) const; |
+ |
+ unsigned getTypeID(Type *T) const { |
+ TypeMapType::const_iterator I = TypeMap.find(NormalizeType(T)); |
+ assert(I != TypeMap.end() && "Type not in NaClValueEnumerator!"); |
+ return I->second-1; |
+ } |
+ |
+ unsigned getInstructionID(const Instruction *I) const; |
+ void setInstructionID(const Instruction *I); |
+ |
+ /// getFunctionConstantRange - Return the range of values that corresponds to |
+ /// function-local constants. |
+ void getFunctionConstantRange(unsigned &Start, unsigned &End) const { |
+ Start = FirstFuncConstantID; |
+ End = FirstInstID; |
+ } |
+ |
+ /// \brief Inserts the give value into the set of known function forward |
+ /// value type refs. Returns true if the value id is added to the set. |
+ bool InsertFnForwardTypeRef(unsigned ValID) { |
+ return FnForwardTypeRefs.insert(ValID).second; |
+ } |
+ |
+ const ValueList &getValues() const { return Values; } |
+ const TypeList &getTypes() const { return Types; } |
+ const std::vector<const BasicBlock*> &getBasicBlocks() const { |
+ return BasicBlocks; |
+ } |
+ |
+ /// incorporateFunction/purgeFunction - If you'd like to deal with a function, |
+ /// use these two methods to get its data into the NaClValueEnumerator! |
+ /// |
+ void incorporateFunction(const Function &F); |
+ void purgeFunction(); |
+ |
+ /// \brief Returns the value after elided (cast) operations have been |
+ /// removed. Returns V if unable to elide the cast. |
+ const Value *ElideCasts(const Value *V) const; |
+ |
+ /// \brief Returns true if value V is an elided (cast) operation. |
+ bool IsElidedCast(const Value *V) const { |
+ return V != ElideCasts(V); |
+ } |
+ |
+ /// \brief Returns true if the type of V is the integer used to |
+ /// model pointers in PNaCl. |
+ bool IsIntPtrType(Type *T) const { |
+ return T == IntPtrType; |
+ } |
+ |
+ Type *NormalizeType(Type *Ty) const; |
+ |
+private: |
+ void OptimizeTypes(const Module *M); |
+ void OptimizeConstants(unsigned CstStart, unsigned CstEnd); |
+ |
+ void EnumerateValue(const Value *V); |
+ void EnumerateType(Type *T, bool InsideOptimizeTypes=false); |
+ void EnumerateOperandType(const Value *V); |
+ |
+ void EnumerateValueSymbolTable(const ValueSymbolTable &ST); |
+}; |
+ |
+} // End llvm namespace |
+ |
+#endif |