Index: src/PNaClTranslator.cpp |
diff --git a/src/PNaClTranslator.cpp b/src/PNaClTranslator.cpp |
index d4bcd8ee9e2c44959e80e7da58eb90c453aebea3..d0b099db28489a12f20f7522c5b597ccacc50854 100644 |
--- a/src/PNaClTranslator.cpp |
+++ b/src/PNaClTranslator.cpp |
@@ -162,9 +162,9 @@ class TopLevelParser : public NaClBitcodeParser { |
public: |
typedef std::vector<Ice::FunctionDeclaration *> FunctionDeclarationListType; |
- TopLevelParser(Ice::Translator &Translator, NaClBitcodeHeader &Header, |
- NaClBitstreamCursor &Cursor, Ice::ErrorCode &ErrorStatus) |
- : NaClBitcodeParser(Cursor), Translator(Translator), Header(Header), |
+ TopLevelParser(Ice::Translator &Translator, NaClBitstreamCursor &Cursor, |
+ Ice::ErrorCode &ErrorStatus) |
+ : NaClBitcodeParser(Cursor), Translator(Translator), |
ErrorStatus(ErrorStatus), NumErrors(0), NextDefiningFunctionID(0), |
VariableDeclarations(new Ice::VariableDeclarationList()), |
BlockParser(nullptr), StubbedConstCallValue(nullptr) {} |
@@ -177,19 +177,17 @@ public: |
BlockParser = NewBlockParser; |
} |
- // Generates error with given Message. Always returns true. |
- bool Error(const std::string &Message) override; |
+ /// Generates error with given Message, occurring at BitPosition |
+ /// within the bitcode file. Always returns true. |
+ bool ErrorAt(uint64_t BitPosition, const std::string &Message) final; |
- // Generates error message with respect to the current block parser. |
+ /// Generates error message with respect to the current block parser. |
bool BlockError(const std::string &Message); |
/// Returns the number of errors found while parsing the bitcode |
/// file. |
unsigned getNumErrors() const { return NumErrors; } |
- /// Returns the number of bytes in the bitcode header. |
- size_t getHeaderSize() const { return Header.getHeaderSize(); } |
- |
/// Changes the size of the type list to the given size. |
void resizeTypeIDValues(unsigned NewSize) { TypeIDValues.resize(NewSize); } |
@@ -243,8 +241,7 @@ public: |
FunctionDeclarationList[NextDefiningFunctionID]->isProto()) |
++NextDefiningFunctionID; |
if (NextDefiningFunctionID >= NumDeclaredFunctions) |
- report_fatal_error( |
- "More function blocks than defined function addresses"); |
+ Fatal("More function blocks than defined function addresses"); |
return NextDefiningFunctionID++; |
} |
@@ -361,8 +358,6 @@ public: |
private: |
// The translator associated with the parser. |
Ice::Translator &Translator; |
- // The bitcode header. |
- NaClBitcodeHeader &Header; |
// The exit status that should be set to true if an error occurs. |
Ice::ErrorCode &ErrorStatus; |
// The number of errors reported. |
@@ -505,16 +500,16 @@ private: |
Ice::Type convertToIceTypeError(Type *LLVMTy); |
}; |
-bool TopLevelParser::Error(const std::string &Message) { |
+bool TopLevelParser::ErrorAt(uint64_t Bit, const std::string &Message) { |
ErrorStatus.assign(Ice::EC_Bitcode); |
++NumErrors; |
Ice::GlobalContext *Context = Translator.getContext(); |
Ice::OstreamLocker L(Context); |
raw_ostream &OldErrStream = setErrStream(Context->getStrDump()); |
- NaClBitcodeParser::Error(Message); |
+ NaClBitcodeParser::ErrorAt(Bit, Message); |
setErrStream(OldErrStream); |
if (!Translator.getFlags().getAllowErrorRecovery()) |
- report_fatal_error("Unable to continue"); |
+ Fatal(); |
return true; |
} |
@@ -541,7 +536,7 @@ TopLevelParser::reportGetFunctionByIDError(unsigned ID) { |
// TODO(kschimpf) Remove error recovery once implementation complete. |
if (!FunctionDeclarationList.empty()) |
return FunctionDeclarationList[0]; |
- report_fatal_error("Unable to continue"); |
+ Fatal(); |
} |
Ice::VariableDeclaration * |
@@ -555,7 +550,7 @@ TopLevelParser::reportGetGlobalVariableByIDError(unsigned Index) { |
// TODO(kschimpf) Remove error recovery once implementation complete. |
if (!VariableDeclarations->empty()) |
return VariableDeclarations->at(0); |
- report_fatal_error("Unable to continue"); |
+ Fatal(); |
} |
Ice::Type TopLevelParser::convertToIceTypeError(Type *LLVMTy) { |
@@ -590,8 +585,8 @@ public: |
return "unknown"; |
} |
- // Generates an error Message with the bit address prefixed to it. |
- bool Error(const std::string &Message) override; |
+ // Generates an error Message with the Bit address prefixed to it. |
+ bool ErrorAt(uint64_t Bit, const std::string &Message) final; |
protected: |
// The context parser that contains the decoded state. |
@@ -678,12 +673,9 @@ bool TopLevelParser::BlockError(const std::string &Message) { |
} |
// Generates an error Message with the bit address prefixed to it. |
-bool BlockParserBaseClass::Error(const std::string &Message) { |
- uint64_t Bit = Record.GetStartBit() + Context->getHeaderSize() * 8; |
+bool BlockParserBaseClass::ErrorAt(uint64_t Bit, const std::string &Message) { |
std::string Buffer; |
raw_string_ostream StrBuf(Buffer); |
- StrBuf << "(" << format("%" PRIu64 ":%u", (Bit / 8), |
- static_cast<unsigned>(Bit % 8)) << ") "; |
// Note: If dump routines have been turned off, the error messages |
// will not be readable. Hence, replace with simple error. We also |
// use the simple form for unit tests. |
@@ -696,7 +688,7 @@ bool BlockParserBaseClass::Error(const std::string &Message) { |
} else { |
StrBuf << Message; |
} |
- return Context->Error(StrBuf.str()); |
+ return Context->ErrorAt(Bit, StrBuf.str()); |
} |
void BlockParserBaseClass::ReportRecordSizeError(unsigned ExpectedSize, |
@@ -1235,8 +1227,7 @@ public: |
std::string Buffer; |
raw_string_ostream StrBuf(Buffer); |
StrBuf << "Value index " << Index << " not defined!"; |
- Error(StrBuf.str()); |
- report_fatal_error("Unable to continue"); |
+ Fatal(StrBuf.str()); |
} |
Ice::Operand *Op = LocalOperands[LocalIndex]; |
if (Op == nullptr) { |
@@ -1245,8 +1236,7 @@ public: |
std::string Buffer; |
raw_string_ostream StrBuf(Buffer); |
StrBuf << "Value index " << Index << " not defined!"; |
- Error(StrBuf.str()); |
- report_fatal_error("Unable to continue"); |
+ Fatal(StrBuf.str()); |
} |
return Op; |
} |
@@ -3025,21 +3015,23 @@ void PNaClTranslator::translateBuffer(const std::string &IRFilename, |
} |
const unsigned char *BufPtr = (const unsigned char *)MemBuf->getBufferStart(); |
+ const unsigned char *HeaderPtr = BufPtr; |
const unsigned char *EndBufPtr = BufPtr + MemBuf->getBufferSize(); |
// Read header and verify it is good. |
NaClBitcodeHeader Header; |
- if (Header.Read(BufPtr, EndBufPtr) || !Header.IsSupported()) { |
+ if (Header.Read(HeaderPtr, EndBufPtr) || !Header.IsSupported()) { |
errs() << "Invalid PNaCl bitcode header.\n"; |
ErrorStatus.assign(EC_Bitcode); |
return; |
} |
// Create a bitstream reader to read the bitcode file. |
- NaClBitstreamReader InputStreamFile(BufPtr, EndBufPtr); |
+ NaClBitstreamReader InputStreamFile(BufPtr, EndBufPtr, |
+ Header.getHeaderSize()); |
NaClBitstreamCursor InputStream(InputStreamFile); |
- TopLevelParser Parser(*this, Header, InputStream, ErrorStatus); |
+ TopLevelParser Parser(*this, InputStream, ErrorStatus); |
int TopLevelBlocks = 0; |
while (!InputStream.AtEndOfStream()) { |
if (Parser.Parse()) { |