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

Side by Side Diff: src/compiler.cc

Issue 137403009: Adding a type vector to replace type cells. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Seperate file for feedback slot allocation. Created 6 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 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 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 17 matching lines...) Expand all
28 #include "v8.h" 28 #include "v8.h"
29 29
30 #include "compiler.h" 30 #include "compiler.h"
31 31
32 #include "bootstrapper.h" 32 #include "bootstrapper.h"
33 #include "codegen.h" 33 #include "codegen.h"
34 #include "compilation-cache.h" 34 #include "compilation-cache.h"
35 #include "cpu-profiler.h" 35 #include "cpu-profiler.h"
36 #include "debug.h" 36 #include "debug.h"
37 #include "deoptimizer.h" 37 #include "deoptimizer.h"
38 #include "feedbackslots.h"
38 #include "full-codegen.h" 39 #include "full-codegen.h"
39 #include "gdb-jit.h" 40 #include "gdb-jit.h"
40 #include "typing.h" 41 #include "typing.h"
41 #include "hydrogen.h" 42 #include "hydrogen.h"
42 #include "isolate-inl.h" 43 #include "isolate-inl.h"
43 #include "lithium.h" 44 #include "lithium.h"
44 #include "liveedit.h" 45 #include "liveedit.h"
45 #include "parser.h" 46 #include "parser.h"
46 #include "rewriter.h" 47 #include "rewriter.h"
47 #include "runtime-profiler.h" 48 #include "runtime-profiler.h"
48 #include "scanner-character-streams.h" 49 #include "scanner-character-streams.h"
49 #include "scopeinfo.h" 50 #include "scopeinfo.h"
50 #include "scopes.h" 51 #include "scopes.h"
51 #include "vm-state-inl.h" 52 #include "vm-state-inl.h"
52 53
53 namespace v8 { 54 namespace v8 {
54 namespace internal { 55 namespace internal {
55 56
56 57
57 CompilationInfo::CompilationInfo(Handle<Script> script, 58 CompilationInfo::CompilationInfo(Handle<Script> script,
58 Zone* zone) 59 Zone* zone)
59 : flags_(LanguageModeField::encode(CLASSIC_MODE)), 60 : flags_(LanguageModeField::encode(CLASSIC_MODE)),
60 script_(script), 61 script_(script),
61 osr_ast_id_(BailoutId::None()), 62 osr_ast_id_(BailoutId::None()),
62 parameter_count_(0), 63 parameter_count_(0),
64 feedback_slots_(-1),
danno 2014/01/28 08:27:17 Don't you want to use kInvalidFeedbackSlot here an
63 this_has_uses_(true) { 65 this_has_uses_(true) {
64 Initialize(script->GetIsolate(), BASE, zone); 66 Initialize(script->GetIsolate(), BASE, zone);
65 } 67 }
66 68
67 69
68 CompilationInfo::CompilationInfo(Handle<SharedFunctionInfo> shared_info, 70 CompilationInfo::CompilationInfo(Handle<SharedFunctionInfo> shared_info,
69 Zone* zone) 71 Zone* zone)
70 : flags_(LanguageModeField::encode(CLASSIC_MODE) | IsLazy::encode(true)), 72 : flags_(LanguageModeField::encode(CLASSIC_MODE) | IsLazy::encode(true)),
71 shared_info_(shared_info), 73 shared_info_(shared_info),
72 script_(Handle<Script>(Script::cast(shared_info->script()))), 74 script_(Handle<Script>(Script::cast(shared_info->script()))),
73 osr_ast_id_(BailoutId::None()), 75 osr_ast_id_(BailoutId::None()),
74 parameter_count_(0), 76 parameter_count_(0),
77 feedback_slots_(-1),
75 this_has_uses_(true) { 78 this_has_uses_(true) {
76 Initialize(script_->GetIsolate(), BASE, zone); 79 Initialize(script_->GetIsolate(), BASE, zone);
77 } 80 }
78 81
79 82
80 CompilationInfo::CompilationInfo(Handle<JSFunction> closure, 83 CompilationInfo::CompilationInfo(Handle<JSFunction> closure,
81 Zone* zone) 84 Zone* zone)
82 : flags_(LanguageModeField::encode(CLASSIC_MODE) | IsLazy::encode(true)), 85 : flags_(LanguageModeField::encode(CLASSIC_MODE) | IsLazy::encode(true)),
83 closure_(closure), 86 closure_(closure),
84 shared_info_(Handle<SharedFunctionInfo>(closure->shared())), 87 shared_info_(Handle<SharedFunctionInfo>(closure->shared())),
85 script_(Handle<Script>(Script::cast(shared_info_->script()))), 88 script_(Handle<Script>(Script::cast(shared_info_->script()))),
86 context_(closure->context()), 89 context_(closure->context()),
87 osr_ast_id_(BailoutId::None()), 90 osr_ast_id_(BailoutId::None()),
88 parameter_count_(0), 91 parameter_count_(0),
92 feedback_slots_(-1),
89 this_has_uses_(true) { 93 this_has_uses_(true) {
90 Initialize(script_->GetIsolate(), BASE, zone); 94 Initialize(script_->GetIsolate(), BASE, zone);
91 } 95 }
92 96
93 97
94 CompilationInfo::CompilationInfo(HydrogenCodeStub* stub, 98 CompilationInfo::CompilationInfo(HydrogenCodeStub* stub,
95 Isolate* isolate, 99 Isolate* isolate,
96 Zone* zone) 100 Zone* zone)
97 : flags_(LanguageModeField::encode(CLASSIC_MODE) | 101 : flags_(LanguageModeField::encode(CLASSIC_MODE) |
98 IsLazy::encode(true)), 102 IsLazy::encode(true)),
99 osr_ast_id_(BailoutId::None()), 103 osr_ast_id_(BailoutId::None()),
100 parameter_count_(0), 104 parameter_count_(0),
105 feedback_slots_(0), // Hydrogen code stubs don't have feedback slots
101 this_has_uses_(true) { 106 this_has_uses_(true) {
102 Initialize(isolate, STUB, zone); 107 Initialize(isolate, STUB, zone);
103 code_stub_ = stub; 108 code_stub_ = stub;
104 } 109 }
105 110
106 111
107 void CompilationInfo::Initialize(Isolate* isolate, 112 void CompilationInfo::Initialize(Isolate* isolate,
108 Mode mode, 113 Mode mode,
109 Zone* zone) { 114 Zone* zone) {
110 isolate_ = isolate; 115 isolate_ = isolate;
(...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after
358 ElapsedTimer timer; 363 ElapsedTimer timer;
359 if (FLAG_hydrogen_stats) { 364 if (FLAG_hydrogen_stats) {
360 timer.Start(); 365 timer.Start();
361 } 366 }
362 CompilationInfoWithZone unoptimized(info()->shared_info()); 367 CompilationInfoWithZone unoptimized(info()->shared_info());
363 // Note that we use the same AST that we will use for generating the 368 // Note that we use the same AST that we will use for generating the
364 // optimized code. 369 // optimized code.
365 unoptimized.SetFunction(info()->function()); 370 unoptimized.SetFunction(info()->function());
366 unoptimized.SetScope(info()->scope()); 371 unoptimized.SetScope(info()->scope());
367 unoptimized.SetContext(info()->context()); 372 unoptimized.SetContext(info()->context());
373 FeedbackSlotAllocator::Run(&unoptimized);
368 if (should_recompile) unoptimized.EnableDeoptimizationSupport(); 374 if (should_recompile) unoptimized.EnableDeoptimizationSupport();
369 bool succeeded = FullCodeGenerator::MakeCode(&unoptimized); 375 bool succeeded = FullCodeGenerator::MakeCode(&unoptimized);
370 if (should_recompile) { 376 if (should_recompile) {
371 if (!succeeded) return SetLastStatus(FAILED); 377 if (!succeeded) return SetLastStatus(FAILED);
372 Handle<SharedFunctionInfo> shared = info()->shared_info(); 378 Handle<SharedFunctionInfo> shared = info()->shared_info();
373 shared->EnableDeoptimizationSupport(*unoptimized.code()); 379 shared->EnableDeoptimizationSupport(*unoptimized.code());
374 // The existing unoptimized code was replaced with the new one. 380 // The existing unoptimized code was replaced with the new one.
375 Compiler::RecordFunctionCompilation( 381 Compiler::RecordFunctionCompilation(
376 Logger::LAZY_COMPILE_TAG, &unoptimized, shared); 382 Logger::LAZY_COMPILE_TAG, &unoptimized, shared);
377 } 383 }
(...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after
606 function_info->set_dont_cache(lit->flags()->Contains(kDontCache)); 612 function_info->set_dont_cache(lit->flags()->Contains(kDontCache));
607 function_info->set_is_generator(lit->is_generator()); 613 function_info->set_is_generator(lit->is_generator());
608 } 614 }
609 615
610 616
611 static bool CompileUnoptimizedCode(CompilationInfo* info) { 617 static bool CompileUnoptimizedCode(CompilationInfo* info) {
612 ASSERT(info->function() != NULL); 618 ASSERT(info->function() != NULL);
613 if (!Rewriter::Rewrite(info)) return false; 619 if (!Rewriter::Rewrite(info)) return false;
614 if (!Scope::Analyze(info)) return false; 620 if (!Scope::Analyze(info)) return false;
615 ASSERT(info->scope() != NULL); 621 ASSERT(info->scope() != NULL);
622 if (!FeedbackSlotAllocator::Run(info)) return false;
623 ASSERT(info->feedback_slots() >= 0);
616 624
617 if (!FullCodeGenerator::MakeCode(info)) { 625 if (!FullCodeGenerator::MakeCode(info)) {
618 Isolate* isolate = info->isolate(); 626 Isolate* isolate = info->isolate();
619 if (!isolate->has_pending_exception()) isolate->StackOverflow(); 627 if (!isolate->has_pending_exception()) isolate->StackOverflow();
620 return false; 628 return false;
621 } 629 }
622 return true; 630 return true;
623 } 631 }
624 632
625 633
(...skipping 374 matching lines...) Expand 10 before | Expand all | Expand 10 after
1000 bool allow_lazy_without_ctx = literal->AllowsLazyCompilationWithoutContext(); 1008 bool allow_lazy_without_ctx = literal->AllowsLazyCompilationWithoutContext();
1001 bool allow_lazy = literal->AllowsLazyCompilation() && 1009 bool allow_lazy = literal->AllowsLazyCompilation() &&
1002 !DebuggerWantsEagerCompilation(&info, allow_lazy_without_ctx); 1010 !DebuggerWantsEagerCompilation(&info, allow_lazy_without_ctx);
1003 1011
1004 // Generate code 1012 // Generate code
1005 Handle<ScopeInfo> scope_info; 1013 Handle<ScopeInfo> scope_info;
1006 if (FLAG_lazy && allow_lazy && !literal->is_parenthesized()) { 1014 if (FLAG_lazy && allow_lazy && !literal->is_parenthesized()) {
1007 Handle<Code> code = isolate->builtins()->CompileUnoptimized(); 1015 Handle<Code> code = isolate->builtins()->CompileUnoptimized();
1008 info.SetCode(code); 1016 info.SetCode(code);
1009 scope_info = Handle<ScopeInfo>(ScopeInfo::Empty(isolate)); 1017 scope_info = Handle<ScopeInfo>(ScopeInfo::Empty(isolate));
1010 } else if (FullCodeGenerator::MakeCode(&info)) { 1018 } else if (FeedbackSlotAllocator::Run(&info) &&
1019 FullCodeGenerator::MakeCode(&info)) {
1011 ASSERT(!info.code().is_null()); 1020 ASSERT(!info.code().is_null());
1012 scope_info = ScopeInfo::Create(info.scope(), info.zone()); 1021 scope_info = ScopeInfo::Create(info.scope(), info.zone());
1013 } else { 1022 } else {
1014 return Handle<SharedFunctionInfo>::null(); 1023 return Handle<SharedFunctionInfo>::null();
1015 } 1024 }
1016 1025
1017 // Create a shared function info object. 1026 // Create a shared function info object.
1018 Handle<SharedFunctionInfo> result = 1027 Handle<SharedFunctionInfo> result =
1019 factory->NewSharedFunctionInfo(literal->name(), 1028 factory->NewSharedFunctionInfo(literal->name(),
1020 literal->materialized_literal_count(), 1029 literal->materialized_literal_count(),
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
1077 1086
1078 1087
1079 static bool CompileOptimizedPrologue(CompilationInfo* info) { 1088 static bool CompileOptimizedPrologue(CompilationInfo* info) {
1080 if (!Parser::Parse(info)) return false; 1089 if (!Parser::Parse(info)) return false;
1081 LanguageMode language_mode = info->function()->language_mode(); 1090 LanguageMode language_mode = info->function()->language_mode();
1082 info->SetLanguageMode(language_mode); 1091 info->SetLanguageMode(language_mode);
1083 1092
1084 if (!Rewriter::Rewrite(info)) return false; 1093 if (!Rewriter::Rewrite(info)) return false;
1085 if (!Scope::Analyze(info)) return false; 1094 if (!Scope::Analyze(info)) return false;
1086 ASSERT(info->scope() != NULL); 1095 ASSERT(info->scope() != NULL);
1096 if (!FeedbackSlotAllocator::Run(info)) return false;
1097 ASSERT(info->feedback_slots() >= 0);
1087 return true; 1098 return true;
1088 } 1099 }
1089 1100
1090 1101
1091 static bool GetOptimizedCodeNow(CompilationInfo* info) { 1102 static bool GetOptimizedCodeNow(CompilationInfo* info) {
1092 if (!CompileOptimizedPrologue(info)) return false; 1103 if (!CompileOptimizedPrologue(info)) return false;
1093 1104
1094 Logger::TimerEventScope timer( 1105 Logger::TimerEventScope timer(
1095 info->isolate(), Logger::TimerEventScope::v8_recompile_synchronous); 1106 info->isolate(), Logger::TimerEventScope::v8_recompile_synchronous);
1096 1107
(...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after
1291 AllowHandleDereference allow_deref; 1302 AllowHandleDereference allow_deref;
1292 bool tracing_on = info()->IsStub() 1303 bool tracing_on = info()->IsStub()
1293 ? FLAG_trace_hydrogen_stubs 1304 ? FLAG_trace_hydrogen_stubs
1294 : (FLAG_trace_hydrogen && 1305 : (FLAG_trace_hydrogen &&
1295 info()->closure()->PassesFilter(FLAG_trace_hydrogen_filter)); 1306 info()->closure()->PassesFilter(FLAG_trace_hydrogen_filter));
1296 return (tracing_on && 1307 return (tracing_on &&
1297 OS::StrChr(const_cast<char*>(FLAG_trace_phase), name_[0]) != NULL); 1308 OS::StrChr(const_cast<char*>(FLAG_trace_phase), name_[0]) != NULL);
1298 } 1309 }
1299 1310
1300 } } // namespace v8::internal 1311 } } // namespace v8::internal
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698