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));
150 BlockScope.back().PrevAbbrevs.swap(CurAbbrevs);
152 // Emit a placeholder, which will be replaced when the block is popped.
153 Emit(0, bitc::BlockSizeWidth);
155 CurCodeSize = CodeLen;
159 assert(!BlockScope.empty() && "Block scope imbalance!");
161 // Delete all abbrevs.
162 for (unsigned i = 0, e = CurAbbrevs.size(); i != e; ++i)
163 CurAbbrevs[i]->dropRef();
165 const Block &B = BlockScope.back();
168 // [END_BLOCK, <align4bytes>]
169 EmitCode(bitc::END_BLOCK);
172 // Compute the size of the block, in words, not counting the size field.
173 unsigned SizeInWords = Out.size()/4-B.StartSizeWord - 1;
174 unsigned ByteNo = B.StartSizeWord*4;
176 // Update the block size field in the header of this sub-block.
177 Out[ByteNo++] = (unsigned char)(SizeInWords >> 0);
178 Out[ByteNo++] = (unsigned char)(SizeInWords >> 8);
179 Out[ByteNo++] = (unsigned char)(SizeInWords >> 16);
180 Out[ByteNo++] = (unsigned char)(SizeInWords >> 24);
182 // Restore the inner block's code size and abbrev table.
183 CurCodeSize = B.PrevCodeSize;
184 BlockScope.back().PrevAbbrevs.swap(CurAbbrevs);
185 BlockScope.pop_back();
188 //===--------------------------------------------------------------------===//
190 //===--------------------------------------------------------------------===//
193 /// EmitAbbreviatedField - Emit a single scalar field value with the specified
195 template<typename uintty>
196 void EmitAbbreviatedField(const BitCodeAbbrevOp &Op, uintty V) {
197 if (Op.isLiteral()) {
198 // If the abbrev specifies the literal value to use, don't emit
200 assert(V == Op.getLiteralValue() &&
201 "Invalid abbrev for record!");
205 // Encode the value as we are commanded.
206 switch (Op.getEncoding()) {
207 default: assert(0 && "Unknown encoding!");
208 case BitCodeAbbrevOp::Fixed:
209 Emit(V, Op.getEncodingData());
211 case BitCodeAbbrevOp::VBR:
212 EmitVBR(V, Op.getEncodingData());
218 /// EmitRecord - Emit the specified record to the stream, using an abbrev if
219 /// we have one to compress the output.
220 void EmitRecord(unsigned Code, SmallVectorImpl<uint64_t> &Vals,
221 unsigned Abbrev = 0) {
223 unsigned AbbrevNo = Abbrev-bitc::FIRST_APPLICATION_ABBREV;
224 assert(AbbrevNo < CurAbbrevs.size() && "Invalid abbrev #!");
225 BitCodeAbbrev *Abbv = CurAbbrevs[AbbrevNo];
229 // Insert the code into Vals to treat it uniformly.
230 Vals.insert(Vals.begin(), Code);
232 unsigned RecordIdx = 0;
233 for (unsigned i = 0, e = Abbv->getNumOperandInfos(); i != e; ++i) {
234 assert(RecordIdx < Vals.size() && "Invalid abbrev/record");
235 const BitCodeAbbrevOp &Op = Abbv->getOperandInfo(i);
236 if (Op.isLiteral() || Op.getEncoding() != BitCodeAbbrevOp::Array) {
237 EmitAbbreviatedField(Op, Vals[RecordIdx]);
241 assert(i+2 == e && "array op not second to last?");
242 const BitCodeAbbrevOp &EltEnc = Abbv->getOperandInfo(++i);
244 // Emit a vbr6 to indicate the number of elements present.
245 EmitVBR(Vals.size()-RecordIdx, 6);
248 for (; RecordIdx != Vals.size(); ++RecordIdx)
249 EmitAbbreviatedField(EltEnc, Vals[RecordIdx]);
252 assert(RecordIdx == Vals.size() && "Not all record operands emitted!");
254 // If we don't have an abbrev to use, emit this in its fully unabbreviated
256 EmitCode(bitc::UNABBREV_RECORD);
258 EmitVBR(Vals.size(), 6);
259 for (unsigned i = 0, e = Vals.size(); i != e; ++i)
260 EmitVBR64(Vals[i], 6);
264 /// EmitRecord - Emit the specified record to the stream, using an abbrev if
265 /// we have one to compress the output.
266 void EmitRecord(unsigned Code, SmallVectorImpl<unsigned> &Vals,
267 unsigned Abbrev = 0) {
269 unsigned AbbrevNo = Abbrev-bitc::FIRST_APPLICATION_ABBREV;
270 assert(AbbrevNo < CurAbbrevs.size() && "Invalid abbrev #!");
271 BitCodeAbbrev *Abbv = CurAbbrevs[AbbrevNo];
275 // Insert the code into Vals to treat it uniformly.
276 Vals.insert(Vals.begin(), Code);
278 unsigned RecordIdx = 0;
279 for (unsigned i = 0, e = Abbv->getNumOperandInfos(); i != e; ++i) {
280 assert(RecordIdx < Vals.size() && "Invalid abbrev/record");
281 const BitCodeAbbrevOp &Op = Abbv->getOperandInfo(i);
283 if (Op.isLiteral() || Op.getEncoding() != BitCodeAbbrevOp::Array) {
284 EmitAbbreviatedField(Op, Vals[RecordIdx]);
287 assert(i+2 == e && "array op not second to last?");
288 const BitCodeAbbrevOp &EltEnc = Abbv->getOperandInfo(++i);
290 // Emit a vbr6 to indicate the number of elements present.
291 EmitVBR(Vals.size()-RecordIdx, 6);
294 for (; RecordIdx != Vals.size(); ++RecordIdx)
295 EmitAbbreviatedField(EltEnc, Vals[RecordIdx]);
298 assert(RecordIdx == Vals.size() && "Not all record operands emitted!");
300 // If we don't have an abbrev to use, emit this in its fully unabbreviated
302 EmitCode(bitc::UNABBREV_RECORD);
304 EmitVBR(Vals.size(), 6);
305 for (unsigned i = 0, e = Vals.size(); i != e; ++i)
310 //===--------------------------------------------------------------------===//
312 //===--------------------------------------------------------------------===//
314 /// EmitAbbrev - This emits an abbreviation to the stream. Note that this
315 /// method takes ownership of the specified abbrev.
316 unsigned EmitAbbrev(BitCodeAbbrev *Abbv) {
317 // Emit the abbreviation as a record.
318 EmitCode(bitc::DEFINE_ABBREV);
319 EmitVBR(Abbv->getNumOperandInfos(), 5);
320 for (unsigned i = 0, e = Abbv->getNumOperandInfos(); i != e; ++i) {
321 const BitCodeAbbrevOp &Op = Abbv->getOperandInfo(i);
322 Emit(Op.isLiteral(), 1);
323 if (Op.isLiteral()) {
324 EmitVBR64(Op.getLiteralValue(), 8);
326 Emit(Op.getEncoding(), 3);
327 if (Op.hasEncodingData())
328 EmitVBR64(Op.getEncodingData(), 5);
332 CurAbbrevs.push_back(Abbv);
333 return CurAbbrevs.size()-1+bitc::FIRST_APPLICATION_ABBREV;
338 } // End llvm namespace