Index: lib/Bitcode/NaCl/Reader/NaClBitcodeHeader.cpp |
diff --git a/lib/Bitcode/NaCl/Reader/NaClBitcodeHeader.cpp b/lib/Bitcode/NaCl/Reader/NaClBitcodeHeader.cpp |
index 06f346e3314616b051cf156e3e04df66c93a18be..dfab1bb10e9552c7b05d531052aa0b4388c38500 100644 |
--- a/lib/Bitcode/NaCl/Reader/NaClBitcodeHeader.cpp |
+++ b/lib/Bitcode/NaCl/Reader/NaClBitcodeHeader.cpp |
@@ -10,6 +10,7 @@ |
#include "llvm/Bitcode/NaCl/NaClBitcodeHeader.h" |
#include "llvm/Bitcode/NaCl/NaClReaderWriter.h" |
+#include "llvm/Bitcode/ReaderWriter.h" |
#include "llvm/Support/ErrorHandling.h" |
#include "llvm/Support/Format.h" |
#include "llvm/Support/raw_ostream.h" |
@@ -118,7 +119,7 @@ std::string NaClBitcodeHeaderField::Contents() const { |
ss << "]"; |
break; |
default: |
- report_fatal_error("PNaCL bitcode file contains unknown field type"); |
+ report_fatal_error("PNaCl bitcode file contains unknown field type"); |
} |
return ss.str(); |
} |
@@ -140,13 +141,19 @@ bool NaClBitcodeHeader::ReadPrefix(const unsigned char *BufPtr, |
const unsigned char *BufEnd, |
unsigned &NumFields, unsigned &NumBytes) { |
// Must contain PEXE. |
- if (!isNaClBitcode(BufPtr, BufEnd)) |
+ if (!isNaClBitcode(BufPtr, BufEnd)) { |
+ UnsupportedMessage = "Invalid PNaCl bitcode header"; |
+ if (isBitcode(BufPtr, BufEnd)) { |
+ UnsupportedMessage += " (to run in Chrome, bitcode files must be " |
+ "finalized using pnacl-finalize)"; |
+ } |
return true; |
+ } |
BufPtr += WordSize; |
// Read #Fields and number of bytes needed for the header. |
if (BufPtr + WordSize > BufEnd) |
- return true; |
+ return UnsupportedError("Bitcode read failure"); |
NumFields = static_cast<unsigned>(BufPtr[0]) | |
(static_cast<unsigned>(BufPtr[1]) << 8); |
NumBytes = static_cast<unsigned>(BufPtr[2]) | |
@@ -165,7 +172,7 @@ bool NaClBitcodeHeader::ReadFields(const unsigned char *BufPtr, |
NaClBitcodeHeaderField *Field = new NaClBitcodeHeaderField(); |
Fields.push_back(Field); |
if (!Field->Read(BufPtr, BufEnd - BufPtr)) |
- return true; |
+ return UnsupportedError("Bitcode read failure"); |
size_t FieldSize = Field->GetTotalSize(); |
BufPtr += FieldSize; |
} |
@@ -177,11 +184,11 @@ bool NaClBitcodeHeader::Read(const unsigned char *&BufPtr, |
unsigned NumFields; |
unsigned NumBytes; |
if (ReadPrefix(BufPtr, BufEnd, NumFields, NumBytes)) |
- return true; |
+ return true; // ReadPrefix sets UnsupportedMessage |
BufPtr += 2 * WordSize; |
if (ReadFields(BufPtr, BufEnd, NumFields, NumBytes)) |
- return true; |
+ return true; // ReadFields sets UnsupportedMessage |
BufPtr += NumBytes; |
InstallFields(); |
return false; |
@@ -192,9 +199,10 @@ bool NaClBitcodeHeader::Read(StreamableMemoryObject *Bytes) { |
unsigned NumBytes; |
{ |
unsigned char Buffer[2 * WordSize]; |
- if (Bytes->readBytes(0, sizeof(Buffer), Buffer, NULL) || |
- ReadPrefix(Buffer, Buffer + sizeof(Buffer), NumFields, NumBytes)) |
- return true; |
+ if (Bytes->readBytes(0, sizeof(Buffer), Buffer, NULL)) |
+ return UnsupportedError("Bitcode read failure"); |
+ if (ReadPrefix(Buffer, Buffer + sizeof(Buffer), NumFields, NumBytes)) |
+ return true; // ReadPrefix sets UnsupportedMessage |
} |
uint8_t *Header = new uint8_t[NumBytes]; |
bool failed = |
@@ -202,7 +210,7 @@ bool NaClBitcodeHeader::Read(StreamableMemoryObject *Bytes) { |
ReadFields(Header, Header + NumBytes, NumFields, NumBytes); |
delete[] Header; |
if (failed) |
- return true; |
+ return UnsupportedError("Bitcode read failure"); |
InstallFields(); |
return false; |
} |