From f8cb03fe2634ee927b3b6aa6ecbdd824cd0bc940 Mon Sep 17 00:00:00 2001 From: Derek Schuff Date: Fri, 13 Sep 2013 14:29:09 -0700 Subject: Report fatal translator errors to the browser Install a fatal error handler for the translator, which stores the error string, signals an error to the RPC thread, and terminates the thread (instead of terminating the whole program). This will cause the error to go to the Javascript console in Chrome BUG= https://code.google.com/p/nativeclient/issues/detail?id=3519 R=jvoung@chromium.org Review URL: https://codereview.chromium.org/23753003 --- lib/Bitcode/NaCl/Reader/NaClBitcodeHeader.cpp | 28 +++++++++++++++++---------- lib/Bitcode/NaCl/Reader/NaClBitcodeReader.cpp | 14 +++++++++----- 2 files changed, 27 insertions(+), 15 deletions(-) (limited to 'lib/Bitcode/NaCl') diff --git a/lib/Bitcode/NaCl/Reader/NaClBitcodeHeader.cpp b/lib/Bitcode/NaCl/Reader/NaClBitcodeHeader.cpp index 06f346e331..dfab1bb10e 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(BufPtr[0]) | (static_cast(BufPtr[1]) << 8); NumBytes = static_cast(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; } diff --git a/lib/Bitcode/NaCl/Reader/NaClBitcodeReader.cpp b/lib/Bitcode/NaCl/Reader/NaClBitcodeReader.cpp index 41acb6f999..e8ef0e6d9e 100644 --- a/lib/Bitcode/NaCl/Reader/NaClBitcodeReader.cpp +++ b/lib/Bitcode/NaCl/Reader/NaClBitcodeReader.cpp @@ -997,7 +997,7 @@ bool NaClBitcodeReader::ParseBitcodeInto(Module *M) { M->setDataLayout("e-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-" "f32:32:32-f64:64:64-p:32:32:32-v128:32:32"); - if (InitStream()) return Error(Header.Unsupported()); + if (InitStream()) return true; // InitSream will set the error string. // We expect a number of well-defined blocks, though we don't necessarily // need to understand them all. @@ -1772,22 +1772,26 @@ bool NaClBitcodeReader::InitStreamFromBuffer() { return Error("Bitcode stream should be a multiple of 4 bytes in length"); if (Header.Read(BufPtr, BufEnd)) - return Error("Invalid PNaCl bitcode header"); + return Error(Header.Unsupported()); StreamFile.reset(new NaClBitstreamReader(BufPtr, BufEnd)); Stream.init(*StreamFile); - return AcceptHeader(); + if (AcceptHeader()) + return Error(Header.Unsupported()); + return false; } bool NaClBitcodeReader::InitLazyStream() { StreamingMemoryObject *Bytes = new StreamingMemoryObject(LazyStreamer); if (Header.Read(Bytes)) - return Error("Invalid PNaCl bitcode header"); + return Error(Header.Unsupported()); StreamFile.reset(new NaClBitstreamReader(Bytes, Header.getHeaderSize())); Stream.init(*StreamFile); - return AcceptHeader(); + if (AcceptHeader()) + return Error(Header.Unsupported()); + return false; } //===----------------------------------------------------------------------===// -- cgit v1.2.3-70-g09d2