1 //===- BitstreamWriter.h - Low-level bitstream writer interface -*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file was developed by Chris Lattner and is distributed under
6 // the University of Illinois Open Source License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This header defines the BitstreamWriter class. This class can be used to
11 // write an arbitrary bitstream, regardless of its contents.
13 //===----------------------------------------------------------------------===//
15 #ifndef BITSTREAM_WRITER_H
16 #define BITSTREAM_WRITER_H
18 #include "llvm/Bitcode/BitCodes.h"
23 class BitstreamWriter {
24 std::vector<unsigned char> &Out;
26 /// CurBit - Always between 0 and 31 inclusive, specifies the next bit to use.
29 /// CurValue - The current value. Only bits < CurBit are valid.
32 // CurCodeSize - This is the declared size of code values used for the current
36 /// CurAbbrevs - Abbrevs installed at in this block.
37 std::vector<BitCodeAbbrev*> CurAbbrevs;
40 unsigned PrevCodeSize;
41 unsigned StartSizeWord;
42 std::vector<BitCodeAbbrev*> PrevAbbrevs;
43 Block(unsigned PCS, unsigned SSW) : PrevCodeSize(PCS), StartSizeWord(SSW) {}
46 /// BlockScope - This tracks the current blocks that we have entered.
47 std::vector<Block> BlockScope;
50 BitstreamWriter(std::vector<unsigned char> &O)
51 : Out(O), CurBit(0), CurValue(0), CurCodeSize(2) {}
54 assert(CurBit == 0 && "Unflused data remaining");
55 assert(BlockScope.empty() && CurAbbrevs.empty() && "Block imbalance");
57 //===--------------------------------------------------------------------===//
58 // Basic Primitives for emitting bits to the stream.
59 //===--------------------------------------------------------------------===//
61 void Emit(uint32_t Val, unsigned NumBits) {
62 assert(NumBits <= 32 && "Invalid value size!");
63 assert((Val & ~(~0U >> (32-NumBits))) == 0 && "High bits set!");
64 CurValue |= Val << CurBit;
65 if (CurBit + NumBits < 32) {
70 // Add the current word.
71 unsigned V = CurValue;
72 Out.push_back((unsigned char)(V >> 0));
73 Out.push_back((unsigned char)(V >> 8));
74 Out.push_back((unsigned char)(V >> 16));
75 Out.push_back((unsigned char)(V >> 24));
78 CurValue = Val >> (32-CurBit);
81 CurBit = (CurBit+NumBits) & 31;
84 void Emit64(uint64_t Val, unsigned NumBits) {
86 Emit((uint32_t)Val, NumBits);
88 Emit((uint32_t)Val, 32);
89 Emit((uint32_t)(Val >> 32), NumBits-32);
95 unsigned V = CurValue;
96 Out.push_back((unsigned char)(V >> 0));
97 Out.push_back((unsigned char)(V >> 8));
98 Out.push_back((unsigned char)(V >> 16));
99 Out.push_back((unsigned char)(V >> 24));
105 void EmitVBR(uint32_t Val, unsigned NumBits) {
106 uint32_t Threshold = 1U << (NumBits-1);
108 // Emit the bits with VBR encoding, NumBits-1 bits at a time.
109 while (Val >= Threshold) {
110 Emit((Val & ((1 << (NumBits-1))-1)) | (1 << (NumBits-1)), NumBits);
117 void EmitVBR64(uint64_t Val, unsigned NumBits) {
118 if ((uint32_t)Val == Val)
119 return EmitVBR((uint32_t)Val, NumBits);
121 uint64_t Threshold = 1U << (NumBits-1);
123 // Emit the bits with VBR encoding, NumBits-1 bits at a time.
124 while (Val >= Threshold) {
125 Emit(((uint32_t)Val & ((1 << (NumBits-1))-1)) |
126 (1 << (NumBits-1)), NumBits);
130 Emit((uint32_t)Val, NumBits);
133 /// EmitCode - Emit the specified code.
134 void EmitCode(unsigned Val) {
135 Emit(Val, CurCodeSize);
138 //===--------------------------------------------------------------------===//
139 // Block Manipulation
140 //===--------------------------------------------------------------------===//
142 void EnterSubblock(unsigned BlockID, unsigned CodeLen) {
144 // [ENTER_SUBBLOCK, blockid, newcodelen, <align4bytes>, blocklen]
145 EmitCode(bitc::ENTER_SUBBLOCK);
146 EmitVBR(BlockID, bitc::BlockIDWidth);
147 EmitVBR(CodeLen, bitc::CodeLenWidth);
149 BlockScope.push_back(Block(CurCodeSize, Out.size()/4));
151 // Delete all abbrevs.
152 for (unsigned i = 0, e = CurAbbrevs.size(); i != e; ++i)
153 delete CurAbbrevs[i];
155 BlockScope.back().PrevAbbrevs.swap(CurAbbrevs);
156 // Emit a placeholder, which will be replaced when the block is popped.
157 Emit(0, bitc::BlockSizeWidth);
159 CurCodeSize = CodeLen;
163 assert(!BlockScope.empty() && "Block scope imbalance!");
164 const Block &B = BlockScope.back();
167 // [END_BLOCK, <align4bytes>]
168 EmitCode(bitc::END_BLOCK);
171 // Compute the size of the block, in words, not counting the size field.
172 unsigned SizeInWords = Out.size()/4-B.StartSizeWord - 1;
173 unsigned ByteNo = B.StartSizeWord*4;
175 // Update the block size field in the header of this sub-block.
176 Out[ByteNo++] = (unsigned char)(SizeInWords >> 0);
177 Out[ByteNo++] = (unsigned char)(SizeInWords >> 8);
178 Out[ByteNo++] = (unsigned char)(SizeInWords >> 16);
179 Out[ByteNo++] = (unsigned char)(SizeInWords >> 24);
181 // Restore the inner block's code size and abbrev table.
182 CurCodeSize = B.PrevCodeSize;
183 BlockScope.back().PrevAbbrevs.swap(CurAbbrevs);
184 BlockScope.pop_back();
187 //===--------------------------------------------------------------------===//
189 //===--------------------------------------------------------------------===//
191 /// EmitRecord - Emit the specified record to the stream, using an abbrev if
192 /// we have one to compress the output.
193 void EmitRecord(unsigned Code, SmallVectorImpl<uint64_t> &Vals,
194 unsigned Abbrev = 0) {
196 unsigned AbbrevNo = Abbrev-bitc::FIRST_ABBREV;
197 assert(AbbrevNo < CurAbbrevs.size() && "Invalid abbrev #!");
198 BitCodeAbbrev *Abbv = CurAbbrevs[AbbrevNo];
202 // Insert the code into Vals to treat it uniformly.
203 Vals.insert(Vals.begin(), Code);
205 unsigned RecordIdx = 0;
206 for (unsigned i = 0, e = Abbv->getNumOperandInfos(); i != e; ++i) {
207 assert(RecordIdx < Vals.size() && "Invalid abbrev/record");
208 const BitCodeAbbrevOp &Op = Abbv->getOperandInfo(i);
209 uint64_t RecordVal = Vals[RecordIdx];
211 if (Op.isLiteral()) {
212 // If the abbrev specifies the literal value to use, don't emit
214 assert(RecordVal == Op.getLiteralValue() &&
215 "Invalid abbrev for record!");
218 // Encode the value as we are commanded.
219 switch (Op.getEncoding()) {
220 default: assert(0 && "Unknown encoding!");
221 case BitCodeAbbrevOp::FixedWidth:
222 Emit64(RecordVal, Op.getEncodingData());
225 case BitCodeAbbrevOp::VBR:
226 EmitVBR64(RecordVal, Op.getEncodingData());
232 assert(RecordIdx == Vals.size() && "Not all record operands emitted!");
234 // If we don't have an abbrev to use, emit this in its fully unabbreviated
236 EmitCode(bitc::UNABBREV_RECORD);
238 EmitVBR(Vals.size(), 6);
239 for (unsigned i = 0, e = Vals.size(); i != e; ++i)
240 EmitVBR64(Vals[i], 6);
244 /// EmitRecord - Emit the specified record to the stream, using an abbrev if
245 /// we have one to compress the output.
246 void EmitRecord(unsigned Code, SmallVectorImpl<unsigned> &Vals,
247 unsigned Abbrev = 0) {
249 unsigned AbbrevNo = Abbrev-bitc::FIRST_ABBREV;
250 assert(AbbrevNo < CurAbbrevs.size() && "Invalid abbrev #!");
251 BitCodeAbbrev *Abbv = CurAbbrevs[AbbrevNo];
255 // Insert the code into Vals to treat it uniformly.
256 Vals.insert(Vals.begin(), Code);
258 unsigned RecordIdx = 0;
259 for (unsigned i = 0, e = Abbv->getNumOperandInfos(); i != e; ++i) {
260 assert(RecordIdx < Vals.size() && "Invalid abbrev/record");
261 const BitCodeAbbrevOp &Op = Abbv->getOperandInfo(i);
262 unsigned RecordVal = Vals[RecordIdx];
264 if (Op.isLiteral()) {
265 // If the abbrev specifies the literal value to use, don't emit
267 assert(RecordVal == Op.getLiteralValue() &&
268 "Invalid abbrev for record!");
271 // Encode the value as we are commanded.
272 switch (Op.getEncoding()) {
273 default: assert(0 && "Unknown encoding!");
274 case BitCodeAbbrevOp::FixedWidth:
275 Emit(RecordVal, Op.getEncodingData());
278 case BitCodeAbbrevOp::VBR:
279 EmitVBR(RecordVal, Op.getEncodingData());
285 assert(RecordIdx == Vals.size() && "Not all record operands emitted!");
287 // If we don't have an abbrev to use, emit this in its fully unabbreviated
289 EmitCode(bitc::UNABBREV_RECORD);
291 EmitVBR(Vals.size(), 6);
292 for (unsigned i = 0, e = Vals.size(); i != e; ++i)
297 //===--------------------------------------------------------------------===//
299 //===--------------------------------------------------------------------===//
301 /// EmitAbbrev - This emits an abbreviation to the stream. Note that this
302 /// method takes ownership of the specified abbrev.
303 unsigned EmitAbbrev(BitCodeAbbrev *Abbv) {
304 // Emit the abbreviation as a record.
305 EmitCode(bitc::DEFINE_ABBREV);
306 EmitVBR(Abbv->getNumOperandInfos(), 5);
307 for (unsigned i = 0, e = Abbv->getNumOperandInfos(); i != e; ++i) {
308 const BitCodeAbbrevOp &Op = Abbv->getOperandInfo(i);
309 Emit(Op.isLiteral(), 1);
310 if (Op.isLiteral()) {
311 EmitVBR64(Op.getLiteralValue(), 8);
313 Emit(Op.getEncoding(), 3);
314 if (Op.hasEncodingData())
315 EmitVBR64(Op.getEncodingData(), 5);
319 CurAbbrevs.push_back(Abbv);
320 return CurAbbrevs.size()-1+bitc::FIRST_ABBREV;
325 } // End llvm namespace