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

Side by Side Diff: lib/Bitcode/NaCl/Analysis/NaClBitcodeAnalyzer.cpp

Issue 986453002: Additional clean ups on errors in bitcode parsing. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-llvm.git@master
Patch Set: Fix comment. Created 5 years, 9 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 unified diff | Download patch
OLDNEW
1 //===-- NaClBitcodeAnalyzer.cpp - Bitcode Analyzer ------------------------===// 1 //===-- NaClBitcodeAnalyzer.cpp - Bitcode Analyzer ------------------------===//
2 // 2 //
3 // The LLVM Compiler Infrastructure 3 // The LLVM Compiler Infrastructure
4 // 4 //
5 // This file is distributed under the University of Illinois Open Source 5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details. 6 // License. See LICENSE.TXT for details.
7 // 7 //
8 //===----------------------------------------------------------------------===// 8 //===----------------------------------------------------------------------===//
9 9
10 #define DEBUG_TYPE "nacl-bitcode-analyzer" 10 #define DEBUG_TYPE "nacl-bitcode-analyzer"
(...skipping 12 matching lines...) Expand all
23 #include "llvm/Support/MemoryBuffer.h" 23 #include "llvm/Support/MemoryBuffer.h"
24 #include "llvm/Support/raw_ostream.h" 24 #include "llvm/Support/raw_ostream.h"
25 #include <algorithm> 25 #include <algorithm>
26 #include <map> 26 #include <map>
27 #include <system_error> 27 #include <system_error>
28 28
29 // TODO(kschimpf): Separate out into two bitcode parsers, one for 29 // TODO(kschimpf): Separate out into two bitcode parsers, one for
30 // dumping records, and one for collecting distribution stats for 30 // dumping records, and one for collecting distribution stats for
31 // printing. This should simplify the code. 31 // printing. This should simplify the code.
32 32
33 /// Error - All bitcode analysis errors go through this function, making this a 33 namespace {
34 /// good place to breakpoint if debugging. 34
35 static bool Error(const llvm::Twine &Err) { 35 // Generates an error message when outside parsing, and no
36 // corresponding bit position is known.
37 bool Error(const llvm::Twine &Err) {
36 llvm::errs() << Err << "\n"; 38 llvm::errs() << Err << "\n";
37 return true; 39 return true;
38 } 40 }
39 41
42 } // End of anonymous namespace.
43
40 namespace llvm { 44 namespace llvm {
41 45
42 // Parses all bitcode blocks, and collects distribution of records in 46 // Parses all bitcode blocks, and collects distribution of records in
43 // each block. Also dumps bitcode structure if specified (via global 47 // each block. Also dumps bitcode structure if specified (via global
44 // variables). 48 // variables).
45 class PNaClBitcodeAnalyzerParser : public NaClBitcodeParser { 49 class PNaClBitcodeAnalyzerParser : public NaClBitcodeParser {
46 public: 50 public:
47 PNaClBitcodeAnalyzerParser(NaClBitstreamCursor &Cursor, 51 PNaClBitcodeAnalyzerParser(NaClBitstreamCursor &Cursor,
48 raw_ostream &OS, 52 raw_ostream &OS,
49 const AnalysisDumpOptions &DumpOptions, 53 const AnalysisDumpOptions &DumpOptions,
50 NaClBitcodeDist *Dist) 54 NaClBitcodeDist *Dist)
51 : NaClBitcodeParser(Cursor), 55 : NaClBitcodeParser(Cursor),
52 IndentLevel(0), 56 IndentLevel(0),
53 OS(OS), 57 OS(OS),
54 DumpOptions(DumpOptions), 58 DumpOptions(DumpOptions),
55 Dist(Dist), 59 Dist(Dist),
56 AbbrevListener(this) 60 AbbrevListener(this)
57 { 61 {
58 SetListener(&AbbrevListener); 62 SetListener(&AbbrevListener);
59 } 63 }
60 64
61 virtual ~PNaClBitcodeAnalyzerParser() {} 65 virtual ~PNaClBitcodeAnalyzerParser() {}
62 66
63 virtual bool Error(const std::string &Message) {
64 // Use local error routine so that all errors are treated uniformly.
65 return ::Error(Message);
66 }
67
68 virtual bool ParseBlock(unsigned BlockID); 67 virtual bool ParseBlock(unsigned BlockID);
69 68
70 // Returns the string defining the indentation to use with respect 69 // Returns the string defining the indentation to use with respect
71 // to the current indent level. 70 // to the current indent level.
72 const std::string &GetIndentation() { 71 const std::string &GetIndentation() {
73 size_t Size = IndentationCache.size(); 72 size_t Size = IndentationCache.size();
74 if (IndentLevel >= Size) { 73 if (IndentLevel >= Size) {
75 IndentationCache.resize(IndentLevel+1); 74 IndentationCache.resize(IndentLevel+1);
76 for (size_t i = Size; i <= IndentLevel; ++i) { 75 for (size_t i = Size; i <= IndentLevel; ++i) {
77 IndentationCache[i] = std::string(i*2, ' '); 76 IndentationCache[i] = std::string(i*2, ' ');
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after
240 Context->IndentLevel++; 239 Context->IndentLevel++;
241 Indent = Context->GetIndentation(); 240 Indent = Context->GetIndentation();
242 } 241 }
243 242
244 // Increment the indentation level for dumping. 243 // Increment the indentation level for dumping.
245 void DecrementIndent() { 244 void DecrementIndent() {
246 Context->IndentLevel--; 245 Context->IndentLevel--;
247 Indent = Context->GetIndentation(); 246 Indent = Context->GetIndentation();
248 } 247 }
249 248
250 virtual bool Error(const std::string &Message) {
251 // Use local error routine so that all errors are treated uniformly.
252 return ::Error(Message);
253 }
254
255 // Called once the block has been entered by the bitstream reader. 249 // Called once the block has been entered by the bitstream reader.
256 // Argument NumWords is set to the number of words in the 250 // Argument NumWords is set to the number of words in the
257 // corresponding block. 251 // corresponding block.
258 virtual void EnterBlock(unsigned NumberWords) { 252 virtual void EnterBlock(unsigned NumberWords) {
259 NumWords = NumberWords; 253 NumWords = NumberWords;
260 if (Context->DumpOptions.DumpRecords) { 254 if (Context->DumpOptions.DumpRecords) {
261 unsigned BlockID = GetBlockID(); 255 unsigned BlockID = GetBlockID();
262 EmitBeginStartTag(); 256 EmitBeginStartTag();
263 EmitEnterBlockTagName(BlockID); 257 EmitEnterBlockTagName(BlockID);
264 if (Context->DumpOptions.DumpDetails) { 258 if (Context->DumpOptions.DumpDetails) {
(...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after
466 ErrorOr<std::unique_ptr<MemoryBuffer>> ErrOrFile = 460 ErrorOr<std::unique_ptr<MemoryBuffer>> ErrOrFile =
467 MemoryBuffer::getFileOrSTDIN(InputFilename); 461 MemoryBuffer::getFileOrSTDIN(InputFilename);
468 if (std::error_code EC = ErrOrFile.getError()) 462 if (std::error_code EC = ErrOrFile.getError())
469 return Error(Twine("Error reading '") + InputFilename + "': " + 463 return Error(Twine("Error reading '") + InputFilename + "': " +
470 EC.message()); 464 EC.message());
471 465
472 return AnalyzeBitcodeInBuffer(ErrOrFile.get(), OS, DumpOptions); 466 return AnalyzeBitcodeInBuffer(ErrOrFile.get(), OS, DumpOptions);
473 } 467 }
474 468
475 } // namespace llvm 469 } // namespace llvm
OLDNEW
« no previous file with comments | « include/llvm/Bitcode/NaCl/NaClObjDumpStream.h ('k') | lib/Bitcode/NaCl/Analysis/NaClCompress.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698