OLD | NEW |
1 //===- NaClBitcodeHeader.cpp ----------------------------------------------===// | 1 //===- NaClBitcodeHeader.cpp ----------------------------------------------===// |
2 // PNaCl bitcode header reader. | 2 // PNaCl bitcode header reader. |
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 #include "llvm/Bitcode/NaCl/NaClBitcodeHeader.h" | 11 #include "llvm/Bitcode/NaCl/NaClBitcodeHeader.h" |
12 #include "llvm/Bitcode/NaCl/NaClReaderWriter.h" | 12 #include "llvm/Bitcode/NaCl/NaClReaderWriter.h" |
13 #include "llvm/Bitcode/ReaderWriter.h" | 13 #include "llvm/Bitcode/ReaderWriter.h" |
14 #include "llvm/Support/ErrorHandling.h" | 14 #include "llvm/Support/ErrorHandling.h" |
15 #include "llvm/Support/Format.h" | 15 #include "llvm/Support/Format.h" |
16 #include "llvm/Support/raw_ostream.h" | 16 #include "llvm/Support/raw_ostream.h" |
17 #include "llvm/Support/StreamableMemoryObject.h" | 17 #include "llvm/Support/StreamingMemoryObject.h" |
18 | 18 |
19 #include <limits> | 19 #include <limits> |
20 #include <cstring> | 20 #include <cstring> |
21 #include <iomanip> | 21 #include <iomanip> |
22 | 22 |
23 using namespace llvm; | 23 using namespace llvm; |
24 | 24 |
25 NaClBitcodeHeaderField::NaClBitcodeHeaderField() | 25 NaClBitcodeHeaderField::NaClBitcodeHeaderField() |
26 : ID(kInvalid), FType(kBufferType), Len(0), Data(0) {} | 26 : ID(kInvalid), FType(kBufferType), Len(0), Data(0) {} |
27 | 27 |
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
183 return true; // ReadPrefix sets UnsupportedMessage | 183 return true; // ReadPrefix sets UnsupportedMessage |
184 BufPtr += 2 * WordSize; | 184 BufPtr += 2 * WordSize; |
185 | 185 |
186 if (ReadFields(BufPtr, BufEnd, NumFields, NumBytes)) | 186 if (ReadFields(BufPtr, BufEnd, NumFields, NumBytes)) |
187 return true; // ReadFields sets UnsupportedMessage | 187 return true; // ReadFields sets UnsupportedMessage |
188 BufPtr += NumBytes; | 188 BufPtr += NumBytes; |
189 InstallFields(); | 189 InstallFields(); |
190 return false; | 190 return false; |
191 } | 191 } |
192 | 192 |
193 bool NaClBitcodeHeader::Read(StreamableMemoryObject *Bytes) { | 193 bool NaClBitcodeHeader::Read(MemoryObject *Bytes) { |
194 unsigned NumFields; | 194 unsigned NumFields; |
195 unsigned NumBytes; | 195 unsigned NumBytes; |
| 196 // First, read the prefix, which is 2 * WordSize, to determine the |
| 197 // NumBytes and NumFields. |
196 { | 198 { |
197 unsigned char Buffer[2 * WordSize]; | 199 unsigned char Buffer[2 * WordSize]; |
198 if (Bytes->readBytes(0, sizeof(Buffer), Buffer)) | 200 if (Bytes->readBytes(Buffer, sizeof(Buffer), 0) != sizeof(Buffer)) |
199 return UnsupportedError("Bitcode read failure"); | 201 return UnsupportedError("Bitcode read failure"); |
200 if (ReadPrefix(Buffer, Buffer + sizeof(Buffer), NumFields, NumBytes)) | 202 if (ReadPrefix(Buffer, Buffer + sizeof(Buffer), NumFields, NumBytes)) |
201 return true; // ReadPrefix sets UnsupportedMessage | 203 return true; // ReadPrefix sets UnsupportedMessage |
202 } | 204 } |
| 205 // Then read the rest, starting after the 2 * WordSize of the prefix. |
203 uint8_t *Header = new uint8_t[NumBytes]; | 206 uint8_t *Header = new uint8_t[NumBytes]; |
204 bool failed = | 207 bool failed = |
205 Bytes->readBytes(2 * WordSize, NumBytes, Header) || | 208 Bytes->readBytes(Header, NumBytes, 2 * WordSize) != NumBytes || |
206 ReadFields(Header, Header + NumBytes, NumFields, NumBytes); | 209 ReadFields(Header, Header + NumBytes, NumFields, NumBytes); |
207 delete[] Header; | 210 delete[] Header; |
208 if (failed) | 211 if (failed) |
209 return UnsupportedError("Bitcode read failure"); | 212 return UnsupportedError("Bitcode read failure"); |
210 InstallFields(); | 213 InstallFields(); |
211 return false; | 214 return false; |
212 } | 215 } |
213 | 216 |
214 NaClBitcodeHeaderField * | 217 NaClBitcodeHeaderField * |
215 NaClBitcodeHeader::GetTaggedField(NaClBitcodeHeaderField::Tag ID) const { | 218 NaClBitcodeHeader::GetTaggedField(NaClBitcodeHeaderField::Tag ID) const { |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
260 << PNaClVersion << "\n"; | 263 << PNaClVersion << "\n"; |
261 UnsupportedStream.flush(); | 264 UnsupportedStream.flush(); |
262 } | 265 } |
263 if (Fields.size() != 1) { | 266 if (Fields.size() != 1) { |
264 IsSupportedFlag = false; | 267 IsSupportedFlag = false; |
265 IsReadableFlag = false; | 268 IsReadableFlag = false; |
266 if (!UpdatedUnsupportedMessage) | 269 if (!UpdatedUnsupportedMessage) |
267 UnsupportedMessage = "Unknown header field(s) found"; | 270 UnsupportedMessage = "Unknown header field(s) found"; |
268 } | 271 } |
269 } | 272 } |
OLD | NEW |