| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 } |
| OLD | NEW |