Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(776)

Unified Diff: src/PNaClTranslator.cpp

Issue 916313004: Fix subzero translator to use new API for reporting errors. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Merged into master. Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | tests_lit/parse_errs/insertextract-err.ll » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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()) {
« no previous file with comments | « no previous file | tests_lit/parse_errs/insertextract-err.ll » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698