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

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;
79
80 void initFromHeader(const NaClBitcodeHeader &Header) {
81 AlignBitcodeRecords = Header.getAlignBitcodeRecords();
82 }
83
73 public: 84 public:
74 NaClBitstreamReader() : InitialAddress(0) {} 85 NaClBitstreamReader() : InitialAddress(0) {}
75 86
76 NaClBitstreamReader(const unsigned char *Start, const unsigned char *End, 87 NaClBitstreamReader(const unsigned char *Start, const unsigned char *End,
77 size_t MyInitialAddress=0) { 88 size_t MyInitialAddress=0) {
78 InitialAddress = MyInitialAddress; 89 InitialAddress = MyInitialAddress;
jvoung (off chromium) 2015/05/07 18:11:17 This variant no longer calls init(Start, End) so B
Karl 2015/05/07 22:18:54 Bad refactoring on my part. Fixing to have both fo
79 init(Start, End); 90 }
91
92 NaClBitstreamReader(const unsigned char *Start, const unsigned char *End,
93 NaClBitcodeHeader &Header) {
jvoung (off chromium) 2015/05/07 18:11:17 Not a huge fan of having some many variants of the
Karl 2015/05/07 22:18:54 There are two reasons for multiple headers. The fi
jvoung (off chromium) 2015/05/08 17:55:01 Yeah it is definitely annoying to have to either s
Karl 2015/05/08 21:08:59 Looks reasonable, changing.
94 InitialAddress = Header.getHeaderSize();
95 init(Start, End, Header);
80 } 96 }
81 97
82 NaClBitstreamReader(MemoryObject *Bytes, size_t MyInitialAddress=0) 98 NaClBitstreamReader(MemoryObject *Bytes, size_t MyInitialAddress=0)
83 : InitialAddress(MyInitialAddress) { 99 : InitialAddress(MyInitialAddress) {
84 BitcodeBytes.reset(Bytes); 100 BitcodeBytes.reset(Bytes);
85 } 101 }
86 102
87 void init(const unsigned char *Start, const unsigned char *End) { 103 NaClBitstreamReader(MemoryObject *Bytes, NaClBitcodeHeader &Header)
104 : InitialAddress(Header.getHeaderSize()) {
105 BitcodeBytes.reset(Bytes);
106 initFromHeader(Header);
107 }
108
109 void init(const unsigned char *Start, const unsigned char *End,
110 NaClBitcodeHeader &Header) {
88 assert(((End-Start) & 3) == 0 &&"Bitcode stream not a multiple of 4 bytes"); 111 assert(((End-Start) & 3) == 0 &&"Bitcode stream not a multiple of 4 bytes");
89 BitcodeBytes.reset(getNonStreamedMemoryObject(Start, End)); 112 BitcodeBytes.reset(getNonStreamedMemoryObject(Start, End));
113 initFromHeader(Header);
90 } 114 }
91 115
92 MemoryObject &getBitcodeBytes() { return *BitcodeBytes; } 116 MemoryObject &getBitcodeBytes() { return *BitcodeBytes; }
93 117
94 ~NaClBitstreamReader() { 118 ~NaClBitstreamReader() {
95 // Free the BlockInfoRecords. 119 // Free the BlockInfoRecords.
96 while (!BlockInfoRecords.empty()) { 120 while (!BlockInfoRecords.empty()) {
97 BlockInfo &Info = BlockInfoRecords.back(); 121 BlockInfo &Info = BlockInfoRecords.back();
98 // Free blockinfo abbrev info. 122 // Free blockinfo abbrev info.
99 for (unsigned i = 0, e = static_cast<unsigned>(Info.Abbrevs.size()); 123 for (unsigned i = 0, e = static_cast<unsigned>(Info.Abbrevs.size());
(...skipping 409 matching lines...) Expand 10 before | Expand all | Expand 10 after
509 533
510 if ((Piece & (1U << (NumBits-1))) == 0) 534 if ((Piece & (1U << (NumBits-1))) == 0)
511 return Result; 535 return Result;
512 536
513 NextBit += NumBits-1; 537 NextBit += NumBits-1;
514 Piece = Read(NumBits); 538 Piece = Read(NumBits);
515 } 539 }
516 } 540 }
517 541
518 private: 542 private:
543 void SkipToByteBoundary() {
544 unsigned BitsToSkip = BitsInCurWord % CHAR_BIT;
545 if (BitsToSkip) {
546 CurWord >>= BitsToSkip;
547 BitsInCurWord -= BitsToSkip;
548 }
549 }
550
551 void SkipToByteBoundaryIfAligned() {
552 if (BitStream->AlignBitcodeRecords)
553 SkipToByteBoundary();
554 }
555
519 void SkipToFourByteBoundary() { 556 void SkipToFourByteBoundary() {
520 // If word_t is 64-bits and if we've read less than 32 bits, just dump 557 // 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. 558 // the bits we have up to the next 32-bit boundary.
522 if (sizeof(word_t) > 4 && 559 if (sizeof(word_t) > 4 &&
523 BitsInCurWord >= 32) { 560 BitsInCurWord >= 32) {
524 CurWord >>= BitsInCurWord-32; 561 CurWord >>= BitsInCurWord-32;
525 BitsInCurWord = 32; 562 BitsInCurWord = 32;
526 return; 563 return;
527 } 564 }
528 565
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
651 // Skips over an abbreviation record. Duplicates code of ReadAbbrevRecord, 688 // Skips over an abbreviation record. Duplicates code of ReadAbbrevRecord,
652 // except that no abbreviation is built. 689 // except that no abbreviation is built.
653 void SkipAbbrevRecord(); 690 void SkipAbbrevRecord();
654 691
655 bool ReadBlockInfoBlock(NaClAbbrevListener *Listener); 692 bool ReadBlockInfoBlock(NaClAbbrevListener *Listener);
656 }; 693 };
657 694
658 } // End llvm namespace 695 } // End llvm namespace
659 696
660 #endif 697 #endif
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698