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

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

Issue 14682013: Copy BitCodes.h to NaCl/NaClBitCodes.h (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
« no previous file with comments | « lib/Bitcode/NaCl/Reader/NaClBitstreamReader.cpp ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 18 matching lines...) Expand all
29 #include "llvm/Support/Program.h" 29 #include "llvm/Support/Program.h"
30 #include "llvm/Support/raw_ostream.h" 30 #include "llvm/Support/raw_ostream.h"
31 #include <cctype> 31 #include <cctype>
32 #include <map> 32 #include <map>
33 using namespace llvm; 33 using namespace llvm;
34 34
35 /// These are manifest constants used by the bitcode writer. They do not need to 35 /// These are manifest constants used by the bitcode writer. They do not need to
36 /// be kept in sync with the reader, but need to be consistent within this file. 36 /// be kept in sync with the reader, but need to be consistent within this file.
37 enum { 37 enum {
38 // VALUE_SYMTAB_BLOCK abbrev id's. 38 // VALUE_SYMTAB_BLOCK abbrev id's.
39 VST_ENTRY_8_ABBREV = bitc::FIRST_APPLICATION_ABBREV, 39 VST_ENTRY_8_ABBREV = naclbitc::FIRST_APPLICATION_ABBREV,
40 VST_ENTRY_7_ABBREV, 40 VST_ENTRY_7_ABBREV,
41 VST_ENTRY_6_ABBREV, 41 VST_ENTRY_6_ABBREV,
42 VST_BBENTRY_6_ABBREV, 42 VST_BBENTRY_6_ABBREV,
43 43
44 // CONSTANTS_BLOCK abbrev id's. 44 // CONSTANTS_BLOCK abbrev id's.
45 CONSTANTS_SETTYPE_ABBREV = bitc::FIRST_APPLICATION_ABBREV, 45 CONSTANTS_SETTYPE_ABBREV = naclbitc::FIRST_APPLICATION_ABBREV,
46 CONSTANTS_INTEGER_ABBREV, 46 CONSTANTS_INTEGER_ABBREV,
47 CONSTANTS_CE_CAST_Abbrev, 47 CONSTANTS_CE_CAST_Abbrev,
48 CONSTANTS_NULL_Abbrev, 48 CONSTANTS_NULL_Abbrev,
49 49
50 // FUNCTION_BLOCK abbrev id's. 50 // FUNCTION_BLOCK abbrev id's.
51 FUNCTION_INST_LOAD_ABBREV = bitc::FIRST_APPLICATION_ABBREV, 51 FUNCTION_INST_LOAD_ABBREV = naclbitc::FIRST_APPLICATION_ABBREV,
52 FUNCTION_INST_BINOP_ABBREV, 52 FUNCTION_INST_BINOP_ABBREV,
53 FUNCTION_INST_BINOP_FLAGS_ABBREV, 53 FUNCTION_INST_BINOP_FLAGS_ABBREV,
54 FUNCTION_INST_CAST_ABBREV, 54 FUNCTION_INST_CAST_ABBREV,
55 FUNCTION_INST_RET_VOID_ABBREV, 55 FUNCTION_INST_RET_VOID_ABBREV,
56 FUNCTION_INST_RET_VAL_ABBREV, 56 FUNCTION_INST_RET_VAL_ABBREV,
57 FUNCTION_INST_UNREACHABLE_ABBREV, 57 FUNCTION_INST_UNREACHABLE_ABBREV,
58 58
59 // SwitchInst Magic 59 // SwitchInst Magic
60 SWITCH_INST_MAGIC = 0x4B5 // May 2012 => 1205 => Hex 60 SWITCH_INST_MAGIC = 0x4B5 // May 2012 => 1205 => Hex
61 }; 61 };
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
134 134
135 static unsigned GetEncodedSynchScope(SynchronizationScope SynchScope) { 135 static unsigned GetEncodedSynchScope(SynchronizationScope SynchScope) {
136 switch (SynchScope) { 136 switch (SynchScope) {
137 case SingleThread: return naclbitc::SYNCHSCOPE_SINGLETHREAD; 137 case SingleThread: return naclbitc::SYNCHSCOPE_SINGLETHREAD;
138 case CrossThread: return naclbitc::SYNCHSCOPE_CROSSTHREAD; 138 case CrossThread: return naclbitc::SYNCHSCOPE_CROSSTHREAD;
139 } 139 }
140 llvm_unreachable("Invalid synch scope"); 140 llvm_unreachable("Invalid synch scope");
141 } 141 }
142 142
143 static void WriteStringRecord(unsigned Code, StringRef Str, 143 static void WriteStringRecord(unsigned Code, StringRef Str,
144 unsigned AbbrevToUse, NaClBitstreamWriter &Stream) { 144 unsigned AbbrevToUse,
145 NaClBitstreamWriter &Stream) {
145 SmallVector<unsigned, 64> Vals; 146 SmallVector<unsigned, 64> Vals;
146 147
147 // Code: [strchar x N] 148 // Code: [strchar x N]
148 for (unsigned i = 0, e = Str.size(); i != e; ++i) { 149 for (unsigned i = 0, e = Str.size(); i != e; ++i) {
149 if (AbbrevToUse && !BitCodeAbbrevOp::isChar6(Str[i])) 150 if (AbbrevToUse && !NaClBitCodeAbbrevOp::isChar6(Str[i]))
150 AbbrevToUse = 0; 151 AbbrevToUse = 0;
151 Vals.push_back(Str[i]); 152 Vals.push_back(Str[i]);
152 } 153 }
153 154
154 // Emit the finished record. 155 // Emit the finished record.
155 Stream.EmitRecord(Code, Vals, AbbrevToUse); 156 Stream.EmitRecord(Code, Vals, AbbrevToUse);
156 } 157 }
157 158
158 static void WriteAttributeGroupTable(const NaClValueEnumerator &VE, 159 static void WriteAttributeGroupTable(const NaClValueEnumerator &VE,
159 NaClBitstreamWriter &Stream) { 160 NaClBitstreamWriter &Stream) {
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
221 } 222 }
222 223
223 Stream.ExitBlock(); 224 Stream.ExitBlock();
224 } 225 }
225 226
226 /// WriteTypeTable - Write out the type table for a module. 227 /// WriteTypeTable - Write out the type table for a module.
227 static void WriteTypeTable(const NaClValueEnumerator &VE, 228 static void WriteTypeTable(const NaClValueEnumerator &VE,
228 NaClBitstreamWriter &Stream) { 229 NaClBitstreamWriter &Stream) {
229 const NaClValueEnumerator::TypeList &TypeList = VE.getTypes(); 230 const NaClValueEnumerator::TypeList &TypeList = VE.getTypes();
230 231
231 Stream.EnterSubblock(naclbitc::TYPE_BLOCK_ID_NEW, 4 /*count from # abbrevs */) ; 232 Stream.EnterSubblock(naclbitc::TYPE_BLOCK_ID_NEW,
233 4 /*count from # abbrevs */);
232 SmallVector<uint64_t, 64> TypeVals; 234 SmallVector<uint64_t, 64> TypeVals;
233 235
234 uint64_t NumBits = Log2_32_Ceil(VE.getTypes().size()+1); 236 uint64_t NumBits = Log2_32_Ceil(VE.getTypes().size()+1);
235 237
236 // Abbrev for TYPE_CODE_POINTER. 238 // Abbrev for TYPE_CODE_POINTER.
237 BitCodeAbbrev *Abbv = new BitCodeAbbrev(); 239 NaClBitCodeAbbrev *Abbv = new NaClBitCodeAbbrev();
238 Abbv->Add(BitCodeAbbrevOp(naclbitc::TYPE_CODE_POINTER)); 240 Abbv->Add(NaClBitCodeAbbrevOp(naclbitc::TYPE_CODE_POINTER));
239 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, NumBits)); 241 Abbv->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::Fixed, NumBits));
240 Abbv->Add(BitCodeAbbrevOp(0)); // Addrspace = 0 242 Abbv->Add(NaClBitCodeAbbrevOp(0)); // Addrspace = 0
241 unsigned PtrAbbrev = Stream.EmitAbbrev(Abbv); 243 unsigned PtrAbbrev = Stream.EmitAbbrev(Abbv);
242 244
243 // Abbrev for TYPE_CODE_FUNCTION. 245 // Abbrev for TYPE_CODE_FUNCTION.
244 Abbv = new BitCodeAbbrev(); 246 Abbv = new NaClBitCodeAbbrev();
245 Abbv->Add(BitCodeAbbrevOp(naclbitc::TYPE_CODE_FUNCTION)); 247 Abbv->Add(NaClBitCodeAbbrevOp(naclbitc::TYPE_CODE_FUNCTION));
246 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // isvararg 248 Abbv->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::Fixed, 1)); // isvararg
247 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array)); 249 Abbv->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::Array));
248 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, NumBits)); 250 Abbv->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::Fixed, NumBits));
249 251
250 unsigned FunctionAbbrev = Stream.EmitAbbrev(Abbv); 252 unsigned FunctionAbbrev = Stream.EmitAbbrev(Abbv);
251 253
252 // Abbrev for TYPE_CODE_STRUCT_ANON. 254 // Abbrev for TYPE_CODE_STRUCT_ANON.
253 Abbv = new BitCodeAbbrev(); 255 Abbv = new NaClBitCodeAbbrev();
254 Abbv->Add(BitCodeAbbrevOp(naclbitc::TYPE_CODE_STRUCT_ANON)); 256 Abbv->Add(NaClBitCodeAbbrevOp(naclbitc::TYPE_CODE_STRUCT_ANON));
255 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // ispacked 257 Abbv->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::Fixed, 1)); // ispacked
256 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array)); 258 Abbv->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::Array));
257 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, NumBits)); 259 Abbv->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::Fixed, NumBits));
258 260
259 unsigned StructAnonAbbrev = Stream.EmitAbbrev(Abbv); 261 unsigned StructAnonAbbrev = Stream.EmitAbbrev(Abbv);
260 262
261 // Abbrev for TYPE_CODE_STRUCT_NAME. 263 // Abbrev for TYPE_CODE_STRUCT_NAME.
262 Abbv = new BitCodeAbbrev(); 264 Abbv = new NaClBitCodeAbbrev();
263 Abbv->Add(BitCodeAbbrevOp(naclbitc::TYPE_CODE_STRUCT_NAME)); 265 Abbv->Add(NaClBitCodeAbbrevOp(naclbitc::TYPE_CODE_STRUCT_NAME));
264 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array)); 266 Abbv->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::Array));
265 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Char6)); 267 Abbv->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::Char6));
266 unsigned StructNameAbbrev = Stream.EmitAbbrev(Abbv); 268 unsigned StructNameAbbrev = Stream.EmitAbbrev(Abbv);
267 269
268 // Abbrev for TYPE_CODE_STRUCT_NAMED. 270 // Abbrev for TYPE_CODE_STRUCT_NAMED.
269 Abbv = new BitCodeAbbrev(); 271 Abbv = new NaClBitCodeAbbrev();
270 Abbv->Add(BitCodeAbbrevOp(naclbitc::TYPE_CODE_STRUCT_NAMED)); 272 Abbv->Add(NaClBitCodeAbbrevOp(naclbitc::TYPE_CODE_STRUCT_NAMED));
271 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // ispacked 273 Abbv->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::Fixed, 1)); // ispacked
272 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array)); 274 Abbv->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::Array));
273 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, NumBits)); 275 Abbv->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::Fixed, NumBits));
274 276
275 unsigned StructNamedAbbrev = Stream.EmitAbbrev(Abbv); 277 unsigned StructNamedAbbrev = Stream.EmitAbbrev(Abbv);
276 278
277 // Abbrev for TYPE_CODE_ARRAY. 279 // Abbrev for TYPE_CODE_ARRAY.
278 Abbv = new BitCodeAbbrev(); 280 Abbv = new NaClBitCodeAbbrev();
279 Abbv->Add(BitCodeAbbrevOp(naclbitc::TYPE_CODE_ARRAY)); 281 Abbv->Add(NaClBitCodeAbbrevOp(naclbitc::TYPE_CODE_ARRAY));
280 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // size 282 Abbv->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::VBR, 8)); // size
281 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, NumBits)); 283 Abbv->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::Fixed, NumBits));
282 284
283 unsigned ArrayAbbrev = Stream.EmitAbbrev(Abbv); 285 unsigned ArrayAbbrev = Stream.EmitAbbrev(Abbv);
284 286
285 // Emit an entry count so the reader can reserve space. 287 // Emit an entry count so the reader can reserve space.
286 TypeVals.push_back(TypeList.size()); 288 TypeVals.push_back(TypeList.size());
287 Stream.EmitRecord(naclbitc::TYPE_CODE_NUMENTRY, TypeVals); 289 Stream.EmitRecord(naclbitc::TYPE_CODE_NUMENTRY, TypeVals);
288 TypeVals.clear(); 290 TypeVals.clear();
289 291
290 // Loop over all of the types, emitting each in turn. 292 // Loop over all of the types, emitting each in turn.
291 for (unsigned i = 0, e = TypeList.size(); i != e; ++i) { 293 for (unsigned i = 0, e = TypeList.size(); i != e; ++i) {
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after
481 0/*TODO*/, Stream); 483 0/*TODO*/, Stream);
482 Entry = GCMap.size(); 484 Entry = GCMap.size();
483 } 485 }
484 } 486 }
485 } 487 }
486 488
487 // Emit abbrev for globals, now that we know # sections and max alignment. 489 // Emit abbrev for globals, now that we know # sections and max alignment.
488 unsigned SimpleGVarAbbrev = 0; 490 unsigned SimpleGVarAbbrev = 0;
489 if (!M->global_empty()) { 491 if (!M->global_empty()) {
490 // Add an abbrev for common globals with no visibility or thread localness. 492 // Add an abbrev for common globals with no visibility or thread localness.
491 BitCodeAbbrev *Abbv = new BitCodeAbbrev(); 493 NaClBitCodeAbbrev *Abbv = new NaClBitCodeAbbrev();
492 Abbv->Add(BitCodeAbbrevOp(naclbitc::MODULE_CODE_GLOBALVAR)); 494 Abbv->Add(NaClBitCodeAbbrevOp(naclbitc::MODULE_CODE_GLOBALVAR));
493 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 495 Abbv->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::Fixed,
494 Log2_32_Ceil(MaxGlobalType+1))); 496 Log2_32_Ceil(MaxGlobalType+1)));
495 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // Constant. 497 Abbv->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::Fixed, 1)); // Constant.
496 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Initializer. 498 Abbv->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::VBR, 6)); // Initialize r.
497 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 4)); // Linkage. 499 Abbv->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::Fixed, 4)); // Linkage.
498 if (MaxAlignment == 0) // Alignment. 500 if (MaxAlignment == 0) // Alignment.
499 Abbv->Add(BitCodeAbbrevOp(0)); 501 Abbv->Add(NaClBitCodeAbbrevOp(0));
500 else { 502 else {
501 unsigned MaxEncAlignment = Log2_32(MaxAlignment)+1; 503 unsigned MaxEncAlignment = Log2_32(MaxAlignment)+1;
502 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 504 Abbv->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::Fixed,
503 Log2_32_Ceil(MaxEncAlignment+1))); 505 Log2_32_Ceil(MaxEncAlignment+1)));
504 } 506 }
505 if (SectionMap.empty()) // Section. 507 if (SectionMap.empty()) // Section.
506 Abbv->Add(BitCodeAbbrevOp(0)); 508 Abbv->Add(NaClBitCodeAbbrevOp(0));
507 else 509 else
508 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 510 Abbv->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::Fixed,
509 Log2_32_Ceil(SectionMap.size()+1))); 511 Log2_32_Ceil(SectionMap.size()+1)));
510 // Don't bother emitting vis + thread local. 512 // Don't bother emitting vis + thread local.
511 SimpleGVarAbbrev = Stream.EmitAbbrev(Abbv); 513 SimpleGVarAbbrev = Stream.EmitAbbrev(Abbv);
512 } 514 }
513 515
514 // Emit the global variable information. 516 // Emit the global variable information.
515 SmallVector<unsigned, 64> Vals; 517 SmallVector<unsigned, 64> Vals;
516 for (Module::const_global_iterator GV = M->global_begin(),E = M->global_end(); 518 for (Module::const_global_iterator GV = M->global_begin(),E = M->global_end();
517 GV != E; ++GV) { 519 GV != E; ++GV) {
518 unsigned AbbrevToUse = 0; 520 unsigned AbbrevToUse = 0;
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
640 Stream.EnterSubblock(naclbitc::METADATA_BLOCK_ID, 3); 642 Stream.EnterSubblock(naclbitc::METADATA_BLOCK_ID, 3);
641 StartedMetadataBlock = true; 643 StartedMetadataBlock = true;
642 } 644 }
643 WriteMDNode(N, VE, Stream, Record); 645 WriteMDNode(N, VE, Stream, Record);
644 } 646 }
645 } else if (const MDString *MDS = dyn_cast<MDString>(Vals[i].first)) { 647 } else if (const MDString *MDS = dyn_cast<MDString>(Vals[i].first)) {
646 if (!StartedMetadataBlock) { 648 if (!StartedMetadataBlock) {
647 Stream.EnterSubblock(naclbitc::METADATA_BLOCK_ID, 3); 649 Stream.EnterSubblock(naclbitc::METADATA_BLOCK_ID, 3);
648 650
649 // Abbrev for METADATA_STRING. 651 // Abbrev for METADATA_STRING.
650 BitCodeAbbrev *Abbv = new BitCodeAbbrev(); 652 NaClBitCodeAbbrev *Abbv = new NaClBitCodeAbbrev();
651 Abbv->Add(BitCodeAbbrevOp(naclbitc::METADATA_STRING)); 653 Abbv->Add(NaClBitCodeAbbrevOp(naclbitc::METADATA_STRING));
652 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array)); 654 Abbv->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::Array));
653 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 8)); 655 Abbv->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::Fixed, 8));
654 MDSAbbrev = Stream.EmitAbbrev(Abbv); 656 MDSAbbrev = Stream.EmitAbbrev(Abbv);
655 StartedMetadataBlock = true; 657 StartedMetadataBlock = true;
656 } 658 }
657 659
658 // Code: [strchar x N] 660 // Code: [strchar x N]
659 Record.append(MDS->begin(), MDS->end()); 661 Record.append(MDS->begin(), MDS->end());
660 662
661 // Emit the finished record. 663 // Emit the finished record.
662 Stream.EmitRecord(naclbitc::METADATA_STRING, Record, MDSAbbrev); 664 Stream.EmitRecord(naclbitc::METADATA_STRING, Record, MDSAbbrev);
663 Record.clear(); 665 Record.clear();
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
737 Record.push_back(MDs[i].first); 739 Record.push_back(MDs[i].first);
738 Record.push_back(VE.getValueID(MDs[i].second)); 740 Record.push_back(VE.getValueID(MDs[i].second));
739 } 741 }
740 Stream.EmitRecord(naclbitc::METADATA_ATTACHMENT, Record, 0); 742 Stream.EmitRecord(naclbitc::METADATA_ATTACHMENT, Record, 0);
741 Record.clear(); 743 Record.clear();
742 } 744 }
743 745
744 Stream.ExitBlock(); 746 Stream.ExitBlock();
745 } 747 }
746 748
747 static void WriteModuleMetadataStore(const Module *M, NaClBitstreamWriter &Strea m) { 749 static void WriteModuleMetadataStore(const Module *M,
750 NaClBitstreamWriter &Stream) {
748 SmallVector<uint64_t, 64> Record; 751 SmallVector<uint64_t, 64> Record;
749 752
750 // Write metadata kinds 753 // Write metadata kinds
751 // METADATA_KIND - [n x [id, name]] 754 // METADATA_KIND - [n x [id, name]]
752 SmallVector<StringRef, 8> Names; 755 SmallVector<StringRef, 8> Names;
753 M->getMDKindNames(Names); 756 M->getMDKindNames(Names);
754 757
755 if (Names.empty()) return; 758 if (Names.empty()) return;
756 759
757 Stream.EnterSubblock(naclbitc::METADATA_BLOCK_ID, 3); 760 Stream.EnterSubblock(naclbitc::METADATA_BLOCK_ID, 3);
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
810 813
811 Stream.EnterSubblock(naclbitc::CONSTANTS_BLOCK_ID, 4); 814 Stream.EnterSubblock(naclbitc::CONSTANTS_BLOCK_ID, 4);
812 815
813 unsigned AggregateAbbrev = 0; 816 unsigned AggregateAbbrev = 0;
814 unsigned String8Abbrev = 0; 817 unsigned String8Abbrev = 0;
815 unsigned CString7Abbrev = 0; 818 unsigned CString7Abbrev = 0;
816 unsigned CString6Abbrev = 0; 819 unsigned CString6Abbrev = 0;
817 // If this is a constant pool for the module, emit module-specific abbrevs. 820 // If this is a constant pool for the module, emit module-specific abbrevs.
818 if (isGlobal) { 821 if (isGlobal) {
819 // Abbrev for CST_CODE_AGGREGATE. 822 // Abbrev for CST_CODE_AGGREGATE.
820 BitCodeAbbrev *Abbv = new BitCodeAbbrev(); 823 NaClBitCodeAbbrev *Abbv = new NaClBitCodeAbbrev();
821 Abbv->Add(BitCodeAbbrevOp(naclbitc::CST_CODE_AGGREGATE)); 824 Abbv->Add(NaClBitCodeAbbrevOp(naclbitc::CST_CODE_AGGREGATE));
822 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array)); 825 Abbv->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::Array));
823 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, Log2_32_Ceil(LastVal+1))); 826 Abbv->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::Fixed,
827 Log2_32_Ceil(LastVal+1)));
824 AggregateAbbrev = Stream.EmitAbbrev(Abbv); 828 AggregateAbbrev = Stream.EmitAbbrev(Abbv);
825 829
826 // Abbrev for CST_CODE_STRING. 830 // Abbrev for CST_CODE_STRING.
827 Abbv = new BitCodeAbbrev(); 831 Abbv = new NaClBitCodeAbbrev();
828 Abbv->Add(BitCodeAbbrevOp(naclbitc::CST_CODE_STRING)); 832 Abbv->Add(NaClBitCodeAbbrevOp(naclbitc::CST_CODE_STRING));
829 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array)); 833 Abbv->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::Array));
830 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 8)); 834 Abbv->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::Fixed, 8));
831 String8Abbrev = Stream.EmitAbbrev(Abbv); 835 String8Abbrev = Stream.EmitAbbrev(Abbv);
832 // Abbrev for CST_CODE_CSTRING. 836 // Abbrev for CST_CODE_CSTRING.
833 Abbv = new BitCodeAbbrev(); 837 Abbv = new NaClBitCodeAbbrev();
834 Abbv->Add(BitCodeAbbrevOp(naclbitc::CST_CODE_CSTRING)); 838 Abbv->Add(NaClBitCodeAbbrevOp(naclbitc::CST_CODE_CSTRING));
835 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array)); 839 Abbv->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::Array));
836 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 7)); 840 Abbv->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::Fixed, 7));
837 CString7Abbrev = Stream.EmitAbbrev(Abbv); 841 CString7Abbrev = Stream.EmitAbbrev(Abbv);
838 // Abbrev for CST_CODE_CSTRING. 842 // Abbrev for CST_CODE_CSTRING.
839 Abbv = new BitCodeAbbrev(); 843 Abbv = new NaClBitCodeAbbrev();
840 Abbv->Add(BitCodeAbbrevOp(naclbitc::CST_CODE_CSTRING)); 844 Abbv->Add(NaClBitCodeAbbrevOp(naclbitc::CST_CODE_CSTRING));
841 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array)); 845 Abbv->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::Array));
842 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Char6)); 846 Abbv->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::Char6));
843 CString6Abbrev = Stream.EmitAbbrev(Abbv); 847 CString6Abbrev = Stream.EmitAbbrev(Abbv);
844 } 848 }
845 849
846 SmallVector<uint64_t, 64> Record; 850 SmallVector<uint64_t, 64> Record;
847 851
848 const NaClValueEnumerator::ValueList &Vals = VE.getValues(); 852 const NaClValueEnumerator::ValueList &Vals = VE.getValues();
849 Type *LastTy = 0; 853 Type *LastTy = 0;
850 for (unsigned i = FirstVal; i != LastVal; ++i) { 854 for (unsigned i = FirstVal; i != LastVal; ++i) {
851 const Value *V = Vals[i].first; 855 const Value *V = Vals[i].first;
852 // If we need to switch types, do so now. 856 // If we need to switch types, do so now.
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
920 Code = naclbitc::CST_CODE_STRING; 924 Code = naclbitc::CST_CODE_STRING;
921 AbbrevToUse = String8Abbrev; 925 AbbrevToUse = String8Abbrev;
922 } 926 }
923 bool isCStr7 = Code == naclbitc::CST_CODE_CSTRING; 927 bool isCStr7 = Code == naclbitc::CST_CODE_CSTRING;
924 bool isCStrChar6 = Code == naclbitc::CST_CODE_CSTRING; 928 bool isCStrChar6 = Code == naclbitc::CST_CODE_CSTRING;
925 for (unsigned i = 0; i != NumElts; ++i) { 929 for (unsigned i = 0; i != NumElts; ++i) {
926 unsigned char V = Str->getElementAsInteger(i); 930 unsigned char V = Str->getElementAsInteger(i);
927 Record.push_back(V); 931 Record.push_back(V);
928 isCStr7 &= (V & 128) == 0; 932 isCStr7 &= (V & 128) == 0;
929 if (isCStrChar6) 933 if (isCStrChar6)
930 isCStrChar6 = BitCodeAbbrevOp::isChar6(V); 934 isCStrChar6 = NaClBitCodeAbbrevOp::isChar6(V);
931 } 935 }
932 936
933 if (isCStrChar6) 937 if (isCStrChar6)
934 AbbrevToUse = CString6Abbrev; 938 AbbrevToUse = CString6Abbrev;
935 else if (isCStr7) 939 else if (isCStr7)
936 AbbrevToUse = CString7Abbrev; 940 AbbrevToUse = CString7Abbrev;
937 } else if (const ConstantDataSequential *CDS = 941 } else if (const ConstantDataSequential *CDS =
938 dyn_cast<ConstantDataSequential>(C)) { 942 dyn_cast<ConstantDataSequential>(C)) {
939 Code = naclbitc::CST_CODE_DATA; 943 Code = naclbitc::CST_CODE_DATA;
940 Type *EltTy = CDS->getType()->getElementType(); 944 Type *EltTy = CDS->getType()->getElementType();
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after
1104 static void pushValueSigned(const Value *V, unsigned InstID, 1108 static void pushValueSigned(const Value *V, unsigned InstID,
1105 SmallVector<uint64_t, 128> &Vals, 1109 SmallVector<uint64_t, 128> &Vals,
1106 NaClValueEnumerator &VE) { 1110 NaClValueEnumerator &VE) {
1107 unsigned ValID = VE.getValueID(V); 1111 unsigned ValID = VE.getValueID(V);
1108 int64_t diff = ((int32_t)InstID - (int32_t)ValID); 1112 int64_t diff = ((int32_t)InstID - (int32_t)ValID);
1109 emitSignedInt64(Vals, diff); 1113 emitSignedInt64(Vals, diff);
1110 } 1114 }
1111 1115
1112 /// WriteInstruction - Emit an instruction to the specified stream. 1116 /// WriteInstruction - Emit an instruction to the specified stream.
1113 static void WriteInstruction(const Instruction &I, unsigned InstID, 1117 static void WriteInstruction(const Instruction &I, unsigned InstID,
1114 NaClValueEnumerator &VE, NaClBitstreamWriter &Strea m, 1118 NaClValueEnumerator &VE,
1119 NaClBitstreamWriter &Stream,
1115 SmallVector<unsigned, 64> &Vals) { 1120 SmallVector<unsigned, 64> &Vals) {
1116 unsigned Code = 0; 1121 unsigned Code = 0;
1117 unsigned AbbrevToUse = 0; 1122 unsigned AbbrevToUse = 0;
1118 VE.setInstructionID(&I); 1123 VE.setInstructionID(&I);
1119 switch (I.getOpcode()) { 1124 switch (I.getOpcode()) {
1120 default: 1125 default:
1121 if (Instruction::isCast(I.getOpcode())) { 1126 if (Instruction::isCast(I.getOpcode())) {
1122 Code = naclbitc::FUNC_CODE_INST_CAST; 1127 Code = naclbitc::FUNC_CODE_INST_CAST;
1123 if (!PushValueAndType(I.getOperand(0), InstID, Vals, VE)) 1128 if (!PushValueAndType(I.getOperand(0), InstID, Vals, VE))
1124 AbbrevToUse = FUNCTION_INST_CAST_ABBREV; 1129 AbbrevToUse = FUNCTION_INST_CAST_ABBREV;
(...skipping 356 matching lines...) Expand 10 before | Expand all | Expand 10 after
1481 SI != SE; ++SI) { 1486 SI != SE; ++SI) {
1482 1487
1483 const ValueName &Name = *SI; 1488 const ValueName &Name = *SI;
1484 1489
1485 // Figure out the encoding to use for the name. 1490 // Figure out the encoding to use for the name.
1486 bool is7Bit = true; 1491 bool is7Bit = true;
1487 bool isChar6 = true; 1492 bool isChar6 = true;
1488 for (const char *C = Name.getKeyData(), *E = C+Name.getKeyLength(); 1493 for (const char *C = Name.getKeyData(), *E = C+Name.getKeyLength();
1489 C != E; ++C) { 1494 C != E; ++C) {
1490 if (isChar6) 1495 if (isChar6)
1491 isChar6 = BitCodeAbbrevOp::isChar6(*C); 1496 isChar6 = NaClBitCodeAbbrevOp::isChar6(*C);
1492 if ((unsigned char)*C & 128) { 1497 if ((unsigned char)*C & 128) {
1493 is7Bit = false; 1498 is7Bit = false;
1494 break; // don't bother scanning the rest. 1499 break; // don't bother scanning the rest.
1495 } 1500 }
1496 } 1501 }
1497 1502
1498 unsigned AbbrevToUse = VST_ENTRY_8_ABBREV; 1503 unsigned AbbrevToUse = VST_ENTRY_8_ABBREV;
1499 1504
1500 // VST_ENTRY: [valueid, namechar x N] 1505 // VST_ENTRY: [valueid, namechar x N]
1501 // VST_BBENTRY: [bbid, namechar x N] 1506 // VST_BBENTRY: [bbid, namechar x N]
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
1590 // Emit names for all the instructions etc. 1595 // Emit names for all the instructions etc.
1591 WriteValueSymbolTable(F.getValueSymbolTable(), VE, Stream); 1596 WriteValueSymbolTable(F.getValueSymbolTable(), VE, Stream);
1592 1597
1593 if (NeedsMetadataAttachment) 1598 if (NeedsMetadataAttachment)
1594 WriteMetadataAttachment(F, VE, Stream); 1599 WriteMetadataAttachment(F, VE, Stream);
1595 VE.purgeFunction(); 1600 VE.purgeFunction();
1596 Stream.ExitBlock(); 1601 Stream.ExitBlock();
1597 } 1602 }
1598 1603
1599 // Emit blockinfo, which defines the standard abbreviations etc. 1604 // Emit blockinfo, which defines the standard abbreviations etc.
1600 static void WriteBlockInfo(const NaClValueEnumerator &VE, NaClBitstreamWriter &S tream) { 1605 static void WriteBlockInfo(const NaClValueEnumerator &VE,
1606 NaClBitstreamWriter &Stream) {
1601 // We only want to emit block info records for blocks that have multiple 1607 // We only want to emit block info records for blocks that have multiple
1602 // instances: CONSTANTS_BLOCK, FUNCTION_BLOCK and VALUE_SYMTAB_BLOCK. 1608 // instances: CONSTANTS_BLOCK, FUNCTION_BLOCK and VALUE_SYMTAB_BLOCK.
1603 // Other blocks can define their abbrevs inline. 1609 // Other blocks can define their abbrevs inline.
1604 Stream.EnterBlockInfoBlock(2); 1610 Stream.EnterBlockInfoBlock(2);
1605 1611
1606 { // 8-bit fixed-width VST_ENTRY/VST_BBENTRY strings. 1612 { // 8-bit fixed-width VST_ENTRY/VST_BBENTRY strings.
1607 BitCodeAbbrev *Abbv = new BitCodeAbbrev(); 1613 NaClBitCodeAbbrev *Abbv = new NaClBitCodeAbbrev();
1608 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 3)); 1614 Abbv->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::Fixed, 3));
1609 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); 1615 Abbv->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::VBR, 8));
1610 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array)); 1616 Abbv->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::Array));
1611 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 8)); 1617 Abbv->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::Fixed, 8));
1612 if (Stream.EmitBlockInfoAbbrev(naclbitc::VALUE_SYMTAB_BLOCK_ID, 1618 if (Stream.EmitBlockInfoAbbrev(naclbitc::VALUE_SYMTAB_BLOCK_ID,
1613 Abbv) != VST_ENTRY_8_ABBREV) 1619 Abbv) != VST_ENTRY_8_ABBREV)
1614 llvm_unreachable("Unexpected abbrev ordering!"); 1620 llvm_unreachable("Unexpected abbrev ordering!");
1615 } 1621 }
1616 1622
1617 { // 7-bit fixed width VST_ENTRY strings. 1623 { // 7-bit fixed width VST_ENTRY strings.
1618 BitCodeAbbrev *Abbv = new BitCodeAbbrev(); 1624 NaClBitCodeAbbrev *Abbv = new NaClBitCodeAbbrev();
1619 Abbv->Add(BitCodeAbbrevOp(naclbitc::VST_CODE_ENTRY)); 1625 Abbv->Add(NaClBitCodeAbbrevOp(naclbitc::VST_CODE_ENTRY));
1620 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); 1626 Abbv->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::VBR, 8));
1621 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array)); 1627 Abbv->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::Array));
1622 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 7)); 1628 Abbv->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::Fixed, 7));
1623 if (Stream.EmitBlockInfoAbbrev(naclbitc::VALUE_SYMTAB_BLOCK_ID, 1629 if (Stream.EmitBlockInfoAbbrev(naclbitc::VALUE_SYMTAB_BLOCK_ID,
1624 Abbv) != VST_ENTRY_7_ABBREV) 1630 Abbv) != VST_ENTRY_7_ABBREV)
1625 llvm_unreachable("Unexpected abbrev ordering!"); 1631 llvm_unreachable("Unexpected abbrev ordering!");
1626 } 1632 }
1627 { // 6-bit char6 VST_ENTRY strings. 1633 { // 6-bit char6 VST_ENTRY strings.
1628 BitCodeAbbrev *Abbv = new BitCodeAbbrev(); 1634 NaClBitCodeAbbrev *Abbv = new NaClBitCodeAbbrev();
1629 Abbv->Add(BitCodeAbbrevOp(naclbitc::VST_CODE_ENTRY)); 1635 Abbv->Add(NaClBitCodeAbbrevOp(naclbitc::VST_CODE_ENTRY));
1630 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); 1636 Abbv->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::VBR, 8));
1631 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array)); 1637 Abbv->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::Array));
1632 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Char6)); 1638 Abbv->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::Char6));
1633 if (Stream.EmitBlockInfoAbbrev(naclbitc::VALUE_SYMTAB_BLOCK_ID, 1639 if (Stream.EmitBlockInfoAbbrev(naclbitc::VALUE_SYMTAB_BLOCK_ID,
1634 Abbv) != VST_ENTRY_6_ABBREV) 1640 Abbv) != VST_ENTRY_6_ABBREV)
1635 llvm_unreachable("Unexpected abbrev ordering!"); 1641 llvm_unreachable("Unexpected abbrev ordering!");
1636 } 1642 }
1637 { // 6-bit char6 VST_BBENTRY strings. 1643 { // 6-bit char6 VST_BBENTRY strings.
1638 BitCodeAbbrev *Abbv = new BitCodeAbbrev(); 1644 NaClBitCodeAbbrev *Abbv = new NaClBitCodeAbbrev();
1639 Abbv->Add(BitCodeAbbrevOp(naclbitc::VST_CODE_BBENTRY)); 1645 Abbv->Add(NaClBitCodeAbbrevOp(naclbitc::VST_CODE_BBENTRY));
1640 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); 1646 Abbv->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::VBR, 8));
1641 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array)); 1647 Abbv->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::Array));
1642 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Char6)); 1648 Abbv->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::Char6));
1643 if (Stream.EmitBlockInfoAbbrev(naclbitc::VALUE_SYMTAB_BLOCK_ID, 1649 if (Stream.EmitBlockInfoAbbrev(naclbitc::VALUE_SYMTAB_BLOCK_ID,
1644 Abbv) != VST_BBENTRY_6_ABBREV) 1650 Abbv) != VST_BBENTRY_6_ABBREV)
1645 llvm_unreachable("Unexpected abbrev ordering!"); 1651 llvm_unreachable("Unexpected abbrev ordering!");
1646 } 1652 }
1647 1653
1648 1654
1649 1655
1650 { // SETTYPE abbrev for CONSTANTS_BLOCK. 1656 { // SETTYPE abbrev for CONSTANTS_BLOCK.
1651 BitCodeAbbrev *Abbv = new BitCodeAbbrev(); 1657 NaClBitCodeAbbrev *Abbv = new NaClBitCodeAbbrev();
1652 Abbv->Add(BitCodeAbbrevOp(naclbitc::CST_CODE_SETTYPE)); 1658 Abbv->Add(NaClBitCodeAbbrevOp(naclbitc::CST_CODE_SETTYPE));
1653 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1659 Abbv->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::Fixed,
1654 Log2_32_Ceil(VE.getTypes().size()+1))); 1660 Log2_32_Ceil(VE.getTypes().size()+1)));
1655 if (Stream.EmitBlockInfoAbbrev(naclbitc::CONSTANTS_BLOCK_ID, 1661 if (Stream.EmitBlockInfoAbbrev(naclbitc::CONSTANTS_BLOCK_ID,
1656 Abbv) != CONSTANTS_SETTYPE_ABBREV) 1662 Abbv) != CONSTANTS_SETTYPE_ABBREV)
1657 llvm_unreachable("Unexpected abbrev ordering!"); 1663 llvm_unreachable("Unexpected abbrev ordering!");
1658 } 1664 }
1659 1665
1660 { // INTEGER abbrev for CONSTANTS_BLOCK. 1666 { // INTEGER abbrev for CONSTANTS_BLOCK.
1661 BitCodeAbbrev *Abbv = new BitCodeAbbrev(); 1667 NaClBitCodeAbbrev *Abbv = new NaClBitCodeAbbrev();
1662 Abbv->Add(BitCodeAbbrevOp(naclbitc::CST_CODE_INTEGER)); 1668 Abbv->Add(NaClBitCodeAbbrevOp(naclbitc::CST_CODE_INTEGER));
1663 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); 1669 Abbv->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::VBR, 8));
1664 if (Stream.EmitBlockInfoAbbrev(naclbitc::CONSTANTS_BLOCK_ID, 1670 if (Stream.EmitBlockInfoAbbrev(naclbitc::CONSTANTS_BLOCK_ID,
1665 Abbv) != CONSTANTS_INTEGER_ABBREV) 1671 Abbv) != CONSTANTS_INTEGER_ABBREV)
1666 llvm_unreachable("Unexpected abbrev ordering!"); 1672 llvm_unreachable("Unexpected abbrev ordering!");
1667 } 1673 }
1668 1674
1669 { // CE_CAST abbrev for CONSTANTS_BLOCK. 1675 { // CE_CAST abbrev for CONSTANTS_BLOCK.
1670 BitCodeAbbrev *Abbv = new BitCodeAbbrev(); 1676 NaClBitCodeAbbrev *Abbv = new NaClBitCodeAbbrev();
1671 Abbv->Add(BitCodeAbbrevOp(naclbitc::CST_CODE_CE_CAST)); 1677 Abbv->Add(NaClBitCodeAbbrevOp(naclbitc::CST_CODE_CE_CAST));
1672 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 4)); // cast opc 1678 Abbv->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::Fixed, 4)); // cast opc
1673 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, // typeid 1679 Abbv->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::Fixed, // typeid
1674 Log2_32_Ceil(VE.getTypes().size()+1))); 1680 Log2_32_Ceil(VE.getTypes().size()+1)));
1675 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // value id 1681 Abbv->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::VBR, 8)); // value id
1676 1682
1677 if (Stream.EmitBlockInfoAbbrev(naclbitc::CONSTANTS_BLOCK_ID, 1683 if (Stream.EmitBlockInfoAbbrev(naclbitc::CONSTANTS_BLOCK_ID,
1678 Abbv) != CONSTANTS_CE_CAST_Abbrev) 1684 Abbv) != CONSTANTS_CE_CAST_Abbrev)
1679 llvm_unreachable("Unexpected abbrev ordering!"); 1685 llvm_unreachable("Unexpected abbrev ordering!");
1680 } 1686 }
1681 { // NULL abbrev for CONSTANTS_BLOCK. 1687 { // NULL abbrev for CONSTANTS_BLOCK.
1682 BitCodeAbbrev *Abbv = new BitCodeAbbrev(); 1688 NaClBitCodeAbbrev *Abbv = new NaClBitCodeAbbrev();
1683 Abbv->Add(BitCodeAbbrevOp(naclbitc::CST_CODE_NULL)); 1689 Abbv->Add(NaClBitCodeAbbrevOp(naclbitc::CST_CODE_NULL));
1684 if (Stream.EmitBlockInfoAbbrev(naclbitc::CONSTANTS_BLOCK_ID, 1690 if (Stream.EmitBlockInfoAbbrev(naclbitc::CONSTANTS_BLOCK_ID,
1685 Abbv) != CONSTANTS_NULL_Abbrev) 1691 Abbv) != CONSTANTS_NULL_Abbrev)
1686 llvm_unreachable("Unexpected abbrev ordering!"); 1692 llvm_unreachable("Unexpected abbrev ordering!");
1687 } 1693 }
1688 1694
1689 // FIXME: This should only use space for first class types! 1695 // FIXME: This should only use space for first class types!
1690 1696
1691 { // INST_LOAD abbrev for FUNCTION_BLOCK. 1697 { // INST_LOAD abbrev for FUNCTION_BLOCK.
1692 BitCodeAbbrev *Abbv = new BitCodeAbbrev(); 1698 NaClBitCodeAbbrev *Abbv = new NaClBitCodeAbbrev();
1693 Abbv->Add(BitCodeAbbrevOp(naclbitc::FUNC_CODE_INST_LOAD)); 1699 Abbv->Add(NaClBitCodeAbbrevOp(naclbitc::FUNC_CODE_INST_LOAD));
1694 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Ptr 1700 Abbv->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::VBR, 6)); // Ptr
1695 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 4)); // Align 1701 Abbv->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::VBR, 4)); // Align
1696 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // volatile 1702 Abbv->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::Fixed, 1)); // volatile
1697 if (Stream.EmitBlockInfoAbbrev(naclbitc::FUNCTION_BLOCK_ID, 1703 if (Stream.EmitBlockInfoAbbrev(naclbitc::FUNCTION_BLOCK_ID,
1698 Abbv) != FUNCTION_INST_LOAD_ABBREV) 1704 Abbv) != FUNCTION_INST_LOAD_ABBREV)
1699 llvm_unreachable("Unexpected abbrev ordering!"); 1705 llvm_unreachable("Unexpected abbrev ordering!");
1700 } 1706 }
1701 { // INST_BINOP abbrev for FUNCTION_BLOCK. 1707 { // INST_BINOP abbrev for FUNCTION_BLOCK.
1702 BitCodeAbbrev *Abbv = new BitCodeAbbrev(); 1708 NaClBitCodeAbbrev *Abbv = new NaClBitCodeAbbrev();
1703 Abbv->Add(BitCodeAbbrevOp(naclbitc::FUNC_CODE_INST_BINOP)); 1709 Abbv->Add(NaClBitCodeAbbrevOp(naclbitc::FUNC_CODE_INST_BINOP));
1704 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // LHS 1710 Abbv->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::VBR, 6)); // LHS
1705 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // RHS 1711 Abbv->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::VBR, 6)); // RHS
1706 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 4)); // opc 1712 Abbv->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::Fixed, 4)); // opc
1707 if (Stream.EmitBlockInfoAbbrev(naclbitc::FUNCTION_BLOCK_ID, 1713 if (Stream.EmitBlockInfoAbbrev(naclbitc::FUNCTION_BLOCK_ID,
1708 Abbv) != FUNCTION_INST_BINOP_ABBREV) 1714 Abbv) != FUNCTION_INST_BINOP_ABBREV)
1709 llvm_unreachable("Unexpected abbrev ordering!"); 1715 llvm_unreachable("Unexpected abbrev ordering!");
1710 } 1716 }
1711 { // INST_BINOP_FLAGS abbrev for FUNCTION_BLOCK. 1717 { // INST_BINOP_FLAGS abbrev for FUNCTION_BLOCK.
1712 BitCodeAbbrev *Abbv = new BitCodeAbbrev(); 1718 NaClBitCodeAbbrev *Abbv = new NaClBitCodeAbbrev();
1713 Abbv->Add(BitCodeAbbrevOp(naclbitc::FUNC_CODE_INST_BINOP)); 1719 Abbv->Add(NaClBitCodeAbbrevOp(naclbitc::FUNC_CODE_INST_BINOP));
1714 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // LHS 1720 Abbv->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::VBR, 6)); // LHS
1715 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // RHS 1721 Abbv->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::VBR, 6)); // RHS
1716 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 4)); // opc 1722 Abbv->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::Fixed, 4)); // opc
1717 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 7)); // flags 1723 Abbv->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::Fixed, 7)); // flags
1718 if (Stream.EmitBlockInfoAbbrev(naclbitc::FUNCTION_BLOCK_ID, 1724 if (Stream.EmitBlockInfoAbbrev(naclbitc::FUNCTION_BLOCK_ID,
1719 Abbv) != FUNCTION_INST_BINOP_FLAGS_ABBREV) 1725 Abbv) != FUNCTION_INST_BINOP_FLAGS_ABBREV)
1720 llvm_unreachable("Unexpected abbrev ordering!"); 1726 llvm_unreachable("Unexpected abbrev ordering!");
1721 } 1727 }
1722 { // INST_CAST abbrev for FUNCTION_BLOCK. 1728 { // INST_CAST abbrev for FUNCTION_BLOCK.
1723 BitCodeAbbrev *Abbv = new BitCodeAbbrev(); 1729 NaClBitCodeAbbrev *Abbv = new NaClBitCodeAbbrev();
1724 Abbv->Add(BitCodeAbbrevOp(naclbitc::FUNC_CODE_INST_CAST)); 1730 Abbv->Add(NaClBitCodeAbbrevOp(naclbitc::FUNC_CODE_INST_CAST));
1725 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // OpVal 1731 Abbv->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::VBR, 6)); // OpVal
1726 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, // dest ty 1732 Abbv->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::Fixed, // dest ty
1727 Log2_32_Ceil(VE.getTypes().size()+1))); 1733 Log2_32_Ceil(VE.getTypes().size()+1)));
1728 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 4)); // opc 1734 Abbv->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::Fixed, 4)); // opc
1729 if (Stream.EmitBlockInfoAbbrev(naclbitc::FUNCTION_BLOCK_ID, 1735 if (Stream.EmitBlockInfoAbbrev(naclbitc::FUNCTION_BLOCK_ID,
1730 Abbv) != FUNCTION_INST_CAST_ABBREV) 1736 Abbv) != FUNCTION_INST_CAST_ABBREV)
1731 llvm_unreachable("Unexpected abbrev ordering!"); 1737 llvm_unreachable("Unexpected abbrev ordering!");
1732 } 1738 }
1733 1739
1734 { // INST_RET abbrev for FUNCTION_BLOCK. 1740 { // INST_RET abbrev for FUNCTION_BLOCK.
1735 BitCodeAbbrev *Abbv = new BitCodeAbbrev(); 1741 NaClBitCodeAbbrev *Abbv = new NaClBitCodeAbbrev();
1736 Abbv->Add(BitCodeAbbrevOp(naclbitc::FUNC_CODE_INST_RET)); 1742 Abbv->Add(NaClBitCodeAbbrevOp(naclbitc::FUNC_CODE_INST_RET));
1737 if (Stream.EmitBlockInfoAbbrev(naclbitc::FUNCTION_BLOCK_ID, 1743 if (Stream.EmitBlockInfoAbbrev(naclbitc::FUNCTION_BLOCK_ID,
1738 Abbv) != FUNCTION_INST_RET_VOID_ABBREV) 1744 Abbv) != FUNCTION_INST_RET_VOID_ABBREV)
1739 llvm_unreachable("Unexpected abbrev ordering!"); 1745 llvm_unreachable("Unexpected abbrev ordering!");
1740 } 1746 }
1741 { // INST_RET abbrev for FUNCTION_BLOCK. 1747 { // INST_RET abbrev for FUNCTION_BLOCK.
1742 BitCodeAbbrev *Abbv = new BitCodeAbbrev(); 1748 NaClBitCodeAbbrev *Abbv = new NaClBitCodeAbbrev();
1743 Abbv->Add(BitCodeAbbrevOp(naclbitc::FUNC_CODE_INST_RET)); 1749 Abbv->Add(NaClBitCodeAbbrevOp(naclbitc::FUNC_CODE_INST_RET));
1744 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // ValID 1750 Abbv->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::VBR, 6)); // ValID
1745 if (Stream.EmitBlockInfoAbbrev(naclbitc::FUNCTION_BLOCK_ID, 1751 if (Stream.EmitBlockInfoAbbrev(naclbitc::FUNCTION_BLOCK_ID,
1746 Abbv) != FUNCTION_INST_RET_VAL_ABBREV) 1752 Abbv) != FUNCTION_INST_RET_VAL_ABBREV)
1747 llvm_unreachable("Unexpected abbrev ordering!"); 1753 llvm_unreachable("Unexpected abbrev ordering!");
1748 } 1754 }
1749 { // INST_UNREACHABLE abbrev for FUNCTION_BLOCK. 1755 { // INST_UNREACHABLE abbrev for FUNCTION_BLOCK.
1750 BitCodeAbbrev *Abbv = new BitCodeAbbrev(); 1756 NaClBitCodeAbbrev *Abbv = new NaClBitCodeAbbrev();
1751 Abbv->Add(BitCodeAbbrevOp(naclbitc::FUNC_CODE_INST_UNREACHABLE)); 1757 Abbv->Add(NaClBitCodeAbbrevOp(naclbitc::FUNC_CODE_INST_UNREACHABLE));
1752 if (Stream.EmitBlockInfoAbbrev(naclbitc::FUNCTION_BLOCK_ID, 1758 if (Stream.EmitBlockInfoAbbrev(naclbitc::FUNCTION_BLOCK_ID,
1753 Abbv) != FUNCTION_INST_UNREACHABLE_ABBREV) 1759 Abbv) != FUNCTION_INST_UNREACHABLE_ABBREV)
1754 llvm_unreachable("Unexpected abbrev ordering!"); 1760 llvm_unreachable("Unexpected abbrev ordering!");
1755 } 1761 }
1756 1762
1757 Stream.ExitBlock(); 1763 Stream.ExitBlock();
1758 } 1764 }
1759 1765
1760 /// WriteModule - Emit the specified module to the bitstream. 1766 /// WriteModule - Emit the specified module to the bitstream.
1761 static void WriteModule(const Module *M, NaClBitstreamWriter &Stream) { 1767 static void WriteModule(const Module *M, NaClBitstreamWriter &Stream) {
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after
1908 // Emit the module. 1914 // Emit the module.
1909 WriteModule(M, Stream); 1915 WriteModule(M, Stream);
1910 } 1916 }
1911 1917
1912 if (TT.isOSDarwin()) 1918 if (TT.isOSDarwin())
1913 EmitDarwinBCHeaderAndTrailer(Buffer, TT); 1919 EmitDarwinBCHeaderAndTrailer(Buffer, TT);
1914 1920
1915 // Write the generated bitstream to "Out". 1921 // Write the generated bitstream to "Out".
1916 Out.write((char*)&Buffer.front(), Buffer.size()); 1922 Out.write((char*)&Buffer.front(), Buffer.size());
1917 } 1923 }
OLDNEW
« no previous file with comments | « lib/Bitcode/NaCl/Reader/NaClBitstreamReader.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698