OLD | NEW |
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 22 matching lines...) Expand all Loading... |
33 #include "llvm/Support/raw_ostream.h" | 33 #include "llvm/Support/raw_ostream.h" |
34 #include <cctype> | 34 #include <cctype> |
35 #include <map> | 35 #include <map> |
36 using namespace llvm; | 36 using namespace llvm; |
37 | 37 |
38 static cl::opt<unsigned> | 38 static cl::opt<unsigned> |
39 PNaClVersion("pnacl-version", | 39 PNaClVersion("pnacl-version", |
40 cl::desc("Specify PNaCl bitcode version to write"), | 40 cl::desc("Specify PNaCl bitcode version to write"), |
41 cl::init(2)); | 41 cl::init(2)); |
42 | 42 |
| 43 static cl::opt<bool> |
| 44 AlignBitcodeRecords("align-bitcode-records", |
| 45 cl::desc("Align bitcode records in PNaCl bitcode files (experimental)"), |
| 46 cl::init(false)); |
| 47 |
43 /// These are manifest constants used by the bitcode writer. They do | 48 /// These are manifest constants used by the bitcode writer. They do |
44 /// not need to be kept in sync with the reader, but need to be | 49 /// not need to be kept in sync with the reader, but need to be |
45 /// consistent within this file. | 50 /// consistent within this file. |
46 /// | 51 /// |
47 /// Note that for each block type GROUP, the last entry should be of | 52 /// Note that for each block type GROUP, the last entry should be of |
48 /// the form: | 53 /// the form: |
49 /// | 54 /// |
50 /// GROUP_MAX_ABBREV = GROUP_LAST_ABBREV, | 55 /// GROUP_MAX_ABBREV = GROUP_LAST_ABBREV, |
51 /// | 56 /// |
52 /// where GROUP_LAST_ABBREV is the last defined abbreviation. See | 57 /// where GROUP_LAST_ABBREV is the last defined abbreviation. See |
(...skipping 1114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1167 // Max size for variable fields. Currently only used for writing them | 1172 // Max size for variable fields. Currently only used for writing them |
1168 // out to files (the parsing works for arbitrary sizes). | 1173 // out to files (the parsing works for arbitrary sizes). |
1169 static const size_t kMaxVariableFieldSize = 256; | 1174 static const size_t kMaxVariableFieldSize = 256; |
1170 | 1175 |
1171 void llvm::NaClWriteHeader(NaClBitstreamWriter &Stream, | 1176 void llvm::NaClWriteHeader(NaClBitstreamWriter &Stream, |
1172 bool AcceptSupportedOnly) { | 1177 bool AcceptSupportedOnly) { |
1173 NaClBitcodeHeader Header; | 1178 NaClBitcodeHeader Header; |
1174 Header.push_back( | 1179 Header.push_back( |
1175 new NaClBitcodeHeaderField(NaClBitcodeHeaderField::kPNaClVersion, | 1180 new NaClBitcodeHeaderField(NaClBitcodeHeaderField::kPNaClVersion, |
1176 PNaClVersion)); | 1181 PNaClVersion)); |
| 1182 if (AlignBitcodeRecords) |
| 1183 Header.push_back(new NaClBitcodeHeaderField( |
| 1184 NaClBitcodeHeaderField::kAlignBitcodeRecords)); |
| 1185 |
1177 Header.InstallFields(); | 1186 Header.InstallFields(); |
1178 if (!(Header.IsSupported() || | 1187 if (!(Header.IsSupported() || |
1179 (!AcceptSupportedOnly && Header.IsReadable()))) { | 1188 (!AcceptSupportedOnly && Header.IsReadable()))) { |
1180 report_fatal_error(Header.Unsupported()); | 1189 report_fatal_error(Header.Unsupported()); |
1181 } | 1190 } |
1182 NaClWriteHeader(Header, Stream); | 1191 NaClWriteHeader(Header, Stream); |
1183 } | 1192 } |
1184 | 1193 |
1185 // Write out the given Header to the bitstream. | 1194 // Write out the given Header to the bitstream. |
1186 void llvm::NaClWriteHeader(const NaClBitcodeHeader &Header, | 1195 void llvm::NaClWriteHeader(const NaClBitcodeHeader &Header, |
1187 NaClBitstreamWriter &Stream) { | 1196 NaClBitstreamWriter &Stream) { |
| 1197 Stream.initFromHeader(Header); |
| 1198 |
1188 // Emit the file magic number; | 1199 // Emit the file magic number; |
1189 Stream.Emit((unsigned)'P', 8); | 1200 Stream.Emit((unsigned)'P', 8); |
1190 Stream.Emit((unsigned)'E', 8); | 1201 Stream.Emit((unsigned)'E', 8); |
1191 Stream.Emit((unsigned)'X', 8); | 1202 Stream.Emit((unsigned)'X', 8); |
1192 Stream.Emit((unsigned)'E', 8); | 1203 Stream.Emit((unsigned)'E', 8); |
1193 | 1204 |
1194 // Emit placeholder for number of bytes used to hold header fields. | 1205 // Emit placeholder for number of bytes used to hold header fields. |
1195 // This value is necessary so that the streamable reader can preallocate | 1206 // This value is necessary so that the streamable reader can preallocate |
1196 // a buffer to read the fields. | 1207 // a buffer to read the fields. |
1197 Stream.Emit(0, naclbitc::BlockSizeWidth); | 1208 Stream.Emit(0, naclbitc::BlockSizeWidth); |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1232 // Emit the module into the buffer. | 1243 // Emit the module into the buffer. |
1233 { | 1244 { |
1234 NaClBitstreamWriter Stream(Buffer); | 1245 NaClBitstreamWriter Stream(Buffer); |
1235 NaClWriteHeader(Stream, AcceptSupportedOnly); | 1246 NaClWriteHeader(Stream, AcceptSupportedOnly); |
1236 WriteModule(M, Stream); | 1247 WriteModule(M, Stream); |
1237 } | 1248 } |
1238 | 1249 |
1239 // Write the generated bitstream to "Out". | 1250 // Write the generated bitstream to "Out". |
1240 Out.write((char*)&Buffer.front(), Buffer.size()); | 1251 Out.write((char*)&Buffer.front(), Buffer.size()); |
1241 } | 1252 } |
OLD | NEW |