From 0b41f88a8de25db50e1a57645a6e132954a6dcd2 Mon Sep 17 00:00:00 2001 From: Karl Schimpf Date: Mon, 22 Jul 2013 13:36:16 -0700 Subject: Enable ability to have multiple PNaCl wire format versions. Modifies PNaCl bitcode reader/writer to accept PNaClVersion=1 as supported, and all other versions are unsupported and unreadable. The PNaCl bitcode reader/writer will generate appropriate messages (including what version is unsupported if applicable). Also allows command-line option --pnacl-version for setting the PNaClVersion in the PNaCl bitcode writer. Also fixes some problems on PNaCl bitcode headers, using common support to determine when the read/written PNaCl bitcode file is valid. BUG=None R=jvoung@chromium.org Review URL: https://codereview.chromium.org/19400002 --- lib/Bitcode/NaCl/Reader/NaClBitcodeHeader.cpp | 6 +++++- lib/Bitcode/NaCl/Reader/NaClBitcodeReader.cpp | 2 +- lib/Bitcode/NaCl/Reader/NaClBitcodeReader.h | 9 ++++----- 3 files changed, 10 insertions(+), 7 deletions(-) (limited to 'lib/Bitcode/NaCl/Reader') diff --git a/lib/Bitcode/NaCl/Reader/NaClBitcodeHeader.cpp b/lib/Bitcode/NaCl/Reader/NaClBitcodeHeader.cpp index aa73b9cffa..2dd2af5dc3 100644 --- a/lib/Bitcode/NaCl/Reader/NaClBitcodeHeader.cpp +++ b/lib/Bitcode/NaCl/Reader/NaClBitcodeHeader.cpp @@ -249,8 +249,12 @@ void NaClBitcodeHeader::InstallFields() { if (PNaClVersion != 1) { IsSupportedFlag = false; IsReadableFlag = false; - UnsupportedMessage = "Unsupported Version"; UpdatedUnsupportedMessage = true; + UnsupportedMessage.clear(); + raw_string_ostream UnsupportedStream(UnsupportedMessage); + UnsupportedStream << "Unsupported PNaCl bitcode version: " + << PNaClVersion << "\n"; + UnsupportedStream.flush(); } if (Fields.size() != 1) { IsSupportedFlag = false; diff --git a/lib/Bitcode/NaCl/Reader/NaClBitcodeReader.cpp b/lib/Bitcode/NaCl/Reader/NaClBitcodeReader.cpp index 09a94c08cf..c7eb1ac683 100644 --- a/lib/Bitcode/NaCl/Reader/NaClBitcodeReader.cpp +++ b/lib/Bitcode/NaCl/Reader/NaClBitcodeReader.cpp @@ -1504,7 +1504,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 true; + if (InitStream()) return Error(Header.Unsupported()); // We expect a number of well-defined blocks, though we don't necessarily // need to understand them all. diff --git a/lib/Bitcode/NaCl/Reader/NaClBitcodeReader.h b/lib/Bitcode/NaCl/Reader/NaClBitcodeReader.h index 3b9d8982d5..fe7b5c1e9e 100644 --- a/lib/Bitcode/NaCl/Reader/NaClBitcodeReader.h +++ b/lib/Bitcode/NaCl/Reader/NaClBitcodeReader.h @@ -207,15 +207,11 @@ public: virtual bool MaterializeModule(Module *M, std::string *ErrInfo = 0); virtual void Dematerialize(GlobalValue *GV); - bool Error(const char *Str) { - ErrorString = Str; - return true; - } bool Error(const std::string &Str) { ErrorString = Str; return true; } - const char *getErrorString() const { return ErrorString.c_str(); } + const std::string &getErrorString() const { return ErrorString; } /// @brief Main interface to parsing a bitcode buffer. /// @returns true if an error occurred. @@ -227,6 +223,9 @@ private: return !(Header.IsSupported() || (!AcceptSupportedBitcodeOnly && Header.IsReadable())); } + uint32_t GetPNaClVersion() const { + return Header.GetPNaClVersion(); + } Type *getTypeByID(unsigned ID); // Returns the value associated with ID. The value must already exist, // or a forward referenced value created by getOrCreateFnVaueByID. -- cgit v1.2.3-70-g09d2