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

Side by Side Diff: include/llvm/Bitcode/NaCl/NaClBitstreamReader.h

Issue 1122423005: Add (unsupported experimental) feature allowing byte aligned bitcode. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-llvm.git@master
Patch Set: Fix nits. Created 5 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 //===- NaClBitstreamReader.h -----------------------------------*- C++ -*-===// 1 //===- NaClBitstreamReader.h -----------------------------------*- C++ -*-===//
2 // Low-level bitstream reader interface 2 // Low-level bitstream reader interface
3 // 3 //
4 // The LLVM Compiler Infrastructure 4 // The LLVM Compiler Infrastructure
5 // 5 //
6 // This file is distributed under the University of Illinois Open Source 6 // This file is distributed under the University of Illinois Open Source
7 // License. See LICENSE.TXT for details. 7 // License. See LICENSE.TXT for details.
8 // 8 //
9 //===----------------------------------------------------------------------===// 9 //===----------------------------------------------------------------------===//
10 // 10 //
11 // This header defines the BitstreamReader class. This class can be used to 11 // This header defines the BitstreamReader class. This class can be used to
12 // read an arbitrary bitstream, regardless of its contents. 12 // read an arbitrary bitstream, regardless of its contents.
13 // 13 //
14 //===----------------------------------------------------------------------===// 14 //===----------------------------------------------------------------------===//
15 15
16 #ifndef LLVM_BITCODE_NACL_NACLBITSTREAMREADER_H 16 #ifndef LLVM_BITCODE_NACL_NACLBITSTREAMREADER_H
17 #define LLVM_BITCODE_NACL_NACLBITSTREAMREADER_H 17 #define LLVM_BITCODE_NACL_NACLBITSTREAMREADER_H
18 18
19 #include "llvm/ADT/SmallVector.h" 19 #include "llvm/ADT/SmallVector.h"
20 #include "llvm/Bitcode/NaCl/NaClBitcodeHeader.h"
20 #include "llvm/Bitcode/NaCl/NaClLLVMBitCodes.h" 21 #include "llvm/Bitcode/NaCl/NaClLLVMBitCodes.h"
21 #include "llvm/Support/Endian.h" 22 #include "llvm/Support/Endian.h"
22 #include "llvm/Support/StreamingMemoryObject.h" 23 #include "llvm/Support/StreamingMemoryObject.h"
23 #include <climits> 24 #include <climits>
24 #include <vector> 25 #include <vector>
25 26
26 namespace llvm { 27 namespace llvm {
27 28
28 class Deserializer; 29 class Deserializer;
29 30
(...skipping 24 matching lines...) Expand all
54 /// the NaClBitstreamCursor class. 55 /// the NaClBitstreamCursor class.
55 class NaClBitstreamReader { 56 class NaClBitstreamReader {
56 public: 57 public:
57 /// This contains information emitted to BLOCKINFO_BLOCK blocks. These 58 /// This contains information emitted to BLOCKINFO_BLOCK blocks. These
58 /// describe abbreviations that all blocks of the specified ID inherit. 59 /// describe abbreviations that all blocks of the specified ID inherit.
59 struct BlockInfo { 60 struct BlockInfo {
60 unsigned BlockID; 61 unsigned BlockID;
61 std::vector<NaClBitCodeAbbrev*> Abbrevs; 62 std::vector<NaClBitCodeAbbrev*> Abbrevs;
62 }; 63 };
63 private: 64 private:
65 friend class NaClBitstreamCursor;
66
64 std::unique_ptr<MemoryObject> BitcodeBytes; 67 std::unique_ptr<MemoryObject> BitcodeBytes;
65 68
66 std::vector<BlockInfo> BlockInfoRecords; 69 std::vector<BlockInfo> BlockInfoRecords;
67 70
68 /// \brief Holds the offset of the first byte after the header. 71 /// \brief Holds the offset of the first byte after the header.
69 size_t InitialAddress; 72 size_t InitialAddress;
70 73
74 // True if filler should be added to byte align records.
75 bool AlignBitcodeRecords = false;
76
71 NaClBitstreamReader(const NaClBitstreamReader&) LLVM_DELETED_FUNCTION; 77 NaClBitstreamReader(const NaClBitstreamReader&) LLVM_DELETED_FUNCTION;
72 void operator=(const NaClBitstreamReader&) LLVM_DELETED_FUNCTION; 78 void operator=(const NaClBitstreamReader&) LLVM_DELETED_FUNCTION;
73 public:
74 NaClBitstreamReader() : InitialAddress(0) {}
75 79
76 NaClBitstreamReader(const unsigned char *Start, const unsigned char *End, 80 void initFromHeader(NaClBitcodeHeader &Header) {
77 size_t MyInitialAddress=0) { 81 InitialAddress = Header.getHeaderSize();
78 InitialAddress = MyInitialAddress; 82 AlignBitcodeRecords = Header.getAlignBitcodeRecords();
79 init(Start, End);
80 } 83 }
81 84
82 NaClBitstreamReader(MemoryObject *Bytes, size_t MyInitialAddress=0) 85 public:
83 : InitialAddress(MyInitialAddress) { 86 /// Read stream from sequence of bytes [Start .. End) after parsing
84 BitcodeBytes.reset(Bytes); 87 /// the given bitcode header.
88 NaClBitstreamReader(const unsigned char *Start, const unsigned char *End,
89 NaClBitcodeHeader &Header)
90 : BitcodeBytes(getNonStreamedMemoryObject(Start, End)) {
91 initFromHeader(Header);
85 } 92 }
86 93
87 void init(const unsigned char *Start, const unsigned char *End) { 94 /// Read stream from Bytes, after parsing the given bitcode header.
88 assert(((End-Start) & 3) == 0 &&"Bitcode stream not a multiple of 4 bytes"); 95 NaClBitstreamReader(MemoryObject *Bytes, NaClBitcodeHeader &Header)
89 BitcodeBytes.reset(getNonStreamedMemoryObject(Start, End)); 96 : BitcodeBytes(Bytes) {
97 initFromHeader(Header);
90 } 98 }
91 99
100 /// Read stream from bytes, starting at the given initial address.
101 /// Provides simple API for unit testing.
102 NaClBitstreamReader(MemoryObject *Bytes, size_t InitialAddress)
103 : BitcodeBytes(Bytes), InitialAddress(InitialAddress) {
104 }
105
106 // Returns the memory object that is being read.
92 MemoryObject &getBitcodeBytes() { return *BitcodeBytes; } 107 MemoryObject &getBitcodeBytes() { return *BitcodeBytes; }
93 108
94 ~NaClBitstreamReader() { 109 ~NaClBitstreamReader() {
95 // Free the BlockInfoRecords. 110 // Free the BlockInfoRecords.
96 while (!BlockInfoRecords.empty()) { 111 while (!BlockInfoRecords.empty()) {
97 BlockInfo &Info = BlockInfoRecords.back(); 112 BlockInfo &Info = BlockInfoRecords.back();
98 // Free blockinfo abbrev info. 113 // Free blockinfo abbrev info.
99 for (unsigned i = 0, e = static_cast<unsigned>(Info.Abbrevs.size()); 114 for (unsigned i = 0, e = static_cast<unsigned>(Info.Abbrevs.size());
100 i != e; ++i) 115 i != e; ++i)
101 Info.Abbrevs[i]->dropRef(); 116 Info.Abbrevs[i]->dropRef();
(...skipping 407 matching lines...) Expand 10 before | Expand all | Expand 10 after
509 524
510 if ((Piece & (1U << (NumBits-1))) == 0) 525 if ((Piece & (1U << (NumBits-1))) == 0)
511 return Result; 526 return Result;
512 527
513 NextBit += NumBits-1; 528 NextBit += NumBits-1;
514 Piece = Read(NumBits); 529 Piece = Read(NumBits);
515 } 530 }
516 } 531 }
517 532
518 private: 533 private:
534 void SkipToByteBoundary() {
535 unsigned BitsToSkip = BitsInCurWord % CHAR_BIT;
536 if (BitsToSkip) {
537 CurWord >>= BitsToSkip;
538 BitsInCurWord -= BitsToSkip;
539 }
540 }
541
542 void SkipToByteBoundaryIfAligned() {
543 if (BitStream->AlignBitcodeRecords)
544 SkipToByteBoundary();
545 }
546
519 void SkipToFourByteBoundary() { 547 void SkipToFourByteBoundary() {
520 // If word_t is 64-bits and if we've read less than 32 bits, just dump 548 // If word_t is 64-bits and if we've read less than 32 bits, just dump
521 // the bits we have up to the next 32-bit boundary. 549 // the bits we have up to the next 32-bit boundary.
522 if (sizeof(word_t) > 4 && 550 if (sizeof(word_t) > 4 &&
523 BitsInCurWord >= 32) { 551 BitsInCurWord >= 32) {
524 CurWord >>= BitsInCurWord-32; 552 CurWord >>= BitsInCurWord-32;
525 BitsInCurWord = 32; 553 BitsInCurWord = 32;
526 return; 554 return;
527 } 555 }
528 556
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
651 // Skips over an abbreviation record. Duplicates code of ReadAbbrevRecord, 679 // Skips over an abbreviation record. Duplicates code of ReadAbbrevRecord,
652 // except that no abbreviation is built. 680 // except that no abbreviation is built.
653 void SkipAbbrevRecord(); 681 void SkipAbbrevRecord();
654 682
655 bool ReadBlockInfoBlock(NaClAbbrevListener *Listener); 683 bool ReadBlockInfoBlock(NaClAbbrevListener *Listener);
656 }; 684 };
657 685
658 } // End llvm namespace 686 } // End llvm namespace
659 687
660 #endif 688 #endif
OLDNEW
« no previous file with comments | « include/llvm/Bitcode/NaCl/NaClBitcodeHeader.h ('k') | include/llvm/Bitcode/NaCl/NaClBitstreamWriter.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698