| 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 "src/crankshaft/hydrogen.h" | 5 #include "src/crankshaft/hydrogen.h" |
| 6 | 6 |
| 7 #include <sstream> | 7 #include <sstream> |
| 8 | 8 |
| 9 #include "src/allocation-site-scopes.h" | 9 #include "src/allocation-site-scopes.h" |
| 10 #include "src/ast/ast-numbering.h" | 10 #include "src/ast/ast-numbering.h" |
| (...skipping 1354 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1365 set_current_block(graph()->entry_block()); | 1365 set_current_block(graph()->entry_block()); |
| 1366 if (!BuildGraph()) return NULL; | 1366 if (!BuildGraph()) return NULL; |
| 1367 graph()->FinalizeUniqueness(); | 1367 graph()->FinalizeUniqueness(); |
| 1368 return graph_; | 1368 return graph_; |
| 1369 } | 1369 } |
| 1370 | 1370 |
| 1371 int HGraphBuilder::TraceInlinedFunction(Handle<SharedFunctionInfo> shared, | 1371 int HGraphBuilder::TraceInlinedFunction(Handle<SharedFunctionInfo> shared, |
| 1372 SourcePosition position) { | 1372 SourcePosition position) { |
| 1373 DCHECK(info_->is_tracking_positions()); | 1373 DCHECK(info_->is_tracking_positions()); |
| 1374 | 1374 |
| 1375 int inline_id = static_cast<int>(info_->inlined_function_infos().size()); | 1375 int inline_id = static_cast<int>(graph()->inlined_function_infos().size()); |
| 1376 InlinedFunctionInfo info(shared->start_position()); | 1376 HInlinedFunctionInfo info(shared->start_position()); |
| 1377 if (!shared->script()->IsUndefined()) { | 1377 if (!shared->script()->IsUndefined()) { |
| 1378 Handle<Script> script(Script::cast(shared->script())); | 1378 Handle<Script> script(Script::cast(shared->script())); |
| 1379 | 1379 |
| 1380 if (FLAG_hydrogen_track_positions && !script->source()->IsUndefined()) { | 1380 if (FLAG_hydrogen_track_positions && !script->source()->IsUndefined()) { |
| 1381 CodeTracer::Scope tracing_scope(isolate()->GetCodeTracer()); | 1381 CodeTracer::Scope tracing_scope(isolate()->GetCodeTracer()); |
| 1382 Object* source_name = script->name(); | 1382 Object* source_name = script->name(); |
| 1383 OFStream os(tracing_scope.file()); | 1383 OFStream os(tracing_scope.file()); |
| 1384 os << "--- FUNCTION SOURCE ("; | 1384 os << "--- FUNCTION SOURCE ("; |
| 1385 if (source_name->IsString()) { | 1385 if (source_name->IsString()) { |
| 1386 os << String::cast(source_name)->ToCString().get() << ":"; | 1386 os << String::cast(source_name)->ToCString().get() << ":"; |
| 1387 } | 1387 } |
| 1388 os << shared->DebugName()->ToCString().get() << ") id{"; | 1388 os << shared->DebugName()->ToCString().get() << ") id{"; |
| 1389 os << info_->optimization_id() << "," << inline_id << "} ---\n"; | 1389 os << info_->optimization_id() << "," << inline_id << "} ---\n"; |
| 1390 { | 1390 { |
| 1391 DisallowHeapAllocation no_allocation; | 1391 DisallowHeapAllocation no_allocation; |
| 1392 int start = shared->start_position(); | 1392 int start = shared->start_position(); |
| 1393 int len = shared->end_position() - start; | 1393 int len = shared->end_position() - start; |
| 1394 String::SubStringRange source(String::cast(script->source()), start, | 1394 String::SubStringRange source(String::cast(script->source()), start, |
| 1395 len); | 1395 len); |
| 1396 for (const auto& c : source) { | 1396 for (const auto& c : source) { |
| 1397 os << AsReversiblyEscapedUC16(c); | 1397 os << AsReversiblyEscapedUC16(c); |
| 1398 } | 1398 } |
| 1399 } | 1399 } |
| 1400 | 1400 |
| 1401 os << "\n--- END ---\n"; | 1401 os << "\n--- END ---\n"; |
| 1402 } | 1402 } |
| 1403 } | 1403 } |
| 1404 | 1404 |
| 1405 info_->inlined_function_infos().push_back(info); | 1405 graph()->inlined_function_infos().push_back(info); |
| 1406 | 1406 |
| 1407 if (FLAG_hydrogen_track_positions && inline_id != 0) { | 1407 if (FLAG_hydrogen_track_positions && inline_id != 0) { |
| 1408 CodeTracer::Scope tracing_scope(isolate()->GetCodeTracer()); | 1408 CodeTracer::Scope tracing_scope(isolate()->GetCodeTracer()); |
| 1409 OFStream os(tracing_scope.file()); | 1409 OFStream os(tracing_scope.file()); |
| 1410 os << "INLINE (" << shared->DebugName()->ToCString().get() << ") id{" | 1410 os << "INLINE (" << shared->DebugName()->ToCString().get() << ") id{" |
| 1411 << info_->optimization_id() << "," << inline_id << "} AS " << inline_id | 1411 << info_->optimization_id() << "," << inline_id << "} AS " << inline_id |
| 1412 << " AT " << position << std::endl; | 1412 << " AT " << position << std::endl; |
| 1413 } | 1413 } |
| 1414 | 1414 |
| 1415 return inline_id; | 1415 return inline_id; |
| (...skipping 2367 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3783 osr_(NULL), | 3783 osr_(NULL), |
| 3784 info_(info), | 3784 info_(info), |
| 3785 descriptor_(descriptor), | 3785 descriptor_(descriptor), |
| 3786 zone_(info->zone()), | 3786 zone_(info->zone()), |
| 3787 allow_code_motion_(false), | 3787 allow_code_motion_(false), |
| 3788 use_optimistic_licm_(false), | 3788 use_optimistic_licm_(false), |
| 3789 depends_on_empty_array_proto_elements_(false), | 3789 depends_on_empty_array_proto_elements_(false), |
| 3790 type_change_checksum_(0), | 3790 type_change_checksum_(0), |
| 3791 maximum_environment_size_(0), | 3791 maximum_environment_size_(0), |
| 3792 no_side_effects_scope_count_(0), | 3792 no_side_effects_scope_count_(0), |
| 3793 disallow_adding_new_values_(false) { | 3793 disallow_adding_new_values_(false), |
| 3794 inlined_function_infos_(info->zone()) { |
| 3794 if (info->IsStub()) { | 3795 if (info->IsStub()) { |
| 3795 // For stubs, explicitly add the context to the environment. | 3796 // For stubs, explicitly add the context to the environment. |
| 3796 start_environment_ = new (zone_) | 3797 start_environment_ = new (zone_) |
| 3797 HEnvironment(zone_, descriptor.GetRegisterParameterCount() + 1); | 3798 HEnvironment(zone_, descriptor.GetRegisterParameterCount() + 1); |
| 3798 } else { | 3799 } else { |
| 3799 start_environment_ = | 3800 start_environment_ = |
| 3800 new(zone_) HEnvironment(NULL, info->scope(), info->closure(), zone_); | 3801 new(zone_) HEnvironment(NULL, info->scope(), info->closure(), zone_); |
| 3801 } | 3802 } |
| 3802 start_environment_->set_ast_id(BailoutId::FunctionContext()); | 3803 start_environment_->set_ast_id(BailoutId::FunctionContext()); |
| 3803 entry_block_ = CreateBasicBlock(); | 3804 entry_block_ = CreateBasicBlock(); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 3817 for (int i = 0; i < blocks()->length(); ++i) { | 3818 for (int i = 0; i < blocks()->length(); ++i) { |
| 3818 for (HInstructionIterator it(blocks()->at(i)); !it.Done(); it.Advance()) { | 3819 for (HInstructionIterator it(blocks()->at(i)); !it.Done(); it.Advance()) { |
| 3819 it.Current()->FinalizeUniqueness(); | 3820 it.Current()->FinalizeUniqueness(); |
| 3820 } | 3821 } |
| 3821 } | 3822 } |
| 3822 } | 3823 } |
| 3823 | 3824 |
| 3824 | 3825 |
| 3825 int HGraph::SourcePositionToScriptPosition(SourcePosition pos) { | 3826 int HGraph::SourcePositionToScriptPosition(SourcePosition pos) { |
| 3826 return (FLAG_hydrogen_track_positions && !pos.IsUnknown()) | 3827 return (FLAG_hydrogen_track_positions && !pos.IsUnknown()) |
| 3827 ? info()->inlined_function_infos() | 3828 ? inlined_function_infos_.at(pos.inlining_id()).start_position + |
| 3828 .at(pos.inlining_id()) | |
| 3829 .start_position + | |
| 3830 pos.position() | 3829 pos.position() |
| 3831 : pos.raw(); | 3830 : pos.raw(); |
| 3832 } | 3831 } |
| 3833 | 3832 |
| 3834 | 3833 |
| 3835 // Block ordering was implemented with two mutually recursive methods, | 3834 // Block ordering was implemented with two mutually recursive methods, |
| 3836 // HGraph::Postorder and HGraph::PostorderLoopBlocks. | 3835 // HGraph::Postorder and HGraph::PostorderLoopBlocks. |
| 3837 // The recursion could lead to stack overflow so the algorithm has been | 3836 // The recursion could lead to stack overflow so the algorithm has been |
| 3838 // implemented iteratively. | 3837 // implemented iteratively. |
| 3839 // At a high level the algorithm looks like this: | 3838 // At a high level the algorithm looks like this: |
| (...skipping 9900 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 13740 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); | 13739 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); |
| 13741 } | 13740 } |
| 13742 | 13741 |
| 13743 #ifdef DEBUG | 13742 #ifdef DEBUG |
| 13744 graph_->Verify(false); // No full verify. | 13743 graph_->Verify(false); // No full verify. |
| 13745 #endif | 13744 #endif |
| 13746 } | 13745 } |
| 13747 | 13746 |
| 13748 } // namespace internal | 13747 } // namespace internal |
| 13749 } // namespace v8 | 13748 } // namespace v8 |
| OLD | NEW |