Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(58)

Side by Side Diff: include/llvm/Bitcode/NaCl/NaClBitCodes.h

Issue 14813032: Make abbreviations explicit in pnacl-freeze/thaw. (Closed) Base URL: http://git.chromium.org/native_client/pnacl-llvm.git@master
Patch Set: Fix typos in CL Created 7 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 //===- NaClBitCodes.h - Enum values for the bitcode format ------*- C++ -*-===// 1 //===- NaClBitCodes.h - Enum values for the bitcode format ------*- C++ -*-===//
2 // 2 //
3 // The LLVM Compiler Infrastructure 3 // The LLVM Compiler Infrastructure
4 // 4 //
5 // This file is distributed under the University of Illinois Open Source 5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details. 6 // License. See LICENSE.TXT for details.
7 // 7 //
8 //===----------------------------------------------------------------------===// 8 //===----------------------------------------------------------------------===//
9 // 9 //
10 // This header Bitcode enum values. 10 // This header Bitcode enum values.
11 // 11 //
12 // The enum values defined in this file should be considered permanent. If 12 // The enum values defined in this file should be considered permanent. If
13 // new features are added, they should have values added at the end of the 13 // new features are added, they should have values added at the end of the
14 // respective lists. 14 // respective lists.
15 // 15 //
16 //===----------------------------------------------------------------------===// 16 //===----------------------------------------------------------------------===//
17 17
18 #ifndef LLVM_BITCODE_NACL_NACLBITCODES_H 18 #ifndef LLVM_BITCODE_NACL_NACLBITCODES_H
19 #define LLVM_BITCODE_NACL_NACLBITCODES_H 19 #define LLVM_BITCODE_NACL_NACLBITCODES_H
20 20
21 #include "llvm/ADT/SmallVector.h" 21 #include "llvm/ADT/SmallVector.h"
22 #include "llvm/Support/DataTypes.h" 22 #include "llvm/Support/DataTypes.h"
23 #include "llvm/Support/ErrorHandling.h" 23 #include "llvm/Support/ErrorHandling.h"
Karl 2013/05/17 20:52:18 Added '#include "llvm/Support/MathExtras.h" so tha
24 #include <cassert> 24 #include <cassert>
25 25
26 namespace llvm { 26 namespace llvm {
27 namespace naclbitc { 27 namespace naclbitc {
28 enum StandardWidths { 28 enum StandardWidths {
29 BlockIDWidth = 8, // We use VBR-8 for block IDs. 29 BlockIDWidth = 8, // We use VBR-8 for block IDs.
30 CodeLenWidth = 4, // Codelen are VBR-4. 30 CodeLenWidth = 4, // Codelen are VBR-4.
31 BlockSizeWidth = 32 // BlockSize up to 2^32 32-bit words = 16GB per block. 31 BlockSizeWidth = 32 // BlockSize up to 2^32 32-bit words = 16GB per block.
32 }; 32 };
33 33
34 // The standard abbrev namespace always has a way to exit a block, enter a 34 // The standard abbrev namespace always has a way to exit a block, enter a
35 // nested block, define abbrevs, and define an unabbreviated record. 35 // nested block, define abbrevs, and define an unabbreviated record.
36 enum FixedAbbrevIDs { 36 enum FixedAbbrevIDs {
37 END_BLOCK = 0, // Must be zero to guarantee termination for broken bitcode. 37 END_BLOCK = 0, // Must be zero to guarantee termination for broken bitcode.
38 ENTER_SUBBLOCK = 1, 38 ENTER_SUBBLOCK = 1,
39 39
40 /// DEFINE_ABBREV - Defines an abbrev for the current block. It consists 40 /// DEFINE_ABBREV - Defines an abbrev for the current block. It consists
41 /// of a vbr5 for # operand infos. Each operand info is emitted with a 41 /// of a vbr5 for # operand infos. Each operand info is emitted with a
42 /// single bit to indicate if it is a literal encoding. If so, the value is 42 /// single bit to indicate if it is a literal encoding. If so, the value is
43 /// emitted with a vbr8. If not, the encoding is emitted as 3 bits followed 43 /// emitted with a vbr8. If not, the encoding is emitted as 3 bits followed
44 /// by the info value as a vbr5 if needed. 44 /// by the info value as a vbr5 if needed.
45 DEFINE_ABBREV = 2, 45 DEFINE_ABBREV = 2,
46 46
47 // UNABBREV_RECORDs are emitted with a vbr6 for the record code, followed by 47 // UNABBREV_RECORDs are emitted with a vbr6 for the record code, followed by
48 // a vbr6 for the # operands, followed by vbr6's for each operand. 48 // a vbr6 for the # operands, followed by vbr6's for each operand.
49 UNABBREV_RECORD = 3, 49 UNABBREV_RECORD = 3,
50 50
51 // This is not a code, this is a marker for the first abbrev assignment. 51 // This is not a code, this is a marker for the first abbrev assignment.
52 FIRST_APPLICATION_ABBREV = 4 52 // In Addition, we assume up to two additional enumerated constants are
jvoung (off chromium) 2013/05/14 23:47:14 In addition, ...
Karl 2013/05/17 20:52:18 Done.
53 // added for each extension. These constants are:
54 //
55 // PREFIX_MAX_FIXED_ABBREV
56 // PREFIX_MAX_ABBREV
57 //
58 // PREFIX_MAX_ABBREV defines the maximal enumeration value used for
59 // the code selector of a block. If Both PREFIX_MAX_FIXED_ABBREV
60 // and PREFIX_MAX_ABBREV is defined, then PREFIX_MAX_FIXED_ABBREV
61 // defines the last code selector of the block that must be read using
62 // a single read (i.e. a FIXED read, or the first chunk of a VBR read.
63 FIRST_APPLICATION_ABBREV = 4,
64 // Defines default values for code length, if no additional selectors
65 // are added.
66 DEFAULT_MAX_ABBREV = FIRST_APPLICATION_ABBREV-1
53 }; 67 };
54 68
55 /// StandardBlockIDs - All bitcode files can optionally include a BLOCKINFO 69 /// StandardBlockIDs - All bitcode files can optionally include a BLOCKINFO
56 /// block, which contains metadata about other blocks in the file. 70 /// block, which contains metadata about other blocks in the file.
57 enum StandardBlockIDs { 71 enum StandardBlockIDs {
58 /// BLOCKINFO_BLOCK is used to define metadata about blocks, for example, 72 /// BLOCKINFO_BLOCK is used to define metadata about blocks, for example,
59 /// standard abbrevs that should be available to all blocks of a specified 73 /// standard abbrevs that should be available to all blocks of a specified
60 /// ID. 74 /// ID.
61 BLOCKINFO_BLOCK_ID = 0, 75 BLOCKINFO_BLOCK_ID = 0,
62 76
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after
177 return static_cast<unsigned>(OperandList.size()); 191 return static_cast<unsigned>(OperandList.size());
178 } 192 }
179 const NaClBitCodeAbbrevOp &getOperandInfo(unsigned N) const { 193 const NaClBitCodeAbbrevOp &getOperandInfo(unsigned N) const {
180 return OperandList[N]; 194 return OperandList[N];
181 } 195 }
182 196
183 void Add(const NaClBitCodeAbbrevOp &OpInfo) { 197 void Add(const NaClBitCodeAbbrevOp &OpInfo) {
184 OperandList.push_back(OpInfo); 198 OperandList.push_back(OpInfo);
185 } 199 }
186 }; 200 };
201
202 // NaClBitcodeSelectorAbbrev - This class determines whether a FIXED or VBR
203 // abbreviation should be used for the selector, and the number of bits
204 // needed to capture such selectors.
205 class NaClBitcodeSelectorAbbrev {
206 // Number of bits needed for selector.
207 unsigned NumBits;
Karl 2013/05/17 20:52:18 Made publicly visible so that it can be set by the
208 // If true, use a FIXED abbreviation. Otherwise, use a VBR abbreviation.
209 bool UseFixedAbbrev;
Karl 2013/05/17 20:52:18 Renamed to IsFixed, and made publicly visible (so
210
211 public:
212
213 // Computes the minimum number of bits needed to encode value.
214 static unsigned BitsNeededForValue(unsigned Value) {
Karl 2013/05/17 20:52:18 Moved this out (above) to be an inline. Also added
215 unsigned NumBits = 1;
Karl 2013/05/17 20:52:18 Replaced body with call to Log2_32_Ceil.
216 while (Value >= 2) {
217 ++NumBits;
218 Value >>= 1;
219 }
220 return NumBits;
221 }
222
223 // Creates a selector range when no abbreviations are defined.
224 NaClBitcodeSelectorAbbrev()
225 : NumBits(BitsNeededForValue(naclbitc::DEFAULT_MAX_ABBREV)),
226 UseFixedAbbrev(true) {}
227
228 // Creates a selector range to handle fixed abbrevations up to
229 // the specified value.
230 NaClBitcodeSelectorAbbrev(unsigned MaxAbbrev)
231 : NumBits(BitsNeededForValue(MaxAbbrev)), UseFixedAbbrev(true) {}
232
233 // Creates a selector range where the first chunk can handle all
234 // values < FirstChunkCutoff, and all range values are less than
235 // AllCutoff.
jvoung (off chromium) 2013/05/14 23:47:14 what is AllCutoff?
Karl 2013/05/17 20:52:18 Fixed reference to use "MaxAbbrev".
236 NaClBitcodeSelectorAbbrev(unsigned FirstChunkCutoff, unsigned MaxAbbrev)
237 : NumBits(BitsNeededForValue(FirstChunkCutoff)),
238 UseFixedAbbrev(FirstChunkCutoff == MaxAbbrev) {
239 // Before returning, patch up values, based on behaviour of
240 // bitstream writer. Note that VBR requires an extra bit to
241 // define if further bit chunks are needed. Hence, add this
242 // information.
243 if (!UseFixedAbbrev) {
244 if ((1U << (NumBits+1)) < MaxAbbrev) {
245 // Fixed size on corresponding VBR will hold all values, so
246 // don't bother to use VBR.
247 UseFixedAbbrev = true;
248 } else {
249 // Add bit to handle multiple chunks.
250 ++NumBits;
251 }
252 }
253 }
254
255 // Returns true if FIXED should be used (instead of VBR).
256 bool UseFixed() const {
Karl 2013/05/17 20:52:18 Removed UseFixed and UseNumBits, since the fields
257 return UseFixedAbbrev;
258 }
259
260 // Returns the number of bits to use.
261 int UseNumBits() const {
262 return NumBits;
263 }
264 };
187 } // End llvm namespace 265 } // End llvm namespace
188 266
189 #endif 267 #endif
OLDNEW
« no previous file with comments | « no previous file | include/llvm/Bitcode/NaCl/NaClBitstreamReader.h » ('j') | include/llvm/Bitcode/NaCl/NaClBitstreamReader.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698