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

Side by Side 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 unified diff | 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 »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 //===- NaClBitcodeReader.h ------------------------------------*- C++ -*-===// 1 //===- NaClBitcodeReader.h ------------------------------------*- C++ -*-===//
2 // Internal NaClBitcodeReader implementation 2 // Internal NaClBitcodeReader implementation
3 // 3 //
4 // The LLVM Compiler Infrastructure 4 // The LLVM Compiler Infrastructure
5 // 5 //
6 // This file is distributed under the University of Illinois Open Source 6 // This file is distributed under the University of Illinois Open Source
7 // License. See LICENSE.TXT for details. 7 // License. See LICENSE.TXT for details.
8 // 8 //
9 //===----------------------------------------------------------------------===// 9 //===----------------------------------------------------------------------===//
10 // 10 //
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
121 // Assigns Idx to the given value, overwriting the existing entry 121 // Assigns Idx to the given value, overwriting the existing entry
122 // and possibly modifying the type of the entry. 122 // and possibly modifying the type of the entry.
123 void OverwriteValue(Value *V, unsigned Idx); 123 void OverwriteValue(Value *V, unsigned Idx);
124 }; 124 };
125 125
126 126
127 class NaClBitcodeReader : public GVMaterializer { 127 class NaClBitcodeReader : public GVMaterializer {
128 NaClBitcodeHeader Header; // Header fields of the PNaCl bitcode file. 128 NaClBitcodeHeader Header; // Header fields of the PNaCl bitcode file.
129 LLVMContext &Context; 129 LLVMContext &Context;
130 Module *TheModule; 130 Module *TheModule;
131 // If non-null, stream to write verbose errors to.
132 raw_ostream *Verbose;
131 PNaClAllowedIntrinsics AllowedIntrinsics; 133 PNaClAllowedIntrinsics AllowedIntrinsics;
132 std::unique_ptr<MemoryBuffer> Buffer; 134 std::unique_ptr<MemoryBuffer> Buffer;
133 std::unique_ptr<NaClBitstreamReader> StreamFile; 135 std::unique_ptr<NaClBitstreamReader> StreamFile;
134 NaClBitstreamCursor Stream; 136 NaClBitstreamCursor Stream;
135 StreamingMemoryObject *LazyStreamer; 137 StreamingMemoryObject *LazyStreamer;
136 uint64_t NextUnreadBit; 138 uint64_t NextUnreadBit;
137 bool SeenValueSymbolTable; 139 bool SeenValueSymbolTable;
138
139 std::string ErrorString;
140
141 std::vector<Type*> TypeList; 140 std::vector<Type*> TypeList;
142 NaClBitcodeReaderValueList ValueList; 141 NaClBitcodeReaderValueList ValueList;
143 142
144 // Holds information about each BasicBlock in the function being read. 143 // Holds information about each BasicBlock in the function being read.
145 struct BasicBlockInfo { 144 struct BasicBlockInfo {
146 // A basic block within the function being modeled. 145 // A basic block within the function being modeled.
147 BasicBlock *BB; 146 BasicBlock *BB;
148 // The set of generated conversions. 147 // The set of generated conversions.
149 DenseMap<NaClBitcodeReaderCast, CastInst*> CastMap; 148 DenseMap<NaClBitcodeReaderCast, CastInst*> CastMap;
150 // The set of generated conversions that were added for phi nodes, 149 // The set of generated conversions that were added for phi nodes,
(...skipping 23 matching lines...) Expand all
174 /// map contains info about where to find deferred function body in the 173 /// map contains info about where to find deferred function body in the
175 /// stream. 174 /// stream.
176 DenseMap<Function*, uint64_t> DeferredFunctionInfo; 175 DenseMap<Function*, uint64_t> DeferredFunctionInfo;
177 176
178 /// \brief True if we should only accept supported bitcode format. 177 /// \brief True if we should only accept supported bitcode format.
179 bool AcceptSupportedBitcodeOnly; 178 bool AcceptSupportedBitcodeOnly;
180 179
181 /// \brief Integer type use for PNaCl conversion of pointers. 180 /// \brief Integer type use for PNaCl conversion of pointers.
182 Type *IntPtrType; 181 Type *IntPtrType;
183 182
183 static const std::error_category &BitcodeErrorCategory();
184
184 public: 185 public:
186
187 /// Types of errors reported.
188 enum ErrorType {
189 CouldNotFindFunctionInStream, // Unable to find function in bitcode stream.
190 InsufficientFunctionProtos,
191 InvalidBitstream, // Error in bitstream format.
192 InvalidConstantReference, // Bad constant reference.
193 InvalidInstructionWithNoBB, // No basic block for instruction.
194 InvalidMultipleBlocks, // Multiple blocks for a kind of block that should
195 // have only one.
196 InvalidRecord, // Record doesn't have expected size or structure.
197 InvalidSkippedBlock, // Unable to skip unknown block in bitcode file.
198 InvalidType, // Invalid type in record.
199 InvalidTypeForValue, // Type of value incorrect.
200 InvalidValue, // Invalid value in record.
201 MalformedBlock, // Unable to advance over block.
202 };
203
185 explicit NaClBitcodeReader(MemoryBuffer *buffer, LLVMContext &C, 204 explicit NaClBitcodeReader(MemoryBuffer *buffer, LLVMContext &C,
186 bool AcceptSupportedOnly = true) 205 raw_ostream *Verbose,
187 : Context(C), TheModule(0), AllowedIntrinsics(&C), 206 bool AcceptSupportedOnly)
207 : Context(C), TheModule(nullptr), Verbose(Verbose), AllowedIntrinsics(&C),
188 Buffer(buffer), 208 Buffer(buffer),
189 LazyStreamer(0), NextUnreadBit(0), SeenValueSymbolTable(false), 209 LazyStreamer(nullptr), NextUnreadBit(0), SeenValueSymbolTable(false),
190 ValueList(), 210 ValueList(),
191 SeenFirstFunctionBody(false), 211 SeenFirstFunctionBody(false),
192 AcceptSupportedBitcodeOnly(AcceptSupportedOnly), 212 AcceptSupportedBitcodeOnly(AcceptSupportedOnly),
193 IntPtrType(IntegerType::get(C, PNaClIntPtrTypeBitSize)) { 213 IntPtrType(IntegerType::get(C, PNaClIntPtrTypeBitSize)) {
194 } 214 }
195 explicit NaClBitcodeReader(StreamingMemoryObject *streamer, 215 explicit NaClBitcodeReader(StreamingMemoryObject *streamer,
196 LLVMContext &C, 216 LLVMContext &C,
197 bool AcceptSupportedOnly = true) 217 raw_ostream *Verbose,
198 : Context(C), TheModule(0), AllowedIntrinsics(&C), 218 bool AcceptSupportedOnly)
219 : Context(C), TheModule(nullptr), Verbose(Verbose), AllowedIntrinsics(&C),
199 Buffer(nullptr), 220 Buffer(nullptr),
200 LazyStreamer(streamer), NextUnreadBit(0), SeenValueSymbolTable(false), 221 LazyStreamer(streamer), NextUnreadBit(0), SeenValueSymbolTable(false),
201 ValueList(), 222 ValueList(),
202 SeenFirstFunctionBody(false), 223 SeenFirstFunctionBody(false),
203 AcceptSupportedBitcodeOnly(AcceptSupportedOnly), 224 AcceptSupportedBitcodeOnly(AcceptSupportedOnly),
204 IntPtrType(IntegerType::get(C, PNaClIntPtrTypeBitSize)) { 225 IntPtrType(IntegerType::get(C, PNaClIntPtrTypeBitSize)) {
205 } 226 }
206 ~NaClBitcodeReader() override { 227 ~NaClBitcodeReader() override {
207 FreeState(); 228 FreeState();
208 } 229 }
209 230
210 void FreeState(); 231 void FreeState();
211 232
212 bool isMaterializable(const GlobalValue *GV) const override; 233 bool isMaterializable(const GlobalValue *GV) const override;
213 bool isDematerializable(const GlobalValue *GV) const override; 234 bool isDematerializable(const GlobalValue *GV) const override;
214 std::error_code Materialize(GlobalValue *GV) override; 235 std::error_code Materialize(GlobalValue *GV) override;
215 std::error_code MaterializeModule(Module *M) override; 236 std::error_code MaterializeModule(Module *M) override;
216 void Dematerialize(GlobalValue *GV) override; 237 void Dematerialize(GlobalValue *GV) override;
217 void releaseBuffer() override; 238 void releaseBuffer() override;
218 239
219 bool Error(const std::string &Str) { 240 std::error_code Error(ErrorType E) const {
220 ErrorString = Str; 241 return std::error_code(E, BitcodeErrorCategory());
221 return true;
222 } 242 }
223 const std::string &getErrorString() const { return ErrorString; } 243
244 /// Generates the corresponding verbose Message, then generates error.
245 std::error_code Error(ErrorType E, const std::string &Message) const;
224 246
225 /// @brief Main interface to parsing a bitcode buffer. 247 /// @brief Main interface to parsing a bitcode buffer.
226 /// @returns true if an error occurred. 248 /// @returns true if an error occurred.
227 bool ParseBitcodeInto(Module *M); 249 std::error_code ParseBitcodeInto(Module *M);
228 250
229 private: 251 private:
230 // Returns false if Header is acceptable. 252 // Returns false if Header is acceptable.
231 bool AcceptHeader() const { 253 bool AcceptHeader() const {
232 return !(Header.IsSupported() || 254 return !(Header.IsSupported() ||
233 (!AcceptSupportedBitcodeOnly && Header.IsReadable())); 255 (!AcceptSupportedBitcodeOnly && Header.IsReadable()));
234 } 256 }
235 uint32_t GetPNaClVersion() const { 257 uint32_t GetPNaClVersion() const {
236 return Header.GetPNaClVersion(); 258 return Header.GetPNaClVersion();
237 } 259 }
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
297 Value *ConvertOpToType(Value *Op, Type *T, unsigned BBIndex); 319 Value *ConvertOpToType(Value *Op, Type *T, unsigned BBIndex);
298 320
299 /// \brief If Op is a scalar value, this is a nop. If Op is a 321 /// \brief If Op is a scalar value, this is a nop. If Op is a
300 /// pointer value, a PtrToInt instruction is inserted (in BBIndex) 322 /// pointer value, a PtrToInt instruction is inserted (in BBIndex)
301 /// to convert Op to an integer. For defaults on DeferInsertion, 323 /// to convert Op to an integer. For defaults on DeferInsertion,
302 /// see comments for method CreateCast. 324 /// see comments for method CreateCast.
303 Value *ConvertOpToScalar(Value *Op, unsigned BBIndex, 325 Value *ConvertOpToScalar(Value *Op, unsigned BBIndex,
304 bool DeferInsertion = false); 326 bool DeferInsertion = false);
305 327
306 /// \brief Install instruction I into basic block BB. 328 /// \brief Install instruction I into basic block BB.
307 bool InstallInstruction(BasicBlock *BB, Instruction *I); 329 std::error_code InstallInstruction(BasicBlock *BB, Instruction *I);
308 330
309 FunctionType *AddPointerTypesToIntrinsicType(StringRef Name, 331 FunctionType *AddPointerTypesToIntrinsicType(StringRef Name,
310 FunctionType *FTy); 332 FunctionType *FTy);
311 void AddPointerTypesToIntrinsicParams(); 333 void AddPointerTypesToIntrinsicParams();
312 bool ParseModule(bool Resume); 334 std::error_code ParseModule(bool Resume);
313 bool ParseTypeTable(); 335 std::error_code ParseTypeTable();
314 bool ParseTypeTableBody(); 336 std::error_code ParseTypeTableBody();
315 bool ParseGlobalVars(); 337 std::error_code ParseGlobalVars();
316 bool ParseValueSymbolTable(); 338 std::error_code ParseValueSymbolTable();
317 bool ParseConstants(); 339 std::error_code ParseConstants();
318 bool RememberAndSkipFunctionBody(); 340 std::error_code RememberAndSkipFunctionBody();
319 bool ParseFunctionBody(Function *F); 341 std::error_code ParseFunctionBody(Function *F);
320 bool GlobalCleanup(); 342 std::error_code GlobalCleanup();
321 bool InitStream(); 343 std::error_code InitStream();
322 bool InitStreamFromBuffer(); 344 std::error_code InitStreamFromBuffer();
323 bool InitLazyStream(); 345 std::error_code InitLazyStream();
324 bool FindFunctionInStream(Function *F, 346 std::error_code FindFunctionInStream(
325 DenseMap<Function*, uint64_t>::iterator DeferredFunctionInfoIterator); 347 Function *F,
348 DenseMap<Function*, uint64_t>::iterator DeferredFunctionInfoIterator);
326 }; 349 };
327 350
328 } // End llvm namespace 351 } // End llvm namespace
329 352
330 #endif 353 #endif
OLDNEW
« 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