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

Unified Diff: lib/Bitcode/NaCl/Analysis/NaClObjDump.cpp

Issue 932953002: Fix the NaCl bitstream reader to report fatal errors. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-llvm.git@master
Patch Set: Merge with 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 | « include/llvm/Bitcode/NaCl/NaClObjDumpStream.h ('k') | lib/Bitcode/NaCl/Analysis/NaClObjDumpStream.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: lib/Bitcode/NaCl/Analysis/NaClObjDump.cpp
diff --git a/lib/Bitcode/NaCl/Analysis/NaClObjDump.cpp b/lib/Bitcode/NaCl/Analysis/NaClObjDump.cpp
index c313eeb74e1e89589f23c068ce036ff58bebd3e3..d57caa9566ed92bddef4914df7eede2afebd7ff8 100644
--- a/lib/Bitcode/NaCl/Analysis/NaClObjDump.cpp
+++ b/lib/Bitcode/NaCl/Analysis/NaClObjDump.cpp
@@ -555,7 +555,6 @@ class NaClDisTopLevelParser : public NaClBitcodeParser {
public:
NaClDisTopLevelParser(NaClBitcodeHeader &Header,
- const unsigned char *HeaderBuffer,
NaClBitstreamCursor &Cursor,
naclbitc::ObjDumpStream &ObjDump)
: NaClBitcodeParser(Cursor),
@@ -566,7 +565,6 @@ public:
AllowedIntrinsics(&Mod.getContext()),
AssemblyFormatter(ObjDump),
Header(Header),
- HeaderBuffer(HeaderBuffer),
NumFunctions(0),
NumGlobals(0),
ExpectedNumGlobals(0),
@@ -591,21 +589,23 @@ public:
}
/// Generates an error with the given message.
- bool Error(const std::string &Message) override {
+ bool ErrorAt(uint64_t Bit, const std::string &Message) final {
// Use local error routine so that all errors are treated uniformly.
- ObjDump.Error() << Message << "\n";
+ ObjDump.Error(Bit) << Message << "\n";
return true;
}
/// Flushes out objdump and then exits with fatal error.
+ LLVM_ATTRIBUTE_NORETURN
void Fatal() {
- Fatal("");
+ NaClBitcodeParser::Fatal();
}
/// Flushes out objdump and then exits with fatal error, using
/// the given message.
- void Fatal(const std::string &Message) {
- ObjDump.Fatal(Message);
+ LLVM_ATTRIBUTE_NORETURN
+ void FatalAt(uint64_t Bit, const std::string &Message) final {
+ ObjDump.Fatal(Bit, Message);
}
/// Parses the top-level module block.
@@ -1120,8 +1120,6 @@ private:
AssemblyTextFormatter AssemblyFormatter;
// The header appearing before the beginning of the input stream.
NaClBitcodeHeader &Header;
- // Pointer to the buffer containing the header.
- const unsigned char *HeaderBuffer;
// The list of known types (index i defines the type associated with
// type index i).
std::vector<Type*> TypeIdType;
@@ -1371,8 +1369,8 @@ protected:
return Context->Fatal();
}
- void Fatal(const std::string &Message) {
- return Context->Fatal(Message);
+ void FatalAt(uint64_t Bit, const std::string &Message) override {
+ return Context->FatalAt(Bit, Message);
}
const std::string &GetAssemblyIndent() const {
@@ -3488,16 +3486,21 @@ void NaClDisModuleParser::ProcessRecord() {
}
bool NaClDisTopLevelParser::ParseBlock(unsigned BlockID) {
- // Before parsing top-level module block. Describe header.
- NaClBitcodeRecordData Record;
+ // Before parsing top-level module block. Describe header by
+ // reconstructing the corresponding header record.
+ NaClBitcodeRecordData HeaderRecord;
size_t HeaderSize = Header.getHeaderSize();
- Record.Code = naclbitc::BLK_CODE_HEADER;
+ HeaderRecord.Code = naclbitc::BLK_CODE_HEADER;
+ NaClBitstreamCursor &Cursor = Record.GetCursor();
+ uint64_t CurPos = Cursor.GetCurrentBitNo();
+ Cursor.JumpToBit(0);
for (size_t i = 0; i < HeaderSize; ++i) {
- Record.Values.push_back(HeaderBuffer[i]);
+ HeaderRecord.Values.push_back(Cursor.Read(CHAR_BIT));
}
+ Cursor.JumpToBit(CurPos);
if (ObjDump.GetDumpRecords() && ObjDump.GetDumpAssembly()) {
if (HeaderSize >= 4) {
- const NaClRecordVector &Values = Record.Values;
+ const NaClRecordVector &Values = HeaderRecord.Values;
Tokens() << "Magic" << Space() << "Number" << Colon()
<< Space() << StartCluster() << StartCluster() << "'"
<< (char) Values[0] << (char) Values[1]
@@ -3515,8 +3518,7 @@ bool NaClDisTopLevelParser::ParseBlock(unsigned BlockID) {
Tokens() << Header.GetField(i)->Contents() << Endline();
}
}
- ObjDump.Write(0, Record);
- ObjDump.SetStartOffset(HeaderSize * 8);
+ ObjDump.Write(0, HeaderRecord);
if (BlockID != naclbitc::MODULE_BLOCK_ID)
return Error("Module block expected at top-level, but not found");
@@ -3547,17 +3549,18 @@ bool NaClObjDump(MemoryBuffer *MemBuf, raw_ostream &Output,
// Read header and verify it is good.
NaClBitcodeHeader Header;
- if (Header.Read(BufPtr, EndBufPtr) || !Header.IsSupported()) {
+ if (Header.Read(HeaderPtr, EndBufPtr) || !Header.IsSupported()) {
ObjDump.Error() << "Invalid PNaCl bitcode header.\n";
return true;
}
// Create a bitstream reader to read the bitcode file.
- NaClBitstreamReader InputStreamFile(BufPtr, EndBufPtr);
+ NaClBitstreamReader InputStreamFile(BufPtr, EndBufPtr,
+ Header.getHeaderSize());
NaClBitstreamCursor InputStream(InputStreamFile);
// Parse the the bitcode file.
- ::NaClDisTopLevelParser Parser(Header, HeaderPtr, InputStream, ObjDump);
+ ::NaClDisTopLevelParser Parser(Header, InputStream, ObjDump);
int NumBlocksRead = 0;
bool ErrorsFound = false;
while (!InputStream.AtEndOfStream()) {
« no previous file with comments | « include/llvm/Bitcode/NaCl/NaClObjDumpStream.h ('k') | lib/Bitcode/NaCl/Analysis/NaClObjDumpStream.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698