| 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 |