Chromium Code Reviews| Index: src/PNaClTranslator.cpp |
| diff --git a/src/PNaClTranslator.cpp b/src/PNaClTranslator.cpp |
| index 449332a3cbb6fe596457d6044b986b26426c8e9f..1948646a0c77015910c24e2290f9d11b3a6d53ee 100644 |
| --- a/src/PNaClTranslator.cpp |
| +++ b/src/PNaClTranslator.cpp |
| @@ -338,6 +338,9 @@ public: |
| return getGlobalVariableByID(Index - NumFunctionIds); |
| } |
| + /// Returns true if a module block has been parsed. |
| + bool parsedModuleBlock() const { return ParsedModuleBlock; } |
| + |
| /// Returns the list of parsed global variable declarations. Releases |
| /// ownership of the current list of global variables. Note: only returns |
| /// non-null pointer on first call. All successive calls return a null |
| @@ -374,6 +377,8 @@ private: |
| Ice::FuncSigType UndefinedFuncSigType; |
| // The block parser currently being applied. Used for error reporting. |
| BlockParserBaseClass *BlockParser = nullptr; |
| + // Defines if a module block has already been parsed. |
| + bool ParsedModuleBlock = false; |
| bool ParseBlock(unsigned BlockID) override; |
| @@ -3220,8 +3225,12 @@ void ModuleParser::ProcessRecord() { |
| bool TopLevelParser::ParseBlock(unsigned BlockID) { |
| if (BlockID == naclbitc::MODULE_BLOCK_ID) { |
| + if (ParsedModuleBlock) |
| + Fatal("Input can't contain more than one module"); |
| ModuleParser Parser(BlockID, this); |
| - return Parser.ParseThisBlock(); |
| + bool results = Parser.ParseThisBlock(); |
|
Jim Stichnoth
2015/09/22 17:33:43
capitalize Results.
Better yet, rename to somethi
Karl
2015/09/22 17:41:31
Used ParseFailed, since that is the context of the
|
| + ParsedModuleBlock = true; |
| + return results; |
| } |
| // Generate error message by using default block implementation. |
| BlockParserBaseClass Parser(BlockID, this); |
| @@ -3248,14 +3257,13 @@ void PNaClTranslator::translate(const std::string &IRFilename, |
| // need a hook to tell the IceBrowserCompileServer to unblock its |
| // QueueStreamer. |
| // https://code.google.com/p/nativeclient/issues/detail?id=4163 |
| - Ostream &ErrStream = getContext()->getStrError(); |
| // Read header and verify it is good. |
| NaClBitcodeHeader Header; |
| if (Header.Read(MemObj.get())) { |
| llvm::report_fatal_error("Invalid PNaCl bitcode header"); |
| } |
| if (!Header.IsSupported()) { |
| - ErrStream << Header.Unsupported(); |
| + getContext()->getStrError() << Header.Unsupported(); |
| if (!Header.IsReadable()) { |
| llvm::report_fatal_error("Invalid PNaCl bitcode header"); |
| } |
| @@ -3266,25 +3274,20 @@ void PNaClTranslator::translate(const std::string &IRFilename, |
| NaClBitstreamCursor InputStream(InputStreamFile); |
| TopLevelParser Parser(*this, InputStream, ErrorStatus); |
| - int TopLevelBlocks = 0; |
| while (!InputStream.AtEndOfStream()) { |
| if (Parser.Parse()) { |
| ErrorStatus.assign(EC_Bitcode); |
| return; |
| } |
| - ++TopLevelBlocks; |
| } |
| - if (TopLevelBlocks != 1) { |
| - ErrStream << IRFilename |
| - << ": Contains more than one module. Found: " << TopLevelBlocks |
| - << "\n"; |
| - llvm::report_fatal_error("Bitcode has more than one module"); |
| + if (!Parser.parsedModuleBlock()) { |
| + std::string Buffer; |
| + raw_string_ostream StrBuf(Buffer); |
| + StrBuf << IRFilename << ": Does not contain a module!"; |
| + llvm::report_fatal_error(StrBuf.str()); |
| } |
| if (InputStreamFile.getBitcodeBytes().getExtent() % 4 != 0) { |
| - ErrStream |
| - << IRFilename |
| - << ": Bitcode stream should be a multiple of 4 bytes in length.\n"; |
| llvm::report_fatal_error("Bitcode stream should be a multiple of 4 bytes"); |
| } |
| } |