Index: include/llvm/Bitcode/NaCl/NaClBitcodeValueDist.h |
diff --git a/include/llvm/Bitcode/NaCl/NaClBitcodeValueDist.h b/include/llvm/Bitcode/NaCl/NaClBitcodeValueDist.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..2ec08841ef79a8d47a592798fd39fc0eaa250872 |
--- /dev/null |
+++ b/include/llvm/Bitcode/NaCl/NaClBitcodeValueDist.h |
@@ -0,0 +1,183 @@ |
+//===-- NaClBitcodeValueDist.h ---------------------------------------------===// |
+// Defines distribution maps to separate out values at each index |
+// in a bitcode record. |
+// |
+// The LLVM Compiler Infrastructure |
+// |
+// This file is distributed under the University of Illinois Open Source |
+// License. See LICENSE.TXT for details. |
+// |
+//===----------------------------------------------------------------------===// |
+ |
+#ifndef LLVM_BITCODE_NACL_NACLBITCODEVALUEDIST_H |
+#define LLVM_BITCODE_NACL_NACLBITCODEVALUEDIST_H |
+ |
+#include "llvm/Bitcode/NaCl/NaClBitcodeDist.h" |
+ |
+namespace llvm { |
+ |
+/// Defines the value index cutoff where we no longer track values associated |
+/// with specific value indices of bitcode records. |
+static const unsigned NaClValueIndexCutoff = 6; |
+ |
+/// Defines an (inclusive) range of values in a bitcode record, |
+/// defined by the given pair of values. Note that values are stored |
+/// as ranges. For small values, each value is in a separate range, so |
+/// that potential constants for abbreviations can be found. For |
+/// larger values, values are coalesced together into multiple element |
+/// ranges, since we don't look for constants and are only interested |
+/// in the overall distribution of values. |
+typedef std::pair<NaClBitcodeDistValue, |
+ NaClBitcodeDistValue> NaClValueRangeType; |
+ |
+/// Models a range index. Ranges are encoded as a consecutive sequence |
+/// of indices, starting at zero. The actual ranges chosen to |
+/// represent bitcode records are internal, and is defined by function |
+/// GetValueRange index below. |
+typedef NaClBitcodeDistValue NaClValueRangeIndexType; |
+ |
+/// Converts a bitcode record value to the corresponding range index that |
+/// contains the value. |
+NaClValueRangeIndexType GetNaClValueRangeIndex(NaClBitcodeDistValue Value); |
+ |
+/// Converts a range index into the corresponding range of values. |
+NaClValueRangeType GetNaClValueRange(NaClValueRangeIndexType RangeIndex); |
+ |
+/// Defines the distribution of range indices. |
+class NaClBitcodeValueDistElement : public NaClBitcodeDistElement { |
+ NaClBitcodeValueDistElement(const NaClBitcodeValueDistElement&) |
+ LLVM_DELETED_FUNCTION; |
+ void operator=(const NaClBitcodeValueDistElement&) LLVM_DELETED_FUNCTION; |
+ |
+public: |
+ static bool classof(const NaClBitcodeDistElement *Element) { |
+ return Element->getKind() >= RDE_ValueDist && |
+ Element->getKind() < RDE_ValueDistLast; |
+ } |
+ |
+ NaClBitcodeValueDistElement() |
+ : NaClBitcodeDistElement(RDE_ValueDist) |
+ {} |
+ |
+ static NaClBitcodeValueDistElement Sentinel; |
+ |
+ virtual ~NaClBitcodeValueDistElement(); |
+ |
+ virtual NaClBitcodeDistElement *CreateElement( |
+ NaClBitcodeDistValue Value) const; |
+ |
+ /// Returns the number of instances, normalized over the |
+ /// range of values, using a uniform distribution. |
+ virtual double GetImportance(NaClBitcodeDistValue Value) const; |
+ |
+ virtual const char *GetTitle() const; |
+ |
+ virtual const char *GetValueHeader() const; |
+ |
+ virtual void PrintRowValue(raw_ostream &Stream, |
+ NaClBitcodeDistValue Value, |
+ const NaClBitcodeDist *Distribution) const; |
+}; |
+ |
+/// Defines the distribution of values for a set of value indices for |
+/// bitcode records. |
+class NaClBitcodeValueDist : public NaClBitcodeDist { |
+ NaClBitcodeValueDist(const NaClBitcodeValueDist&) LLVM_DELETED_FUNCTION; |
+ void operator=(const NaClBitcodeValueDist&) LLVM_DELETED_FUNCTION; |
+ |
+public: |
+ static bool classof(const NaClBitcodeDist *Dist) { |
+ return Dist->getKind() >= RD_ValueDist && |
+ Dist->getKind() < RD_ValueDistLast; |
+ } |
+ |
+ /// Builds a value distribution for the given set of value indices. |
+ /// If AllRemainingIndices is false, only value Index is considered. |
+ /// Otherwise, builds a value distribution for all values stored in |
+ /// record value indices >= Index. |
+ explicit NaClBitcodeValueDist(unsigned Index, |
+ bool AllRemainingIndices=false); |
+ |
+ virtual ~NaClBitcodeValueDist(); |
+ |
+ unsigned GetIndex() const { |
+ return Index; |
+ } |
+ |
+ bool HoldsAllRemainingIndices() const { |
+ return AllRemainingIndices; |
+ } |
+ |
+ virtual void GetValueList(const NaClBitcodeRecord &Record, |
+ ValueListType &ValueList) const; |
+ |
+private: |
+ // The range index being tracked. |
+ unsigned Index; |
+ |
+ // If true, then tracks all indices >= Index. Otherwise only Index. |
+ bool AllRemainingIndices; |
+}; |
+ |
+/// Defines the value distribution for each value index in corresponding |
+/// bitcode records. This is a helper class used to separate each element |
+/// in the bitcode record, so that we can determine the proper abbreviation |
+/// for each element. |
+class NaClBitcodeValueIndexDistElement : public NaClBitcodeDistElement { |
+ NaClBitcodeValueIndexDistElement( |
+ const NaClBitcodeValueIndexDistElement&) LLVM_DELETED_FUNCTION; |
+ void operator=( |
+ const NaClBitcodeValueIndexDistElement&) LLVM_DELETED_FUNCTION; |
+ |
+public: |
+ static bool classof(const NaClBitcodeDistElement *Element) { |
+ return Element->getKind() <= RDE_ValueIndexDist && |
+ Element->getKind() < RDE_ValueIndexDistLast; |
+ } |
+ |
+ explicit NaClBitcodeValueIndexDistElement(unsigned Index=0) |
+ : NaClBitcodeDistElement(RDE_ValueIndexDist), |
+ ValueDist(Index) { |
+ NestedDists.push_back(&ValueDist); |
+ } |
+ |
+ static NaClBitcodeValueIndexDistElement Sentinel; |
+ |
+ virtual ~NaClBitcodeValueIndexDistElement(); |
+ |
+ virtual NaClBitcodeDistElement *CreateElement( |
+ NaClBitcodeDistValue Value) const; |
+ |
+ virtual void GetValueList(const NaClBitcodeRecord &Record, |
+ ValueListType &ValueList) const; |
+ |
+ virtual double GetImportance(NaClBitcodeDistValue Value) const; |
+ |
+ virtual void AddRecord(const NaClBitcodeRecord &Record); |
+ |
+ virtual const char *GetTitle() const; |
+ |
+ virtual const char *GetValueHeader() const; |
+ |
+ virtual void PrintRowValue(raw_ostream &Stream, |
+ NaClBitcodeDistValue Value, |
+ const NaClBitcodeDist *Distribution) const; |
+ |
+ virtual const SmallVectorImpl<NaClBitcodeDist*> * |
+ GetNestedDistributions() const; |
+ |
+ NaClBitcodeValueDist &GetValueDist() { |
+ return ValueDist; |
+ } |
+ |
+private: |
+ // Nested blocks used by GetNestedDistributions. |
+ SmallVector<NaClBitcodeDist*, 1> NestedDists; |
+ |
+ // The value distribution associated with the given index. |
+ NaClBitcodeValueDist ValueDist; |
+}; |
+ |
+} |
+ |
+#endif |