OLD | NEW |
1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
| 5 #include <iomanip> |
5 #include <sstream> | 6 #include <sstream> |
6 | 7 |
7 #include "src/v8.h" | 8 #include "src/v8.h" |
8 | 9 |
9 #include "src/accessors.h" | 10 #include "src/accessors.h" |
10 #include "src/allocation-site-scopes.h" | 11 #include "src/allocation-site-scopes.h" |
11 #include "src/api.h" | 12 #include "src/api.h" |
12 #include "src/arguments.h" | 13 #include "src/arguments.h" |
13 #include "src/base/bits.h" | 14 #include "src/base/bits.h" |
14 #include "src/bootstrapper.h" | 15 #include "src/bootstrapper.h" |
(...skipping 11306 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11321 std::ostream& os) { // NOLINT | 11322 std::ostream& os) { // NOLINT |
11322 disasm::NameConverter converter; | 11323 disasm::NameConverter converter; |
11323 int deopt_count = DeoptCount(); | 11324 int deopt_count = DeoptCount(); |
11324 os << "Deoptimization Input Data (deopt points = " << deopt_count << ")\n"; | 11325 os << "Deoptimization Input Data (deopt points = " << deopt_count << ")\n"; |
11325 if (0 != deopt_count) { | 11326 if (0 != deopt_count) { |
11326 os << " index ast id argc pc"; | 11327 os << " index ast id argc pc"; |
11327 if (FLAG_print_code_verbose) os << " commands"; | 11328 if (FLAG_print_code_verbose) os << " commands"; |
11328 os << "\n"; | 11329 os << "\n"; |
11329 } | 11330 } |
11330 for (int i = 0; i < deopt_count; i++) { | 11331 for (int i = 0; i < deopt_count; i++) { |
11331 // TODO(svenpanne) Add some basic formatting to our streams. | 11332 os << std::setw(6) << i << " " << std::setw(6) << AstId(i).ToInt() << " " |
11332 Vector<char> buf1 = Vector<char>::New(128); | 11333 << std::setw(6) << ArgumentsStackHeight(i)->value() << " " |
11333 SNPrintF(buf1, "%6d %6d %6d %6d", i, AstId(i).ToInt(), | 11334 << std::setw(6) << Pc(i)->value(); |
11334 ArgumentsStackHeight(i)->value(), Pc(i)->value()); | |
11335 os << buf1.start(); | |
11336 | 11335 |
11337 if (!FLAG_print_code_verbose) { | 11336 if (!FLAG_print_code_verbose) { |
11338 os << "\n"; | 11337 os << "\n"; |
11339 continue; | 11338 continue; |
11340 } | 11339 } |
11341 // Print details of the frame translation. | 11340 // Print details of the frame translation. |
11342 int translation_index = TranslationIndex(i)->value(); | 11341 int translation_index = TranslationIndex(i)->value(); |
11343 TranslationIterator iterator(TranslationByteArray(), translation_index); | 11342 TranslationIterator iterator(TranslationByteArray(), translation_index); |
11344 Translation::Opcode opcode = | 11343 Translation::Opcode opcode = |
11345 static_cast<Translation::Opcode>(iterator.Next()); | 11344 static_cast<Translation::Opcode>(iterator.Next()); |
11346 DCHECK(Translation::BEGIN == opcode); | 11345 DCHECK(Translation::BEGIN == opcode); |
11347 int frame_count = iterator.Next(); | 11346 int frame_count = iterator.Next(); |
11348 int jsframe_count = iterator.Next(); | 11347 int jsframe_count = iterator.Next(); |
11349 os << " " << Translation::StringFor(opcode) | 11348 os << " " << Translation::StringFor(opcode) |
11350 << " {frame count=" << frame_count | 11349 << " {frame count=" << frame_count |
11351 << ", js frame count=" << jsframe_count << "}\n"; | 11350 << ", js frame count=" << jsframe_count << "}\n"; |
11352 | 11351 |
11353 while (iterator.HasNext() && | 11352 while (iterator.HasNext() && |
11354 Translation::BEGIN != | 11353 Translation::BEGIN != |
11355 (opcode = static_cast<Translation::Opcode>(iterator.Next()))) { | 11354 (opcode = static_cast<Translation::Opcode>(iterator.Next()))) { |
11356 Vector<char> buf2 = Vector<char>::New(128); | 11355 os << std::setw(31) << " " << Translation::StringFor(opcode) << " "; |
11357 SNPrintF(buf2, "%27s %s ", "", Translation::StringFor(opcode)); | |
11358 os << buf2.start(); | |
11359 | 11356 |
11360 switch (opcode) { | 11357 switch (opcode) { |
11361 case Translation::BEGIN: | 11358 case Translation::BEGIN: |
11362 UNREACHABLE(); | 11359 UNREACHABLE(); |
11363 break; | 11360 break; |
11364 | 11361 |
11365 case Translation::JS_FRAME: { | 11362 case Translation::JS_FRAME: { |
11366 int ast_id = iterator.Next(); | 11363 int ast_id = iterator.Next(); |
11367 int function_id = iterator.Next(); | 11364 int function_id = iterator.Next(); |
11368 unsigned height = iterator.Next(); | 11365 unsigned height = iterator.Next(); |
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11480 | 11477 |
11481 void DeoptimizationOutputData::DeoptimizationOutputDataPrint( | 11478 void DeoptimizationOutputData::DeoptimizationOutputDataPrint( |
11482 std::ostream& os) { // NOLINT | 11479 std::ostream& os) { // NOLINT |
11483 os << "Deoptimization Output Data (deopt points = " << this->DeoptPoints() | 11480 os << "Deoptimization Output Data (deopt points = " << this->DeoptPoints() |
11484 << ")\n"; | 11481 << ")\n"; |
11485 if (this->DeoptPoints() == 0) return; | 11482 if (this->DeoptPoints() == 0) return; |
11486 | 11483 |
11487 os << "ast id pc state\n"; | 11484 os << "ast id pc state\n"; |
11488 for (int i = 0; i < this->DeoptPoints(); i++) { | 11485 for (int i = 0; i < this->DeoptPoints(); i++) { |
11489 int pc_and_state = this->PcAndState(i)->value(); | 11486 int pc_and_state = this->PcAndState(i)->value(); |
11490 // TODO(svenpanne) Add some basic formatting to our streams. | 11487 os << std::setw(6) << this->AstId(i).ToInt() << " " << std::setw(8) |
11491 Vector<char> buf = Vector<char>::New(100); | 11488 << FullCodeGenerator::PcField::decode(pc_and_state) << " " |
11492 SNPrintF(buf, "%6d %8d %s\n", this->AstId(i).ToInt(), | 11489 << FullCodeGenerator::State2String( |
11493 FullCodeGenerator::PcField::decode(pc_and_state), | 11490 FullCodeGenerator::StateField::decode(pc_and_state)) << "\n"; |
11494 FullCodeGenerator::State2String( | |
11495 FullCodeGenerator::StateField::decode(pc_and_state))); | |
11496 os << buf.start(); | |
11497 } | 11491 } |
11498 } | 11492 } |
11499 | 11493 |
11500 | 11494 |
11501 const char* Code::ICState2String(InlineCacheState state) { | 11495 const char* Code::ICState2String(InlineCacheState state) { |
11502 switch (state) { | 11496 switch (state) { |
11503 case UNINITIALIZED: return "UNINITIALIZED"; | 11497 case UNINITIALIZED: return "UNINITIALIZED"; |
11504 case PREMONOMORPHIC: return "PREMONOMORPHIC"; | 11498 case PREMONOMORPHIC: return "PREMONOMORPHIC"; |
11505 case MONOMORPHIC: return "MONOMORPHIC"; | 11499 case MONOMORPHIC: return "MONOMORPHIC"; |
11506 case PROTOTYPE_FAILURE: | 11500 case PROTOTYPE_FAILURE: |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11594 data->DeoptimizationInputDataPrint(os); | 11588 data->DeoptimizationInputDataPrint(os); |
11595 } | 11589 } |
11596 os << "\n"; | 11590 os << "\n"; |
11597 | 11591 |
11598 if (is_crankshafted()) { | 11592 if (is_crankshafted()) { |
11599 SafepointTable table(this); | 11593 SafepointTable table(this); |
11600 os << "Safepoints (size = " << table.size() << ")\n"; | 11594 os << "Safepoints (size = " << table.size() << ")\n"; |
11601 for (unsigned i = 0; i < table.length(); i++) { | 11595 for (unsigned i = 0; i < table.length(); i++) { |
11602 unsigned pc_offset = table.GetPcOffset(i); | 11596 unsigned pc_offset = table.GetPcOffset(i); |
11603 os << static_cast<const void*>(instruction_start() + pc_offset) << " "; | 11597 os << static_cast<const void*>(instruction_start() + pc_offset) << " "; |
11604 // TODO(svenpanne) Add some basic formatting to our streams. | 11598 os << std::setw(4) << pc_offset << " "; |
11605 Vector<char> buf1 = Vector<char>::New(30); | |
11606 SNPrintF(buf1, "%4d", pc_offset); | |
11607 os << buf1.start() << " "; | |
11608 table.PrintEntry(i, os); | 11599 table.PrintEntry(i, os); |
11609 os << " (sp -> fp) "; | 11600 os << " (sp -> fp) "; |
11610 SafepointEntry entry = table.GetEntry(i); | 11601 SafepointEntry entry = table.GetEntry(i); |
11611 if (entry.deoptimization_index() != Safepoint::kNoDeoptimizationIndex) { | 11602 if (entry.deoptimization_index() != Safepoint::kNoDeoptimizationIndex) { |
11612 Vector<char> buf2 = Vector<char>::New(30); | 11603 os << std::setw(6) << entry.deoptimization_index(); |
11613 SNPrintF(buf2, "%6d", entry.deoptimization_index()); | |
11614 os << buf2.start(); | |
11615 } else { | 11604 } else { |
11616 os << "<none>"; | 11605 os << "<none>"; |
11617 } | 11606 } |
11618 if (entry.argument_count() > 0) { | 11607 if (entry.argument_count() > 0) { |
11619 os << " argc: " << entry.argument_count(); | 11608 os << " argc: " << entry.argument_count(); |
11620 } | 11609 } |
11621 os << "\n"; | 11610 os << "\n"; |
11622 } | 11611 } |
11623 os << "\n"; | 11612 os << "\n"; |
11624 } else if (kind() == FUNCTION) { | 11613 } else if (kind() == FUNCTION) { |
11625 unsigned offset = back_edge_table_offset(); | 11614 unsigned offset = back_edge_table_offset(); |
11626 // If there is no back edge table, the "table start" will be at or after | 11615 // If there is no back edge table, the "table start" will be at or after |
11627 // (due to alignment) the end of the instruction stream. | 11616 // (due to alignment) the end of the instruction stream. |
11628 if (static_cast<int>(offset) < instruction_size()) { | 11617 if (static_cast<int>(offset) < instruction_size()) { |
11629 DisallowHeapAllocation no_gc; | 11618 DisallowHeapAllocation no_gc; |
11630 BackEdgeTable back_edges(this, &no_gc); | 11619 BackEdgeTable back_edges(this, &no_gc); |
11631 | 11620 |
11632 os << "Back edges (size = " << back_edges.length() << ")\n"; | 11621 os << "Back edges (size = " << back_edges.length() << ")\n"; |
11633 os << "ast_id pc_offset loop_depth\n"; | 11622 os << "ast_id pc_offset loop_depth\n"; |
11634 | 11623 |
11635 for (uint32_t i = 0; i < back_edges.length(); i++) { | 11624 for (uint32_t i = 0; i < back_edges.length(); i++) { |
11636 Vector<char> buf = Vector<char>::New(100); | 11625 os << std::setw(6) << back_edges.ast_id(i).ToInt() << " " |
11637 SNPrintF(buf, "%6d %9u %10u\n", back_edges.ast_id(i).ToInt(), | 11626 << std::setw(9) << back_edges.pc_offset(i) << " " << std::setw(10) |
11638 back_edges.pc_offset(i), back_edges.loop_depth(i)); | 11627 << back_edges.loop_depth(i) << "\n"; |
11639 os << buf.start(); | |
11640 } | 11628 } |
11641 | 11629 |
11642 os << "\n"; | 11630 os << "\n"; |
11643 } | 11631 } |
11644 #ifdef OBJECT_PRINT | 11632 #ifdef OBJECT_PRINT |
11645 if (!type_feedback_info()->IsUndefined()) { | 11633 if (!type_feedback_info()->IsUndefined()) { |
11646 OFStream os(stdout); | 11634 OFStream os(stdout); |
11647 TypeFeedbackInfo::cast(type_feedback_info())->TypeFeedbackInfoPrint(os); | 11635 TypeFeedbackInfo::cast(type_feedback_info())->TypeFeedbackInfoPrint(os); |
11648 os << "\n"; | 11636 os << "\n"; |
11649 } | 11637 } |
11650 #endif | 11638 #endif |
11651 } | 11639 } |
11652 | 11640 |
11653 if (handler_table()->length() > 0 && is_turbofanned()) { | 11641 if (handler_table()->length() > 0 && is_turbofanned()) { |
11654 os << "Handler Table (size = " << handler_table()->Size() << ")\n"; | 11642 os << "Handler Table (size = " << handler_table()->Size() << ")\n"; |
11655 for (int i = 0; i < handler_table()->length(); i += 2) { | 11643 for (int i = 0; i < handler_table()->length(); i += 2) { |
11656 int pc_offset = Smi::cast(handler_table()->get(i))->value(); | 11644 int pc_offset = Smi::cast(handler_table()->get(i))->value(); |
11657 int handler = Smi::cast(handler_table()->get(i + 1))->value(); | 11645 int handler = Smi::cast(handler_table()->get(i + 1))->value(); |
11658 os << static_cast<const void*>(instruction_start() + pc_offset) << " "; | 11646 os << static_cast<const void*>(instruction_start() + pc_offset) << " " |
11659 Vector<char> buf = Vector<char>::New(20); | 11647 << std::setw(4) << pc_offset << " " << std::setw(4) << handler << "\n"; |
11660 SNPrintF(buf, "%4d %4d\n", pc_offset, handler); | |
11661 os << buf.start(); | |
11662 } | 11648 } |
11663 os << "\n"; | 11649 os << "\n"; |
11664 } | 11650 } |
11665 | 11651 |
11666 os << "RelocInfo (size = " << relocation_size() << ")\n"; | 11652 os << "RelocInfo (size = " << relocation_size() << ")\n"; |
11667 for (RelocIterator it(this); !it.done(); it.next()) { | 11653 for (RelocIterator it(this); !it.done(); it.next()) { |
11668 it.rinfo()->Print(GetIsolate(), os); | 11654 it.rinfo()->Print(GetIsolate(), os); |
11669 } | 11655 } |
11670 os << "\n"; | 11656 os << "\n"; |
11671 | 11657 |
(...skipping 5488 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
17160 CompilationInfo* info) { | 17146 CompilationInfo* info) { |
17161 Handle<DependentCode> codes = DependentCode::InsertCompilationInfo( | 17147 Handle<DependentCode> codes = DependentCode::InsertCompilationInfo( |
17162 handle(cell->dependent_code(), info->isolate()), | 17148 handle(cell->dependent_code(), info->isolate()), |
17163 DependentCode::kPropertyCellChangedGroup, info->object_wrapper()); | 17149 DependentCode::kPropertyCellChangedGroup, info->object_wrapper()); |
17164 if (*codes != cell->dependent_code()) cell->set_dependent_code(*codes); | 17150 if (*codes != cell->dependent_code()) cell->set_dependent_code(*codes); |
17165 info->dependencies(DependentCode::kPropertyCellChangedGroup)->Add( | 17151 info->dependencies(DependentCode::kPropertyCellChangedGroup)->Add( |
17166 cell, info->zone()); | 17152 cell, info->zone()); |
17167 } | 17153 } |
17168 | 17154 |
17169 } } // namespace v8::internal | 17155 } } // namespace v8::internal |
OLD | NEW |