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

Side by Side Diff: lib/Bitcode/NaCl/Writer/NaClBitcodeWriter.cpp

Issue 14495008: Create type IDs based on reference counts. (Closed) Base URL: http://git.chromium.org/native_client/pnacl-llvm.git@master
Patch Set: 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 //===--- Bitcode/NaCl/Writer/NaClBitcodeWriter.cpp - Bitcode Writer -------===// 1 //===--- Bitcode/NaCl/Writer/NaClBitcodeWriter.cpp - Bitcode Writer -------===//
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 // Bitcode writer implementation. 10 // Bitcode writer implementation.
(...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after
224 } 224 }
225 225
226 /// WriteTypeTable - Write out the type table for a module. 226 /// WriteTypeTable - Write out the type table for a module.
227 static void WriteTypeTable(const NaClValueEnumerator &VE, 227 static void WriteTypeTable(const NaClValueEnumerator &VE,
228 NaClBitstreamWriter &Stream) { 228 NaClBitstreamWriter &Stream) {
229 const NaClValueEnumerator::TypeList &TypeList = VE.getTypes(); 229 const NaClValueEnumerator::TypeList &TypeList = VE.getTypes();
230 230
231 Stream.EnterSubblock(bitc::TYPE_BLOCK_ID_NEW, 4 /*count from # abbrevs */); 231 Stream.EnterSubblock(bitc::TYPE_BLOCK_ID_NEW, 4 /*count from # abbrevs */);
232 SmallVector<uint64_t, 64> TypeVals; 232 SmallVector<uint64_t, 64> TypeVals;
233 233
234 // Note: modify to use maximum number of bits if under cutoff. Otherwise,
235 // use VBR to take advantage that frequently referenced types have
236 // small IDs.
237 //
238 // Note: Cutoff chosen based on experiments of some bit code files with
239 // a large number of types.
jvoung (off chromium) 2013/05/02 16:35:40 What is a large number of types, and on which benc
Karl 2013/05/15 20:12:20 I thought this is still worth adding, in that whil
jvoung (off chromium) 2013/05/15 21:01:36 Yeah, it would be more useful for upstream users.
234 uint64_t NumBits = Log2_32_Ceil(VE.getTypes().size()+1); 240 uint64_t NumBits = Log2_32_Ceil(VE.getTypes().size()+1);
241 static const uint64_t TypeVBRCutoff = 6;
242 uint64_t TypeIdNumBits = (NumBits <= TypeVBRCutoff ? NumBits : TypeVBRCutoff);
243 BitCodeAbbrevOp::Encoding TypeIdEncoding =
244 (NumBits <= TypeVBRCutoff
245 ? BitCodeAbbrevOp::Fixed : BitCodeAbbrevOp::VBR);
235 246
236 // Abbrev for TYPE_CODE_POINTER. 247 // Abbrev for TYPE_CODE_POINTER.
237 BitCodeAbbrev *Abbv = new BitCodeAbbrev(); 248 BitCodeAbbrev *Abbv = new BitCodeAbbrev();
238 Abbv->Add(BitCodeAbbrevOp(bitc::TYPE_CODE_POINTER)); 249 Abbv->Add(BitCodeAbbrevOp(bitc::TYPE_CODE_POINTER));
239 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, NumBits)); 250 Abbv->Add(BitCodeAbbrevOp(TypeIdEncoding, TypeIdNumBits));
240 Abbv->Add(BitCodeAbbrevOp(0)); // Addrspace = 0 251 Abbv->Add(BitCodeAbbrevOp(0)); // Addrspace = 0
241 unsigned PtrAbbrev = Stream.EmitAbbrev(Abbv); 252 unsigned PtrAbbrev = Stream.EmitAbbrev(Abbv);
242 253
243 // Abbrev for TYPE_CODE_FUNCTION. 254 // Abbrev for TYPE_CODE_FUNCTION.
244 Abbv = new BitCodeAbbrev(); 255 Abbv = new BitCodeAbbrev();
245 Abbv->Add(BitCodeAbbrevOp(bitc::TYPE_CODE_FUNCTION)); 256 Abbv->Add(BitCodeAbbrevOp(bitc::TYPE_CODE_FUNCTION));
246 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // isvararg 257 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // isvararg
247 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array)); 258 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
248 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, NumBits)); 259 Abbv->Add(BitCodeAbbrevOp(TypeIdEncoding, TypeIdNumBits));
249
250 unsigned FunctionAbbrev = Stream.EmitAbbrev(Abbv); 260 unsigned FunctionAbbrev = Stream.EmitAbbrev(Abbv);
251 261
252 // Abbrev for TYPE_CODE_STRUCT_ANON. 262 // Abbrev for TYPE_CODE_STRUCT_ANON.
253 Abbv = new BitCodeAbbrev(); 263 Abbv = new BitCodeAbbrev();
254 Abbv->Add(BitCodeAbbrevOp(bitc::TYPE_CODE_STRUCT_ANON)); 264 Abbv->Add(BitCodeAbbrevOp(bitc::TYPE_CODE_STRUCT_ANON));
255 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // ispacked 265 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // ispacked
256 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array)); 266 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
257 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, NumBits)); 267 Abbv->Add(BitCodeAbbrevOp(TypeIdEncoding, TypeIdNumBits));
258
259 unsigned StructAnonAbbrev = Stream.EmitAbbrev(Abbv); 268 unsigned StructAnonAbbrev = Stream.EmitAbbrev(Abbv);
260 269
261 // Abbrev for TYPE_CODE_STRUCT_NAME. 270 // Abbrev for TYPE_CODE_STRUCT_NAME.
262 Abbv = new BitCodeAbbrev(); 271 Abbv = new BitCodeAbbrev();
263 Abbv->Add(BitCodeAbbrevOp(bitc::TYPE_CODE_STRUCT_NAME)); 272 Abbv->Add(BitCodeAbbrevOp(bitc::TYPE_CODE_STRUCT_NAME));
264 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array)); 273 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
265 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Char6)); 274 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Char6));
266 unsigned StructNameAbbrev = Stream.EmitAbbrev(Abbv); 275 unsigned StructNameAbbrev = Stream.EmitAbbrev(Abbv);
267 276
268 // Abbrev for TYPE_CODE_STRUCT_NAMED. 277 // Abbrev for TYPE_CODE_STRUCT_NAMED.
269 Abbv = new BitCodeAbbrev(); 278 Abbv = new BitCodeAbbrev();
270 Abbv->Add(BitCodeAbbrevOp(bitc::TYPE_CODE_STRUCT_NAMED)); 279 Abbv->Add(BitCodeAbbrevOp(bitc::TYPE_CODE_STRUCT_NAMED));
271 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // ispacked 280 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // ispacked
272 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array)); 281 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
273 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, NumBits)); 282 Abbv->Add(BitCodeAbbrevOp(TypeIdEncoding, TypeIdNumBits));
274
275 unsigned StructNamedAbbrev = Stream.EmitAbbrev(Abbv); 283 unsigned StructNamedAbbrev = Stream.EmitAbbrev(Abbv);
276 284
277 // Abbrev for TYPE_CODE_ARRAY. 285 // Abbrev for TYPE_CODE_ARRAY.
278 Abbv = new BitCodeAbbrev(); 286 Abbv = new BitCodeAbbrev();
279 Abbv->Add(BitCodeAbbrevOp(bitc::TYPE_CODE_ARRAY)); 287 Abbv->Add(BitCodeAbbrevOp(bitc::TYPE_CODE_ARRAY));
280 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // size 288 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // size
281 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, NumBits)); 289 Abbv->Add(BitCodeAbbrevOp(TypeIdEncoding, TypeIdNumBits));
282
283 unsigned ArrayAbbrev = Stream.EmitAbbrev(Abbv); 290 unsigned ArrayAbbrev = Stream.EmitAbbrev(Abbv);
284 291
285 // Emit an entry count so the reader can reserve space. 292 // Emit an entry count so the reader can reserve space.
286 TypeVals.push_back(TypeList.size()); 293 TypeVals.push_back(TypeList.size());
287 Stream.EmitRecord(bitc::TYPE_CODE_NUMENTRY, TypeVals); 294 Stream.EmitRecord(bitc::TYPE_CODE_NUMENTRY, TypeVals);
288 TypeVals.clear(); 295 TypeVals.clear();
289 296
290 // Loop over all of the types, emitting each in turn. 297 // Loop over all of the types, emitting each in turn.
291 for (unsigned i = 0, e = TypeList.size(); i != e; ++i) { 298 for (unsigned i = 0, e = TypeList.size(); i != e; ++i) {
292 Type *T = TypeList[i]; 299 Type *T = TypeList[i];
(...skipping 1615 matching lines...) Expand 10 before | Expand all | Expand 10 after
1908 // Emit the module. 1915 // Emit the module.
1909 WriteModule(M, Stream); 1916 WriteModule(M, Stream);
1910 } 1917 }
1911 1918
1912 if (TT.isOSDarwin()) 1919 if (TT.isOSDarwin())
1913 EmitDarwinBCHeaderAndTrailer(Buffer, TT); 1920 EmitDarwinBCHeaderAndTrailer(Buffer, TT);
1914 1921
1915 // Write the generated bitstream to "Out". 1922 // Write the generated bitstream to "Out".
1916 Out.write((char*)&Buffer.front(), Buffer.size()); 1923 Out.write((char*)&Buffer.front(), Buffer.size());
1917 } 1924 }
OLDNEW
« no previous file with comments | « no previous file | lib/Bitcode/NaCl/Writer/NaClValueEnumerator.h » ('j') | lib/Bitcode/NaCl/Writer/NaClValueEnumerator.cpp » ('J')

Powered by Google App Engine
This is Rietveld 408576698