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

Side by Side Diff: lib/Bitcode/NaCl/Analysis/NaClObjDumpStream.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, 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
« no previous file with comments | « lib/Bitcode/NaCl/Analysis/NaClObjDump.cpp ('k') | lib/Bitcode/NaCl/Reader/NaClBitCodes.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 //===-- NaClObjDumpStream.cpp --------------------------------------------===// 1 //===-- NaClObjDumpStream.cpp --------------------------------------------===//
2 // Implements an objdump stream (bitcode records/assembly code). 2 // Implements an objdump stream (bitcode records/assembly code).
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
11 #include "llvm/ADT/STLExtras.h" 11 #include "llvm/ADT/STLExtras.h"
12 #include "llvm/Bitcode/NaCl/NaClObjDumpStream.h" 12 #include "llvm/Bitcode/NaCl/NaClObjDumpStream.h"
13 #include "llvm/Support/DataTypes.h" 13 #include "llvm/Support/DataTypes.h"
14 #include "llvm/Support/ErrorHandling.h" 14 #include "llvm/Support/ErrorHandling.h"
15 #include "llvm/Support/Format.h"
16 15
17 namespace llvm { 16 namespace llvm {
18 namespace naclbitc { 17 namespace naclbitc {
19 18
20 TextFormatter::TextFormatter(raw_ostream &BaseStream, 19 TextFormatter::TextFormatter(raw_ostream &BaseStream,
21 unsigned LineWidth, 20 unsigned LineWidth,
22 const char *Tab) 21 const char *Tab)
23 : TextIndenter(Tab), 22 : TextIndenter(Tab),
24 BaseStream(BaseStream), 23 BaseStream(BaseStream),
25 TextStream(TextBuffer), 24 TextStream(TextBuffer),
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
148 147
149 TextFormatter::Directive *TextFormatter::GetTokenDirective:: 148 TextFormatter::Directive *TextFormatter::GetTokenDirective::
150 Allocate(TextFormatter *Formatter, const std::string &Text) { 149 Allocate(TextFormatter *Formatter, const std::string &Text) {
151 GetTokenDirective *Dir = Formatter->GetTokenFreeList.Allocate(Formatter); 150 GetTokenDirective *Dir = Formatter->GetTokenFreeList.Allocate(Formatter);
152 Dir->Text = Text; 151 Dir->Text = Text;
153 return Dir; 152 return Dir;
154 } 153 }
155 154
156 RecordTextFormatter::RecordTextFormatter(ObjDumpStream *ObjDump) 155 RecordTextFormatter::RecordTextFormatter(ObjDumpStream *ObjDump)
157 : TextFormatter(ObjDump->Records(), 0, " "), 156 : TextFormatter(ObjDump->Records(), 0, " "),
158 ObjDump(ObjDump),
159 OpenBrace(this, "<"), 157 OpenBrace(this, "<"),
160 CloseBrace(this, ">"), 158 CloseBrace(this, ">"),
161 Comma(this, ","), 159 Comma(this, ","),
162 Space(this), 160 Space(this),
163 Endline(this), 161 Endline(this),
164 StartCluster(this), 162 StartCluster(this),
165 FinishCluster(this) { 163 FinishCluster(this) {
166 // Handle fact that 64-bit values can take up to 21 characters. 164 // Handle fact that 64-bit values can take up to 21 characters.
167 MinLineWidth = 21; 165 MinLineWidth = 21;
168 Label = RecordAddress(0); 166 Label = NaClBitstreamReader::getBitAddress(0, AddressWriteWidth);
169 }
170
171 std::string RecordTextFormatter::RecordAddress(uint64_t Bit,
172 unsigned MinByteWidth) {
173 std::string Buffer;
174 raw_string_ostream Stream(Buffer);
175 Stream << '%' << MinByteWidth << PRIu64 << ":%u";
176 Stream.flush();
177 std::string FormatString(Buffer);
178 Buffer.clear();
179 Stream << format(FormatString.c_str(),
180 (Bit / 8),
181 static_cast<unsigned>(Bit % 8));
182 return Stream.str();
183 } 167 }
184 168
185 std::string RecordTextFormatter::GetEmptyLabelColumn() { 169 std::string RecordTextFormatter::GetEmptyLabelColumn() {
186 std::string Buffer; 170 std::string Buffer;
187 raw_string_ostream StrmBuffer(Buffer); 171 raw_string_ostream StrmBuffer(Buffer);
188 for (size_t i = 0; i < Label.size(); ++i) { 172 for (size_t i = 0; i < Label.size(); ++i) {
189 StrmBuffer << ' '; 173 StrmBuffer << ' ';
190 } 174 }
191 StrmBuffer << '|'; 175 StrmBuffer << '|';
192 return StrmBuffer.str(); 176 return StrmBuffer.str();
193 } 177 }
194 178
195 void RecordTextFormatter::WriteLineIndents() { 179 void RecordTextFormatter::WriteLineIndents() {
196 if (AtInstructionBeginning) { 180 if (AtInstructionBeginning) {
197 BaseStream << Label << '|'; 181 BaseStream << Label << '|';
198 } else { 182 } else {
199 BaseStream << GetEmptyLabelColumn(); 183 BaseStream << GetEmptyLabelColumn();
200 } 184 }
201 LinePosition += Label.size() + 1; 185 LinePosition += Label.size() + 1;
202 TextFormatter::WriteLineIndents(); 186 TextFormatter::WriteLineIndents();
203 } 187 }
204 188
205 void RecordTextFormatter::WriteValues(uint64_t Bit, 189 void RecordTextFormatter::WriteValues(uint64_t Bit,
206 const llvm::NaClBitcodeValues &Values, 190 const llvm::NaClBitcodeValues &Values,
207 int32_t AbbrevIndex) { 191 int32_t AbbrevIndex) {
208 Label = ObjDump->RecordAddress(Bit); 192 Label = NaClBitstreamReader::getBitAddress(
193 Bit, RecordTextFormatter::AddressWriteWidth);
209 if (AbbrevIndex != ABBREV_INDEX_NOT_SPECIFIED) { 194 if (AbbrevIndex != ABBREV_INDEX_NOT_SPECIFIED) {
210 TextStream << AbbrevIndex << ":" << Space; 195 TextStream << AbbrevIndex << ":" << Space;
211 } 196 }
212 TextStream << OpenBrace; 197 TextStream << OpenBrace;
213 for (size_t i = 0; i < Values.size(); ++i) { 198 for (size_t i = 0; i < Values.size(); ++i) {
214 if (i > 0) { 199 if (i > 0) {
215 TextStream << Comma << FinishCluster << Space; 200 TextStream << Comma << FinishCluster << Space;
216 } 201 }
217 TextStream << StartCluster << Values[i]; 202 TextStream << StartCluster << Values[i];
218 } 203 }
219 // Note: Because of record codes, Values are never empty. Hence we 204 // Note: Because of record codes, Values are never empty. Hence we
220 // always need to finish the cluster for the last number printed. 205 // always need to finish the cluster for the last number printed.
221 TextStream << FinishCluster << CloseBrace << Endline; 206 TextStream << FinishCluster << CloseBrace << Endline;
222 } 207 }
223 208
224 unsigned ObjDumpStream::DefaultMaxErrors = 20; 209 unsigned ObjDumpStream::DefaultMaxErrors = 20;
225 210
226 unsigned ObjDumpStream::ComboObjDumpSeparatorColumn = 40; 211 unsigned ObjDumpStream::ComboObjDumpSeparatorColumn = 40;
227 212
228 unsigned ObjDumpStream::RecordObjectDumpLength = 80; 213 unsigned ObjDumpStream::RecordObjectDumpLength = 80;
229 214
230 ObjDumpStream::ObjDumpStream(raw_ostream &Stream, 215 ObjDumpStream::ObjDumpStream(raw_ostream &Stream,
231 bool DumpRecords, bool DumpAssembly) 216 bool DumpRecords, bool DumpAssembly)
232 : Stream(Stream), 217 : Stream(Stream),
233 DumpRecords(DumpRecords), 218 DumpRecords(DumpRecords),
234 DumpAssembly(DumpAssembly), 219 DumpAssembly(DumpAssembly),
235 NumErrors(0), 220 NumErrors(0),
236 MaxErrors(DefaultMaxErrors), 221 MaxErrors(DefaultMaxErrors),
237 RecordWidth(0), 222 RecordWidth(0),
238 StartOffset(0),
239 AssemblyBuffer(), 223 AssemblyBuffer(),
240 AssemblyStream(AssemblyBuffer), 224 AssemblyStream(AssemblyBuffer),
241 MessageBuffer(), 225 MessageBuffer(),
242 MessageStream(MessageBuffer), 226 MessageStream(MessageBuffer),
243 ColumnSeparator('|'), 227 ColumnSeparator('|'),
244 LastKnownBit(0), 228 LastKnownBit(0),
245 RecordBuffer(), 229 RecordBuffer(),
246 RecordStream(RecordBuffer), 230 RecordStream(RecordBuffer),
247 RecordFormatter(this) { 231 RecordFormatter(this) {
248 if (DumpRecords) { 232 if (DumpRecords) {
(...skipping 19 matching lines...) Expand all
268 Flush(); 252 Flush();
269 llvm::report_fatal_error("Unable to continue"); 253 llvm::report_fatal_error("Unable to continue");
270 } 254 }
271 255
272 void ObjDumpStream::Fatal(uint64_t Bit, 256 void ObjDumpStream::Fatal(uint64_t Bit,
273 const llvm::NaClBitcodeRecordData &Record, 257 const llvm::NaClBitcodeRecordData &Record,
274 const std::string &Message) { 258 const std::string &Message) {
275 LastKnownBit = Bit; 259 LastKnownBit = Bit;
276 PrintMessagePrefix("Error", Bit) << Message; 260 PrintMessagePrefix("Error", Bit) << Message;
277 Write(Bit, Record); 261 Write(Bit, Record);
262 Flush();
278 llvm::report_fatal_error("Unable to continue"); 263 llvm::report_fatal_error("Unable to continue");
279 } 264 }
280 265
281 // Dumps the next line of text in the buffer. Returns the number of characters 266 // Dumps the next line of text in the buffer. Returns the number of characters
282 // printed. 267 // printed.
283 static size_t DumpLine(raw_ostream &Stream, 268 static size_t DumpLine(raw_ostream &Stream,
284 const std::string &Buffer, 269 const std::string &Buffer,
285 size_t &Index, 270 size_t &Index,
286 size_t Size) { 271 size_t Size) {
287 size_t Count = 0; 272 size_t Count = 0;
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
336 Stream << '\n'; 321 Stream << '\n';
337 } 322 }
338 } 323 }
339 324
340 // Print out messages and reset buffers. 325 // Print out messages and reset buffers.
341 Stream << MessageBuffer; 326 Stream << MessageBuffer;
342 ResetBuffers(); 327 ResetBuffers();
343 if (NumErrors >= MaxErrors) { 328 if (NumErrors >= MaxErrors) {
344 // Note: we don't call Fatal here because that will call Flush, causing 329 // Note: we don't call Fatal here because that will call Flush, causing
345 // an infinite loop. 330 // an infinite loop.
346 Stream << "Error(" << ObjDumpAddress(LastKnownBit) 331 Stream << "Error(" << NaClBitstreamReader::getBitAddress(LastKnownBit)
347 << "): Too many errors\n"; 332 << "): Too many errors\n";
348 llvm::report_fatal_error("Unable to continue"); 333 llvm::report_fatal_error("Unable to continue");
349 } 334 }
350 Stream.flush(); 335 Stream.flush();
351 } 336 }
352 337
353 } 338 }
354 } 339 }
OLDNEW
« no previous file with comments | « lib/Bitcode/NaCl/Analysis/NaClObjDump.cpp ('k') | lib/Bitcode/NaCl/Reader/NaClBitCodes.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698