Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 //===-- NaClCompress.cpp - Bitcode (abbrev) compression -----------------===// | 1 //===-- NaClCompress.cpp - Bitcode (abbrev) compression -----------------===// |
| 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 // Analyzes the data in memory buffer, and determines what | 10 // Analyzes the data in memory buffer, and determines what |
| (...skipping 1140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1151 MemoryBuffer *MemBuf, | 1151 MemoryBuffer *MemBuf, |
| 1152 raw_ostream &Output, | 1152 raw_ostream &Output, |
| 1153 BlockAbbrevsMapType &BlockAbbrevsMap) { | 1153 BlockAbbrevsMapType &BlockAbbrevsMap) { |
| 1154 // TODO(kschimpf): The current code only extracts abbreviations | 1154 // TODO(kschimpf): The current code only extracts abbreviations |
| 1155 // defined in the bitcode file. This code needs to be updated to | 1155 // defined in the bitcode file. This code needs to be updated to |
| 1156 // collect data distributions and figure out better (global) | 1156 // collect data distributions and figure out better (global) |
| 1157 // abbreviations to use. | 1157 // abbreviations to use. |
| 1158 | 1158 |
| 1159 const unsigned char *BufPtr = (const unsigned char *)MemBuf->getBufferStart(); | 1159 const unsigned char *BufPtr = (const unsigned char *)MemBuf->getBufferStart(); |
| 1160 const unsigned char *EndBufPtr = BufPtr+MemBuf->getBufferSize(); | 1160 const unsigned char *EndBufPtr = BufPtr+MemBuf->getBufferSize(); |
| 1161 const unsigned char *HeaderPtr = BufPtr; | |
| 1161 | 1162 |
| 1162 // First read header and verify it is good. | 1163 // First read header and verify it is good. |
| 1163 NaClBitcodeHeader Header; | 1164 NaClBitcodeHeader Header; |
| 1164 if (Header.Read(BufPtr, EndBufPtr) || !Header.IsSupported()) | 1165 if (Header.Read(HeaderPtr, EndBufPtr) || !Header.IsSupported()) |
|
jvoung (off chromium)
2015/05/07 18:11:17
Should this check of Read vs IsSupported be split
Karl
2015/05/07 22:18:54
Good point. Changing.
| |
| 1165 return Error("Invalid PNaCl bitcode header"); | 1166 return Error("Invalid PNaCl bitcode header"); |
| 1166 | 1167 |
| 1167 // Create a bitstream reader to read the bitcode file. | 1168 // Create a bitstream reader to read the bitcode file. |
| 1168 NaClBitstreamReader StreamFile(BufPtr, EndBufPtr); | 1169 NaClBitstreamReader StreamFile(BufPtr, EndBufPtr, Header); |
| 1169 NaClBitstreamCursor Stream(StreamFile); | 1170 NaClBitstreamCursor Stream(StreamFile); |
| 1170 | 1171 |
| 1171 // Parse the the bitcode file. | 1172 // Parse the the bitcode file. |
| 1172 NaClAnalyzeParser Parser(Flags, Stream, BlockAbbrevsMap); | 1173 NaClAnalyzeParser Parser(Flags, Stream, BlockAbbrevsMap); |
| 1173 while (!Stream.AtEndOfStream()) { | 1174 while (!Stream.AtEndOfStream()) { |
| 1174 if (Parser.Parse()) return true; | 1175 if (Parser.Parse()) return true; |
| 1175 } | 1176 } |
| 1176 | 1177 |
| 1177 if (Flags.ShowAbbreviationFrequencies) | 1178 if (Flags.ShowAbbreviationFrequencies) |
| 1178 displayAbbreviationFrequencies(Output, Parser.BlockDist, BlockAbbrevsMap); | 1179 displayAbbreviationFrequencies(Output, Parser.BlockDist, BlockAbbrevsMap); |
| (...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1374 return Parser.ParseThisBlock(); | 1375 return Parser.ParseThisBlock(); |
| 1375 } | 1376 } |
| 1376 | 1377 |
| 1377 // Reads the bitcode in MemBuf, using the abbreviations in AbbrevsMap, | 1378 // Reads the bitcode in MemBuf, using the abbreviations in AbbrevsMap, |
| 1378 // and queues the selected abbrevations for each record into | 1379 // and queues the selected abbrevations for each record into |
| 1379 // AbbrevsQueueMap. | 1380 // AbbrevsQueueMap. |
| 1380 static bool chooseAbbrevs(MemoryBuffer *MemBuf, BlockAbbrevsMapType &AbbrevsMap, | 1381 static bool chooseAbbrevs(MemoryBuffer *MemBuf, BlockAbbrevsMapType &AbbrevsMap, |
| 1381 BlockAbbrevsQueueMap &AbbrevsQueueMap) { | 1382 BlockAbbrevsQueueMap &AbbrevsQueueMap) { |
| 1382 const unsigned char *BufPtr = (const unsigned char *)MemBuf->getBufferStart(); | 1383 const unsigned char *BufPtr = (const unsigned char *)MemBuf->getBufferStart(); |
| 1383 const unsigned char *EndBufPtr = BufPtr + MemBuf->getBufferSize(); | 1384 const unsigned char *EndBufPtr = BufPtr + MemBuf->getBufferSize(); |
| 1385 const unsigned char *HeaderPtr = BufPtr; | |
| 1384 | 1386 |
| 1385 // Read header. No verification is needed since AnalyzeBitcode has | 1387 // Read header. No verification is needed since AnalyzeBitcode has |
| 1386 // already checked it. | 1388 // already checked it. |
| 1387 NaClBitcodeHeader Header; | 1389 NaClBitcodeHeader Header; |
| 1388 if (Header.Read(BufPtr, EndBufPtr)) | 1390 if (Header.Read(HeaderPtr, EndBufPtr)) |
| 1389 return Error("Invalid PNaCl bitcode header"); | 1391 return Error("Invalid PNaCl bitcode header"); |
| 1390 | 1392 |
| 1391 // Create the bitcode reader. | 1393 // Create the bitcode reader. |
| 1392 NaClBitstreamReader StreamFile(BufPtr, EndBufPtr); | 1394 NaClBitstreamReader StreamFile(BufPtr, EndBufPtr, Header); |
| 1393 NaClBitstreamCursor Stream(StreamFile); | 1395 NaClBitstreamCursor Stream(StreamFile); |
| 1394 | 1396 |
| 1395 // Set up the parser. | 1397 // Set up the parser. |
| 1396 NaClAssignAbbrevsParser Parser(Stream, AbbrevsMap, AbbrevsQueueMap); | 1398 NaClAssignAbbrevsParser Parser(Stream, AbbrevsMap, AbbrevsQueueMap); |
| 1397 | 1399 |
| 1398 // Parse the bitcode and choose abbreviations for records. | 1400 // Parse the bitcode and choose abbreviations for records. |
| 1399 while (!Stream.AtEndOfStream()) { | 1401 while (!Stream.AtEndOfStream()) { |
| 1400 if (Parser.Parse()) { | 1402 if (Parser.Parse()) { |
| 1401 installFrequentlyUsedAbbrevs(AbbrevsMap, AbbrevsQueueMap); | 1403 installFrequentlyUsedAbbrevs(AbbrevsMap, AbbrevsQueueMap); |
| 1402 return true; | 1404 return true; |
| (...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1572 // Read in bitcode, and write it back out using the abbreviations in | 1574 // Read in bitcode, and write it back out using the abbreviations in |
| 1573 // BlockAbbrevsMap, from memory buffer MemBuf containing the input | 1575 // BlockAbbrevsMap, from memory buffer MemBuf containing the input |
| 1574 // bitcode file. The bitcode is copied to Output. | 1576 // bitcode file. The bitcode is copied to Output. |
| 1575 static bool copyBitcode(const NaClBitcodeCompressor::CompressFlags &Flags, | 1577 static bool copyBitcode(const NaClBitcodeCompressor::CompressFlags &Flags, |
| 1576 MemoryBuffer *MemBuf, raw_ostream &Output, | 1578 MemoryBuffer *MemBuf, raw_ostream &Output, |
| 1577 BlockAbbrevsMapType &BlockAbbrevsMap, | 1579 BlockAbbrevsMapType &BlockAbbrevsMap, |
| 1578 BlockAbbrevsQueueMap &AbbrevsQueueMap) { | 1580 BlockAbbrevsQueueMap &AbbrevsQueueMap) { |
| 1579 | 1581 |
| 1580 const unsigned char *BufPtr = (const unsigned char *)MemBuf->getBufferStart(); | 1582 const unsigned char *BufPtr = (const unsigned char *)MemBuf->getBufferStart(); |
| 1581 const unsigned char *EndBufPtr = BufPtr + MemBuf->getBufferSize(); | 1583 const unsigned char *EndBufPtr = BufPtr + MemBuf->getBufferSize(); |
| 1584 const unsigned char *HeaderPtr = BufPtr; | |
| 1582 | 1585 |
| 1583 // Read header. No verification is needed since AnalyzeBitcode has | 1586 // Read header. No verification is needed since AnalyzeBitcode has |
| 1584 // already checked it. | 1587 // already checked it. |
| 1585 NaClBitcodeHeader Header; | 1588 NaClBitcodeHeader Header; |
| 1586 if (Header.Read(BufPtr, EndBufPtr)) | 1589 if (Header.Read(HeaderPtr, EndBufPtr)) |
| 1587 return Error("Invalid PNaCl bitcode header"); | 1590 return Error("Invalid PNaCl bitcode header"); |
| 1588 | 1591 |
| 1589 // Create the bitcode reader. | 1592 // Create the bitcode reader. |
| 1590 NaClBitstreamReader StreamFile(BufPtr, EndBufPtr); | 1593 NaClBitstreamReader StreamFile(BufPtr, EndBufPtr, Header); |
| 1591 NaClBitstreamCursor Stream(StreamFile); | 1594 NaClBitstreamCursor Stream(StreamFile); |
| 1592 | 1595 |
| 1593 // Create the bitcode writer. | 1596 // Create the bitcode writer. |
| 1594 SmallVector<char, 0> OutputBuffer; | 1597 SmallVector<char, 0> OutputBuffer; |
| 1595 OutputBuffer.reserve(256 * 1024); | 1598 OutputBuffer.reserve(256 * 1024); |
| 1596 NaClBitstreamWriter StreamWriter(OutputBuffer); | 1599 NaClBitstreamWriter StreamWriter(OutputBuffer); |
| 1597 | 1600 |
| 1598 // Emit the file header. | 1601 // Emit the file header. |
| 1599 NaClWriteHeader(Header, StreamWriter); | 1602 NaClWriteHeader(Header, StreamWriter); |
| 1600 | 1603 |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1643 BlockAbbrevsQueueMap AbbrevsQueueMap; | 1646 BlockAbbrevsQueueMap AbbrevsQueueMap; |
| 1644 bool Result = true; | 1647 bool Result = true; |
| 1645 if (chooseAbbrevs(MemBuf, BlockAbbrevsMap, AbbrevsQueueMap)) | 1648 if (chooseAbbrevs(MemBuf, BlockAbbrevsMap, AbbrevsQueueMap)) |
| 1646 Result = false; | 1649 Result = false; |
| 1647 else if (copyBitcode(Flags, MemBuf, BitcodeOutput, BlockAbbrevsMap, | 1650 else if (copyBitcode(Flags, MemBuf, BitcodeOutput, BlockAbbrevsMap, |
| 1648 AbbrevsQueueMap)) | 1651 AbbrevsQueueMap)) |
| 1649 Result = false; | 1652 Result = false; |
| 1650 DeleteContainerSeconds(AbbrevsQueueMap); | 1653 DeleteContainerSeconds(AbbrevsQueueMap); |
| 1651 return Result; | 1654 return Result; |
| 1652 } | 1655 } |
| OLD | NEW |