OLD | NEW |
---|---|
(Empty) | |
1 //===- NaClBitcodeMungeReader.cpp - Read bitcode record list ----*- C++ -*-===// | |
2 // | |
3 // The LLVM Compiler Infrastructure | |
4 // | |
5 // This file is distributed under the University of Illinois Open Source | |
6 // License. See LICENSE.TXT for details. | |
7 // | |
8 //===----------------------------------------------------------------------===// | |
9 // | |
10 // Implements bitcode reader for NaClBitcodeRecordList and NaClMungedBitcode. | |
jvoung (off chromium)
2015/05/05 00:27:23
extra space in " NaClMungedBitcode"
Karl
2015/05/05 22:38:03
Done.
| |
11 | |
12 #include "llvm/Bitcode/NaCl/NaClBitcodeMungeUtils.h" | |
13 | |
14 #include "llvm/Bitcode/NaCl/NaClBitcodeHeader.h" | |
15 #include "llvm/Support/MemoryBuffer.h" | |
16 | |
17 using namespace llvm; | |
18 | |
19 namespace { | |
20 | |
21 class BitcodeParser; | |
22 | |
23 // \brief The state associated with parsing a bitcode buffer. | |
24 class BitcodeParseState { | |
25 BitcodeParseState(const BitcodeParseState&) = delete; | |
26 BitcodeParseState &operator=(const BitcodeParseState&) = delete; | |
27 public: | |
28 // \brief Construct the bitcode parse state. | |
29 // | |
30 // \param Parser The parser used to parse the bitcode. | |
31 // \param[out] Records Filled with parsed records. | |
32 BitcodeParseState(BitcodeParser *Parser, | |
33 NaClBitcodeRecordList &Records); | |
34 | |
35 // List to read records into. | |
36 NaClBitcodeRecordList &Records; | |
37 // Listener use to get abbreviations as they are read. | |
jvoung (off chromium)
2015/05/05 00:27:23
"use to get" -> "used to get" ?
Karl
2015/05/05 22:38:04
Done.
| |
38 NaClBitcodeParserListener AbbrevListener; | |
39 // | |
jvoung (off chromium)
2015/05/05 00:27:23
Dangling "//"
Karl
2015/05/05 22:38:03
Done.
| |
40 }; | |
41 | |
42 // \brief The bitcode parser to extract bitcode records. | |
43 class BitcodeParser : public NaClBitcodeParser { | |
44 BitcodeParser(const BitcodeParser &) = delete; | |
45 BitcodeParser &operator=(const BitcodeParser&) = delete; | |
46 public: | |
47 // \brief Top-level constructor for a bitcode parser. | |
48 // | |
49 // \param Cursor The beginning position of the bitcode to parse. | |
50 // \param[out] Records Filled with parsed records. | |
51 BitcodeParser(NaClBitstreamCursor &Cursor, | |
52 NaClBitcodeRecordList &Records) | |
53 : NaClBitcodeParser(Cursor), | |
54 State(new BitcodeParseState(this, Records)) { | |
55 SetListener(&State->AbbrevListener); | |
56 } | |
57 | |
58 virtual ~BitcodeParser() override { | |
jvoung (off chromium)
2015/05/05 00:27:23
Only need one "override" and don't need "virtual"
Karl
2015/05/05 22:38:03
Done.
| |
59 if (EnclosingParser == nullptr) | |
60 delete State; | |
61 } | |
62 | |
63 bool ParseBlock(unsigned BlockID) override { | |
64 BitcodeParser NestedParser(BlockID, this); | |
65 return NestedParser.ParseThisBlock(); | |
66 } | |
67 | |
68 void EnterBlock(unsigned NumWords) override { | |
69 NaClRecordVector Values; | |
70 Values.push_back(GetBlockID()); | |
71 Values.push_back(Record.GetCursor().getAbbrevIDWidth()); | |
72 std::unique_ptr<NaClBitcodeAbbrevRecord> AbbrevRec( | |
73 new NaClBitcodeAbbrevRecord(naclbitc::ENTER_SUBBLOCK, | |
74 naclbitc::BLK_CODE_ENTER, | |
75 Values)); | |
76 State->Records.push_back(std::move(AbbrevRec)); | |
77 } | |
78 | |
79 void ExitBlock() override { | |
80 NaClRecordVector Values; | |
81 std::unique_ptr<NaClBitcodeAbbrevRecord> AbbrevRec( | |
82 new NaClBitcodeAbbrevRecord(naclbitc::END_BLOCK, | |
83 naclbitc::BLK_CODE_EXIT, | |
84 Values)); | |
85 State->Records.push_back(std::move(AbbrevRec)); | |
86 } | |
87 | |
88 void ProcessRecord() override { | |
89 std::unique_ptr<NaClBitcodeAbbrevRecord> AbbrevRec( | |
90 new NaClBitcodeAbbrevRecord(Record.GetAbbreviationIndex(), | |
91 Record.GetCode(), | |
92 Record.GetValues())); | |
93 State->Records.push_back(std::move(AbbrevRec)); | |
94 } | |
95 | |
96 void SetBID() override { | |
97 ProcessRecord(); | |
98 } | |
99 | |
100 void ProcessAbbreviation(unsigned BlockID, | |
101 NaClBitCodeAbbrev *Abbrev, | |
102 bool IsLocal) override { | |
103 ProcessRecord(); | |
104 } | |
105 | |
106 private: | |
107 // \brief Nested constructor for blocks within the bitcode buffer. | |
108 // | |
109 // \param BlockID The identifying constant associated with the block. | |
110 // \param EnclosingParser The bitcode parser parsing the enclosing block. | |
111 BitcodeParser(unsigned BlockID, BitcodeParser *EnclosingParser) | |
112 : NaClBitcodeParser(BlockID, EnclosingParser), | |
113 State(EnclosingParser->State) {} | |
114 | |
115 // The state of the bitcode parser. | |
116 BitcodeParseState* State; | |
117 }; | |
118 | |
119 BitcodeParseState::BitcodeParseState(BitcodeParser *Parser, | |
120 NaClBitcodeRecordList &Records) | |
121 : Records(Records), AbbrevListener(Parser) {} | |
122 | |
123 } // end of anonymous namespace | |
124 | |
125 void llvm::readNaClBitcodeRecordList( | |
126 NaClBitcodeRecordList &RecordList, | |
127 std::unique_ptr<MemoryBuffer> InputBuffer) { | |
128 if (InputBuffer->getBufferSize() % 4 != 0) | |
129 report_fatal_error("Bitcode stream must be a multiple of 4 bytes in length") ; | |
jvoung (off chromium)
2015/05/05 00:27:23
just a little too long for 80 cols
Karl
2015/05/05 22:38:03
Done.
| |
130 | |
131 const unsigned char *BufPtr = | |
132 (const unsigned char *) InputBuffer->getBufferStart(); | |
133 const unsigned char *EndBufPtr = BufPtr + InputBuffer->getBufferSize(); | |
134 const unsigned char *HeaderPtr = BufPtr; | |
135 | |
136 // Read header and verify it is good. | |
137 NaClBitcodeHeader Header; | |
138 if (Header.Read(HeaderPtr, EndBufPtr) || !Header.IsSupported()) | |
139 report_fatal_error("Invalid PNaCl bitcode header.\n"); | |
140 | |
141 NaClBitstreamReader Reader(BufPtr, EndBufPtr, Header.getHeaderSize()); | |
142 NaClBitstreamCursor Cursor(Reader); | |
143 | |
144 // Parse the bitcode buffer. | |
145 BitcodeParser Parser(Cursor, RecordList); | |
146 | |
147 while (!Parser.AtEndOfStream()) { | |
jvoung (off chromium)
2015/05/05 00:27:22
There are a couple of instances of code that are v
Karl
2015/05/05 22:38:03
The problem I discovered was that this pattern was
| |
148 if (Parser.Parse()) | |
149 report_fatal_error("Malformed records founds, unable to continue"); | |
150 } | |
151 } | |
152 | |
153 | |
154 NaClMungedBitcode::NaClMungedBitcode(std::unique_ptr<MemoryBuffer> InputBuffer) | |
155 : BaseRecords(new NaClBitcodeRecordList()) { | |
156 readNaClBitcodeRecordList(*BaseRecords, std::move(InputBuffer)); | |
157 } | |
OLD | NEW |