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

Side by Side Diff: src/compiler.cc

Issue 6551011: Fix CPU profiling for Crankshaft. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 9 years, 10 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 | Annotate | Revision Log
OLDNEW
1 // Copyright 2010 the V8 project authors. All rights reserved. 1 // Copyright 2010 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 243 matching lines...) Expand 10 before | Expand all | Expand 10 after
254 // optimized code. 254 // optimized code.
255 unoptimized.SetFunction(info->function()); 255 unoptimized.SetFunction(info->function());
256 unoptimized.SetScope(info->scope()); 256 unoptimized.SetScope(info->scope());
257 if (should_recompile) unoptimized.EnableDeoptimizationSupport(); 257 if (should_recompile) unoptimized.EnableDeoptimizationSupport();
258 bool succeeded = FullCodeGenerator::MakeCode(&unoptimized); 258 bool succeeded = FullCodeGenerator::MakeCode(&unoptimized);
259 if (should_recompile) { 259 if (should_recompile) {
260 if (!succeeded) return false; 260 if (!succeeded) return false;
261 Handle<SharedFunctionInfo> shared = info->shared_info(); 261 Handle<SharedFunctionInfo> shared = info->shared_info();
262 shared->EnableDeoptimizationSupport(*unoptimized.code()); 262 shared->EnableDeoptimizationSupport(*unoptimized.code());
263 // The existing unoptimized code was replaced with the new one. 263 // The existing unoptimized code was replaced with the new one.
264 Compiler::RecordFunctionCompilation(Logger::LAZY_COMPILE_TAG, 264 Compiler::RecordFunctionCompilation(
265 Handle<String>(shared->DebugName()), 265 Logger::LAZY_COMPILE_TAG, &unoptimized, shared);
266 shared->start_position(),
267 &unoptimized);
268 } 266 }
269 } 267 }
270 268
271 // Check that the unoptimized, shared code is ready for 269 // Check that the unoptimized, shared code is ready for
272 // optimizations. When using the always_opt flag we disregard the 270 // optimizations. When using the always_opt flag we disregard the
273 // optimizable marker in the code object and optimize anyway. This 271 // optimizable marker in the code object and optimize anyway. This
274 // is safe as long as the unoptimized code has deoptimization 272 // is safe as long as the unoptimized code has deoptimization
275 // support. 273 // support.
276 ASSERT(FLAG_always_opt || code->optimizable()); 274 ASSERT(FLAG_always_opt || code->optimizable());
277 ASSERT(info->shared_info()->has_deoptimization_support()); 275 ASSERT(info->shared_info()->has_deoptimization_support());
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after
407 HistogramTimerScope timer(rate); 405 HistogramTimerScope timer(rate);
408 406
409 // Compile the code. 407 // Compile the code.
410 FunctionLiteral* lit = info->function(); 408 FunctionLiteral* lit = info->function();
411 LiveEditFunctionTracker live_edit_tracker(lit); 409 LiveEditFunctionTracker live_edit_tracker(lit);
412 if (!MakeCode(info)) { 410 if (!MakeCode(info)) {
413 Top::StackOverflow(); 411 Top::StackOverflow();
414 return Handle<SharedFunctionInfo>::null(); 412 return Handle<SharedFunctionInfo>::null();
415 } 413 }
416 414
415 // Allocate function.
417 ASSERT(!info->code().is_null()); 416 ASSERT(!info->code().is_null());
417 Handle<SharedFunctionInfo> result =
418 Factory::NewSharedFunctionInfo(
419 lit->name(),
420 lit->materialized_literal_count(),
421 info->code(),
422 SerializedScopeInfo::Create(info->scope()));
423
424 ASSERT_EQ(RelocInfo::kNoPosition, lit->function_token_position());
425 Compiler::SetFunctionInfo(result, lit, true, script);
426
418 if (script->name()->IsString()) { 427 if (script->name()->IsString()) {
419 PROFILE(CodeCreateEvent( 428 PROFILE(CodeCreateEvent(
420 info->is_eval() 429 info->is_eval()
421 ? Logger::EVAL_TAG 430 ? Logger::EVAL_TAG
422 : Logger::ToNativeByScript(Logger::SCRIPT_TAG, *script), 431 : Logger::ToNativeByScript(Logger::SCRIPT_TAG, *script),
423 *info->code(), 432 *info->code(),
433 *result,
424 String::cast(script->name()))); 434 String::cast(script->name())));
425 GDBJIT(AddCode(Handle<String>(String::cast(script->name())), 435 GDBJIT(AddCode(Handle<String>(String::cast(script->name())),
426 script, 436 script,
427 info->code())); 437 info->code()));
428 } else { 438 } else {
429 PROFILE(CodeCreateEvent( 439 PROFILE(CodeCreateEvent(
430 info->is_eval() 440 info->is_eval()
431 ? Logger::EVAL_TAG 441 ? Logger::EVAL_TAG
432 : Logger::ToNativeByScript(Logger::SCRIPT_TAG, *script), 442 : Logger::ToNativeByScript(Logger::SCRIPT_TAG, *script),
433 *info->code(), 443 *info->code(),
434 "")); 444 *result,
445 Heap::empty_string()));
435 GDBJIT(AddCode(Handle<String>(), script, info->code())); 446 GDBJIT(AddCode(Handle<String>(), script, info->code()));
436 } 447 }
437 448
438 // Allocate function.
439 Handle<SharedFunctionInfo> result =
440 Factory::NewSharedFunctionInfo(
441 lit->name(),
442 lit->materialized_literal_count(),
443 info->code(),
444 SerializedScopeInfo::Create(info->scope()));
445
446 ASSERT_EQ(RelocInfo::kNoPosition, lit->function_token_position());
447 Compiler::SetFunctionInfo(result, lit, true, script);
448
449 // Hint to the runtime system used when allocating space for initial 449 // Hint to the runtime system used when allocating space for initial
450 // property space by setting the expected number of properties for 450 // property space by setting the expected number of properties for
451 // the instances of the function. 451 // the instances of the function.
452 SetExpectedNofPropertiesFromEstimate(result, lit->expected_property_count()); 452 SetExpectedNofPropertiesFromEstimate(result, lit->expected_property_count());
453 453
454 #ifdef ENABLE_DEBUGGER_SUPPORT 454 #ifdef ENABLE_DEBUGGER_SUPPORT
455 // Notify debugger 455 // Notify debugger
456 Debugger::OnAfterCompile(script, Debugger::NO_AFTER_COMPILE_FLAGS); 456 Debugger::OnAfterCompile(script, Debugger::NO_AFTER_COMPILE_FLAGS);
457 #endif 457 #endif
458 458
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after
605 605
606 // Compile the code. 606 // Compile the code.
607 if (!MakeCode(info)) { 607 if (!MakeCode(info)) {
608 if (!Top::has_pending_exception()) { 608 if (!Top::has_pending_exception()) {
609 Top::StackOverflow(); 609 Top::StackOverflow();
610 } 610 }
611 } else { 611 } else {
612 ASSERT(!info->code().is_null()); 612 ASSERT(!info->code().is_null());
613 Handle<Code> code = info->code(); 613 Handle<Code> code = info->code();
614 Handle<JSFunction> function = info->closure(); 614 Handle<JSFunction> function = info->closure();
615 RecordFunctionCompilation(Logger::LAZY_COMPILE_TAG, 615 RecordFunctionCompilation(Logger::LAZY_COMPILE_TAG, info, shared);
616 Handle<String>(shared->DebugName()),
617 shared->start_position(),
618 info);
619 616
620 if (info->IsOptimizing()) { 617 if (info->IsOptimizing()) {
621 function->ReplaceCode(*code); 618 function->ReplaceCode(*code);
622 } else { 619 } else {
623 // Update the shared function info with the compiled code and the 620 // Update the shared function info with the compiled code and the
624 // scope info. Please note, that the order of the shared function 621 // scope info. Please note, that the order of the shared function
625 // info initialization is important since set_scope_info might 622 // info initialization is important since set_scope_info might
626 // trigger a GC, causing the ASSERT below to be invalid if the code 623 // trigger a GC, causing the ASSERT below to be invalid if the code
627 // was flushed. By settting the code object last we avoid this. 624 // was flushed. By settting the code object last we avoid this.
628 Handle<SerializedScopeInfo> scope_info = 625 Handle<SerializedScopeInfo> scope_info =
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
716 // We fall back to the classic V8 code generator. 713 // We fall back to the classic V8 code generator.
717 if (!AssignedVariablesAnalyzer::Analyze(&info) || 714 if (!AssignedVariablesAnalyzer::Analyze(&info) ||
718 !CodeGenerator::MakeCode(&info)) { 715 !CodeGenerator::MakeCode(&info)) {
719 return Handle<SharedFunctionInfo>::null(); 716 return Handle<SharedFunctionInfo>::null();
720 } 717 }
721 } 718 }
722 } 719 }
723 ASSERT(!info.code().is_null()); 720 ASSERT(!info.code().is_null());
724 721
725 // Function compilation complete. 722 // Function compilation complete.
726 RecordFunctionCompilation(Logger::FUNCTION_TAG,
727 literal->debug_name(),
728 literal->start_position(),
729 &info);
730 scope_info = SerializedScopeInfo::Create(info.scope()); 723 scope_info = SerializedScopeInfo::Create(info.scope());
731 } 724 }
732 725
733 // Create a shared function info object. 726 // Create a shared function info object.
734 Handle<SharedFunctionInfo> result = 727 Handle<SharedFunctionInfo> result =
735 Factory::NewSharedFunctionInfo(literal->name(), 728 Factory::NewSharedFunctionInfo(literal->name(),
736 literal->materialized_literal_count(), 729 literal->materialized_literal_count(),
737 info.code(), 730 info.code(),
738 scope_info); 731 scope_info);
739 SetFunctionInfo(result, literal, false, script); 732 SetFunctionInfo(result, literal, false, script);
733 RecordFunctionCompilation(Logger::FUNCTION_TAG, &info, result);
740 result->set_allows_lazy_compilation(allow_lazy); 734 result->set_allows_lazy_compilation(allow_lazy);
741 735
742 // Set the expected number of properties for instances and return 736 // Set the expected number of properties for instances and return
743 // the resulting function. 737 // the resulting function.
744 SetExpectedNofPropertiesFromEstimate(result, 738 SetExpectedNofPropertiesFromEstimate(result,
745 literal->expected_property_count()); 739 literal->expected_property_count());
746 live_edit_tracker.RecordFunctionInfo(result, literal); 740 live_edit_tracker.RecordFunctionInfo(result, literal);
747 return result; 741 return result;
748 } 742 }
749 743
(...skipping 18 matching lines...) Expand all
768 function_info->SetThisPropertyAssignmentsInfo( 762 function_info->SetThisPropertyAssignmentsInfo(
769 lit->has_only_simple_this_property_assignments(), 763 lit->has_only_simple_this_property_assignments(),
770 *lit->this_property_assignments()); 764 *lit->this_property_assignments());
771 function_info->set_try_full_codegen(lit->try_full_codegen()); 765 function_info->set_try_full_codegen(lit->try_full_codegen());
772 function_info->set_allows_lazy_compilation(lit->AllowsLazyCompilation()); 766 function_info->set_allows_lazy_compilation(lit->AllowsLazyCompilation());
773 function_info->set_strict_mode(lit->strict_mode()); 767 function_info->set_strict_mode(lit->strict_mode());
774 } 768 }
775 769
776 770
777 void Compiler::RecordFunctionCompilation(Logger::LogEventsAndTags tag, 771 void Compiler::RecordFunctionCompilation(Logger::LogEventsAndTags tag,
778 Handle<String> name, 772 CompilationInfo* info,
779 int start_position, 773 Handle<SharedFunctionInfo> shared) {
780 CompilationInfo* info) {
781 // Log the code generation. If source information is available include 774 // Log the code generation. If source information is available include
782 // script name and line number. Check explicitly whether logging is 775 // script name and line number. Check explicitly whether logging is
783 // enabled as finding the line number is not free. 776 // enabled as finding the line number is not free.
784 if (Logger::is_logging() || 777 if (Logger::is_logging() ||
785 CpuProfiler::is_profiling()) { 778 CpuProfiler::is_profiling()) {
786 Handle<Script> script = info->script(); 779 Handle<Script> script = info->script();
787 Handle<Code> code = info->code(); 780 Handle<Code> code = info->code();
788 if (script->name()->IsString()) { 781 if (script->name()->IsString()) {
789 int line_num = GetScriptLineNumber(script, start_position) + 1; 782 int line_num = GetScriptLineNumber(script, shared->start_position()) + 1;
790 USE(line_num); 783 USE(line_num);
791 PROFILE(CodeCreateEvent(Logger::ToNativeByScript(tag, *script), 784 PROFILE(CodeCreateEvent(Logger::ToNativeByScript(tag, *script),
792 *code, 785 *code,
793 *name, 786 *shared,
794 String::cast(script->name()), 787 String::cast(script->name()),
795 line_num)); 788 line_num));
796 } else { 789 } else {
797 PROFILE(CodeCreateEvent(Logger::ToNativeByScript(tag, *script), 790 PROFILE(CodeCreateEvent(Logger::ToNativeByScript(tag, *script),
798 *code, 791 *code,
799 *name)); 792 *shared,
793 shared->DebugName()));
800 } 794 }
801 } 795 }
802 796
803 GDBJIT(AddCode(name, 797 GDBJIT(AddCode(name,
804 Handle<Script>(info->script()), 798 Handle<Script>(info->script()),
805 Handle<Code>(info->code()))); 799 Handle<Code>(info->code())));
806 } 800 }
807 801
808 } } // namespace v8::internal 802 } } // namespace v8::internal
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698