Index: include/llvm/Bitcode/NaCl/NaClBitCodes.h |
diff --git a/include/llvm/Bitcode/NaCl/NaClBitCodes.h b/include/llvm/Bitcode/NaCl/NaClBitCodes.h |
index 4c0f754f7bab3ef33369679f15bdbe5b0bc829d9..bb52d0e20ee921ccd8f6316a5493b10d96bb81b4 100644 |
--- a/include/llvm/Bitcode/NaCl/NaClBitCodes.h |
+++ b/include/llvm/Bitcode/NaCl/NaClBitCodes.h |
@@ -21,6 +21,7 @@ |
#include "llvm/ADT/SmallVector.h" |
#include "llvm/Support/DataTypes.h" |
#include "llvm/Support/ErrorHandling.h" |
+#include "llvm/Support/MathExtras.h" |
#include <cassert> |
namespace llvm { |
@@ -49,7 +50,21 @@ namespace naclbitc { |
UNABBREV_RECORD = 3, |
// This is not a code, this is a marker for the first abbrev assignment. |
- FIRST_APPLICATION_ABBREV = 4 |
+ // In addition, we assume up to two additional enumerated constants are |
+ // added for each extension. These constants are: |
+ // |
+ // PREFIX_MAX_FIXED_ABBREV |
+ // PREFIX_MAX_ABBREV |
+ // |
+ // PREFIX_MAX_ABBREV defines the maximal enumeration value used for |
+ // the code selector of a block. If Both PREFIX_MAX_FIXED_ABBREV |
+ // and PREFIX_MAX_ABBREV is defined, then PREFIX_MAX_FIXED_ABBREV |
+ // defines the last code selector of the block that must be read using |
+ // a single read (i.e. a FIXED read, or the first chunk of a VBR read. |
+ FIRST_APPLICATION_ABBREV = 4, |
+ // Defines default values for code length, if no additional selectors |
+ // are added. |
+ DEFAULT_MAX_ABBREV = FIRST_APPLICATION_ABBREV-1 |
}; |
/// StandardBlockIDs - All bitcode files can optionally include a BLOCKINFO |
@@ -184,6 +199,59 @@ public: |
OperandList.push_back(OpInfo); |
} |
}; |
+ |
+/// \brief Returns number of bits needed to encode |
+/// value for dense FIXED encoding. |
+inline unsigned NaClBitsNeededForValue(unsigned Value) { |
+ // Note: Need to handle case where Value=0xFFFFFFFF as special case, |
+ // since we can't add 1 to it. |
+ if (Value >= 0x80000000) return 32; |
+ return Log2_32_Ceil(Value+1); |
+} |
+ |
+/// \brief Encode a signed value by moving the sign to the LSB for dense |
+/// VBR encoding. |
+inline uint64_t NaClEncodeSignRotatedValue(int64_t V) { |
+ return (V >= 0) ? (V << 1) : ((-V << 1) | 1); |
+} |
+ |
+/// \brief Decode a signed value stored with the sign bit in |
+/// the LSB for dense VBR encoding. |
+inline uint64_t NaClDecodeSignRotatedValue(uint64_t V) { |
+ if ((V & 1) == 0) |
+ return V >> 1; |
+ if (V != 1) |
+ return -(V >> 1); |
+ // There is no such thing as -0 with integers. "-0" really means MININT. |
+ return 1ULL << 63; |
+} |
+ |
+/// \brief This class determines whether a FIXED or VBR |
+/// abbreviation should be used for the selector, and the number of bits |
+/// needed to capture such selectors. |
+class NaClBitcodeSelectorAbbrev { |
+ |
+public: |
+ // If true, use a FIXED abbreviation. Otherwise, use a VBR abbreviation. |
+ bool IsFixed; |
+ // Number of bits needed for selector. |
+ unsigned NumBits; |
+ |
+ // Creates a selector range for the given values. |
+ NaClBitcodeSelectorAbbrev(bool IF, unsigned NB) |
+ : IsFixed(IF), NumBits(NB) {} |
+ |
+ // Creates a selector range when no abbreviations are defined. |
+ NaClBitcodeSelectorAbbrev() |
+ : IsFixed(true), |
+ NumBits(NaClBitsNeededForValue(naclbitc::DEFAULT_MAX_ABBREV)) {} |
+ |
+ // Creates a selector range to handle fixed abbrevations up to |
+ // the specified value. |
+ explicit NaClBitcodeSelectorAbbrev(unsigned MaxAbbrev) |
+ : IsFixed(true), |
+ NumBits(NaClBitsNeededForValue(MaxAbbrev)) {} |
+}; |
} // End llvm namespace |
#endif |