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

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 nits. 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
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..93a86a8925cced3fc23fbb039e9c107e7816aec4 100644
--- a/lib/Bitcode/NaCl/Reader/NaClBitcodeReader.h
+++ b/lib/Bitcode/NaCl/Reader/NaClBitcodeReader.h
@@ -128,6 +128,7 @@ class NaClBitcodeReader : public GVMaterializer {
NaClBitcodeHeader Header; // Header fields of the PNaCl bitcode file.
LLVMContext &Context;
Module *TheModule;
+ bool Verbose; // True if error messages should be printed to errs()
PNaClAllowedIntrinsics AllowedIntrinsics;
std::unique_ptr<MemoryBuffer> Buffer;
std::unique_ptr<NaClBitstreamReader> StreamFile;
@@ -135,9 +136,6 @@ class NaClBitcodeReader : public GVMaterializer {
StreamingMemoryObject *LazyStreamer;
uint64_t NextUnreadBit;
bool SeenValueSymbolTable;
-
- std::string ErrorString;
-
std::vector<Type*> TypeList;
NaClBitcodeReaderValueList ValueList;
@@ -181,10 +179,29 @@ 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 {
+ InvalidBBForInstruction, // No basic block for instruction.
jvoung (off chromium) 2014/12/01 23:23:50 Is this the same as InvalidInstructionWithNoBB in
Karl 2014/12/03 18:32:09 Yes. I didn't like the name. However, it probably
+ InvalidBitstream, // Error in bitstream format.
+ InvalidConstantReference, // Bad constant reference.
+ InvalidMultipleBlocks, // Multiple blocks for a kind of block that should
+ // have only one.
+ InvalidRecord, // Record doesn't have expected size or structure.
+ InvalidType, // Invalid type in record.
+ InvalidTypeForValue, // Type of value incorrect.
+ InvalidValue, // Invalid value in record.
+ MalformedBlock, // Unable to advance over block.
+ NoFunctionInStream, // Unable to find function in bitcode stream.
jvoung (off chromium) 2014/12/01 23:23:50 Is this the same as "CouldNotFindFunctionInStream"
Karl 2014/12/03 18:32:09 Like above, changing to CouldNotFindFunctionInStre
+ };
+
explicit NaClBitcodeReader(MemoryBuffer *buffer, LLVMContext &C,
- bool AcceptSupportedOnly = true)
- : Context(C), TheModule(0), AllowedIntrinsics(&C),
+ bool Verbose,
+ bool AcceptSupportedOnly)
+ : Context(C), TheModule(0), Verbose(Verbose), AllowedIntrinsics(&C),
jvoung (off chromium) 2014/12/01 23:23:49 nullptr instead of 0
Karl 2014/12/03 18:32:09 Done.
Buffer(buffer),
LazyStreamer(0), NextUnreadBit(0), SeenValueSymbolTable(false),
jvoung (off chromium) 2014/12/01 23:23:49 LazyStreamer(nullptr)
Karl 2014/12/03 18:32:09 Done.
ValueList(),
@@ -194,8 +211,9 @@ public:
}
explicit NaClBitcodeReader(StreamingMemoryObject *streamer,
LLVMContext &C,
- bool AcceptSupportedOnly = true)
- : Context(C), TheModule(0), AllowedIntrinsics(&C),
+ bool Verbose,
+ bool AcceptSupportedOnly)
+ : Context(C), TheModule(0), Verbose(Verbose), AllowedIntrinsics(&C),
jvoung (off chromium) 2014/12/01 23:23:50 TheModule(nullptr), etc.
Karl 2014/12/03 18:32:09 Done.
Buffer(nullptr),
LazyStreamer(streamer), NextUnreadBit(0), SeenValueSymbolTable(false),
ValueList(),
@@ -216,15 +234,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 +323,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

Powered by Google App Engine
This is Rietveld 408576698