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

Unified Diff: lib/Bitcode/NaCl/Reader/NaClBitcodeReader.h

Issue 770853002: Fix error reporting in the PNaCl bitcode reader. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-llvm.git@master
Patch Set: Fix typo. Created 6 years 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/IRReader/IRReader.h ('k') | lib/Bitcode/NaCl/Reader/NaClBitcodeReader.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: lib/Bitcode/NaCl/Reader/NaClBitcodeReader.h
diff --git a/lib/Bitcode/NaCl/Reader/NaClBitcodeReader.h b/lib/Bitcode/NaCl/Reader/NaClBitcodeReader.h
index 6001c2b3a7d6f819e6c5b2e1b252dc3665e8b884..2ea3ede537487445e316d07ba13a815dfb2067ca 100644
--- a/lib/Bitcode/NaCl/Reader/NaClBitcodeReader.h
+++ b/lib/Bitcode/NaCl/Reader/NaClBitcodeReader.h
@@ -128,6 +128,8 @@ class NaClBitcodeReader : public GVMaterializer {
NaClBitcodeHeader Header; // Header fields of the PNaCl bitcode file.
LLVMContext &Context;
Module *TheModule;
+ // If non-null, stream to write verbose errors to.
+ raw_ostream *Verbose;
PNaClAllowedIntrinsics AllowedIntrinsics;
std::unique_ptr<MemoryBuffer> Buffer;
std::unique_ptr<NaClBitstreamReader> StreamFile;
@@ -135,9 +137,6 @@ class NaClBitcodeReader : public GVMaterializer {
StreamingMemoryObject *LazyStreamer;
uint64_t NextUnreadBit;
bool SeenValueSymbolTable;
-
- std::string ErrorString;
-
std::vector<Type*> TypeList;
NaClBitcodeReaderValueList ValueList;
@@ -181,12 +180,33 @@ class NaClBitcodeReader : public GVMaterializer {
/// \brief Integer type use for PNaCl conversion of pointers.
Type *IntPtrType;
+ static const std::error_category &BitcodeErrorCategory();
+
public:
+
+ /// Types of errors reported.
+ enum ErrorType {
+ CouldNotFindFunctionInStream, // Unable to find function in bitcode stream.
+ InsufficientFunctionProtos,
+ InvalidBitstream, // Error in bitstream format.
+ InvalidConstantReference, // Bad constant reference.
+ InvalidInstructionWithNoBB, // No basic block for instruction.
+ InvalidMultipleBlocks, // Multiple blocks for a kind of block that should
+ // have only one.
+ InvalidRecord, // Record doesn't have expected size or structure.
+ InvalidSkippedBlock, // Unable to skip unknown block in bitcode file.
+ InvalidType, // Invalid type in record.
+ InvalidTypeForValue, // Type of value incorrect.
+ InvalidValue, // Invalid value in record.
+ MalformedBlock, // Unable to advance over block.
+ };
+
explicit NaClBitcodeReader(MemoryBuffer *buffer, LLVMContext &C,
- bool AcceptSupportedOnly = true)
- : Context(C), TheModule(0), AllowedIntrinsics(&C),
+ raw_ostream *Verbose,
+ bool AcceptSupportedOnly)
+ : Context(C), TheModule(nullptr), Verbose(Verbose), AllowedIntrinsics(&C),
Buffer(buffer),
- LazyStreamer(0), NextUnreadBit(0), SeenValueSymbolTable(false),
+ LazyStreamer(nullptr), NextUnreadBit(0), SeenValueSymbolTable(false),
ValueList(),
SeenFirstFunctionBody(false),
AcceptSupportedBitcodeOnly(AcceptSupportedOnly),
@@ -194,8 +214,9 @@ public:
}
explicit NaClBitcodeReader(StreamingMemoryObject *streamer,
LLVMContext &C,
- bool AcceptSupportedOnly = true)
- : Context(C), TheModule(0), AllowedIntrinsics(&C),
+ raw_ostream *Verbose,
+ bool AcceptSupportedOnly)
+ : Context(C), TheModule(nullptr), Verbose(Verbose), AllowedIntrinsics(&C),
Buffer(nullptr),
LazyStreamer(streamer), NextUnreadBit(0), SeenValueSymbolTable(false),
ValueList(),
@@ -216,15 +237,16 @@ public:
void Dematerialize(GlobalValue *GV) override;
void releaseBuffer() override;
- bool Error(const std::string &Str) {
- ErrorString = Str;
- return true;
+ std::error_code Error(ErrorType E) const {
+ return std::error_code(E, BitcodeErrorCategory());
}
- const std::string &getErrorString() const { return ErrorString; }
+
+ /// Generates the corresponding verbose Message, then generates error.
+ std::error_code Error(ErrorType E, const std::string &Message) const;
/// @brief Main interface to parsing a bitcode buffer.
/// @returns true if an error occurred.
- bool ParseBitcodeInto(Module *M);
+ std::error_code ParseBitcodeInto(Module *M);
private:
// Returns false if Header is acceptable.
@@ -304,25 +326,26 @@ private:
bool DeferInsertion = false);
/// \brief Install instruction I into basic block BB.
- bool InstallInstruction(BasicBlock *BB, Instruction *I);
+ std::error_code InstallInstruction(BasicBlock *BB, Instruction *I);
FunctionType *AddPointerTypesToIntrinsicType(StringRef Name,
FunctionType *FTy);
void AddPointerTypesToIntrinsicParams();
- bool ParseModule(bool Resume);
- bool ParseTypeTable();
- bool ParseTypeTableBody();
- bool ParseGlobalVars();
- bool ParseValueSymbolTable();
- bool ParseConstants();
- bool RememberAndSkipFunctionBody();
- bool ParseFunctionBody(Function *F);
- bool GlobalCleanup();
- bool InitStream();
- bool InitStreamFromBuffer();
- bool InitLazyStream();
- bool FindFunctionInStream(Function *F,
- DenseMap<Function*, uint64_t>::iterator DeferredFunctionInfoIterator);
+ std::error_code ParseModule(bool Resume);
+ std::error_code ParseTypeTable();
+ std::error_code ParseTypeTableBody();
+ std::error_code ParseGlobalVars();
+ std::error_code ParseValueSymbolTable();
+ std::error_code ParseConstants();
+ std::error_code RememberAndSkipFunctionBody();
+ std::error_code ParseFunctionBody(Function *F);
+ std::error_code GlobalCleanup();
+ std::error_code InitStream();
+ std::error_code InitStreamFromBuffer();
+ std::error_code InitLazyStream();
+ std::error_code FindFunctionInStream(
+ Function *F,
+ DenseMap<Function*, uint64_t>::iterator DeferredFunctionInfoIterator);
};
} // End llvm namespace
« no previous file with comments | « include/llvm/IRReader/IRReader.h ('k') | lib/Bitcode/NaCl/Reader/NaClBitcodeReader.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698