aboutsummaryrefslogtreecommitdiff
path: root/deps/v8/src/compiler.cc
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/compiler.cc')
-rw-r--r--deps/v8/src/compiler.cc176
1 files changed, 95 insertions, 81 deletions
diff --git a/deps/v8/src/compiler.cc b/deps/v8/src/compiler.cc
index f1cdd7c9b0..c2d63fb041 100644
--- a/deps/v8/src/compiler.cc
+++ b/deps/v8/src/compiler.cc
@@ -8,7 +8,6 @@
#include <memory>
#include "src/asmjs/asm-js.h"
-#include "src/asmjs/asm-typer.h"
#include "src/assembler-inl.h"
#include "src/ast/ast-numbering.h"
#include "src/ast/prettyprinter.h"
@@ -30,6 +29,7 @@
#include "src/isolate-inl.h"
#include "src/log-inl.h"
#include "src/messages.h"
+#include "src/objects/map.h"
#include "src/parsing/parsing.h"
#include "src/parsing/rewriter.h"
#include "src/parsing/scanner-character-streams.h"
@@ -233,7 +233,7 @@ void CompilationJob::RegisterWeakObjectsInOptimizedCode(Handle<Code> code) {
// TODO(turbofan): Move this to pipeline.cc once Crankshaft dies.
Isolate* const isolate = code->GetIsolate();
DCHECK(code->is_optimized_code());
- std::vector<Handle<Map>> maps;
+ MapHandles maps;
std::vector<Handle<HeapObject>> objects;
{
DisallowHeapAllocation no_gc;
@@ -471,6 +471,10 @@ CompilationJob::Status FinalizeUnoptimizedCompilationJob(CompilationJob* job) {
void SetSharedFunctionFlagsFromLiteral(FunctionLiteral* literal,
Handle<SharedFunctionInfo> shared_info) {
+ // Don't overwrite values set by the bootstrapper.
+ if (!shared_info->HasLength()) {
+ shared_info->set_length(literal->function_length());
+ }
shared_info->set_ast_node_count(literal->ast_node_count());
shared_info->set_has_duplicate_parameters(
literal->has_duplicate_parameters());
@@ -705,15 +709,25 @@ MUST_USE_RESULT MaybeHandle<Code> GetUnoptimizedCode(
return info->code();
}
-MUST_USE_RESULT MaybeHandle<Code> GetCodeFromOptimizedCodeMap(
+MUST_USE_RESULT MaybeHandle<Code> GetCodeFromOptimizedCodeCache(
Handle<JSFunction> function, BailoutId osr_ast_id) {
RuntimeCallTimerScope runtimeTimer(
function->GetIsolate(),
&RuntimeCallStats::CompileGetFromOptimizedCodeMap);
Handle<SharedFunctionInfo> shared(function->shared());
DisallowHeapAllocation no_gc;
- Code* code = shared->SearchOptimizedCodeMap(
- function->context()->native_context(), osr_ast_id);
+ Code* code = nullptr;
+ if (osr_ast_id.IsNone()) {
+ if (function->feedback_vector_cell()->value()->IsFeedbackVector()) {
+ FeedbackVector* feedback_vector = function->feedback_vector();
+ feedback_vector->EvictOptimizedCodeMarkedForDeoptimization(
+ function->shared(), "GetCodeFromOptimizedCodeCache");
+ code = feedback_vector->optimized_code();
+ }
+ } else {
+ code = function->context()->native_context()->SearchOSROptimizedCodeCache(
+ function->shared(), osr_ast_id);
+ }
if (code != nullptr) {
// Caching of optimized code enabled and optimized code found.
DCHECK(!code->marked_for_deoptimization());
@@ -723,7 +737,7 @@ MUST_USE_RESULT MaybeHandle<Code> GetCodeFromOptimizedCodeMap(
return MaybeHandle<Code>();
}
-void InsertCodeIntoOptimizedCodeMap(CompilationInfo* info) {
+void InsertCodeIntoOptimizedCodeCache(CompilationInfo* info) {
Handle<Code> code = info->code();
if (code->kind() != Code::OPTIMIZED_FUNCTION) return; // Nothing to do.
@@ -737,8 +751,14 @@ void InsertCodeIntoOptimizedCodeMap(CompilationInfo* info) {
Handle<JSFunction> function = info->closure();
Handle<SharedFunctionInfo> shared(function->shared());
Handle<Context> native_context(function->context()->native_context());
- SharedFunctionInfo::AddToOptimizedCodeMap(shared, native_context, code,
- info->osr_ast_id());
+ if (info->osr_ast_id().IsNone()) {
+ Handle<FeedbackVector> vector =
+ handle(function->feedback_vector(), function->GetIsolate());
+ FeedbackVector::SetOptimizedCode(vector, code);
+ } else {
+ Context::AddToOSROptimizedCodeCache(native_context, shared, code,
+ info->osr_ast_id());
+ }
}
bool GetOptimizedCodeNow(CompilationJob* job) {
@@ -773,7 +793,7 @@ bool GetOptimizedCodeNow(CompilationJob* job) {
// Success!
job->RecordOptimizedCompilationStats();
DCHECK(!isolate->has_pending_exception());
- InsertCodeIntoOptimizedCodeMap(info);
+ InsertCodeIntoOptimizedCodeCache(info);
RecordFunctionCompilation(CodeEventListener::LAZY_COMPILE_TAG, info);
return true;
}
@@ -848,7 +868,7 @@ MaybeHandle<Code> GetOptimizedCode(Handle<JSFunction> function,
DCHECK_IMPLIES(ignition_osr, FLAG_ignition_osr);
Handle<Code> cached_code;
- if (GetCodeFromOptimizedCodeMap(function, osr_ast_id)
+ if (GetCodeFromOptimizedCodeCache(function, osr_ast_id)
.ToHandle(&cached_code)) {
if (FLAG_trace_opt) {
PrintF("[found optimized code for ");
@@ -1001,10 +1021,7 @@ CompilationJob::Status FinalizeOptimizedCompilationJob(CompilationJob* job) {
} else if (job->FinalizeJob() == CompilationJob::SUCCEEDED) {
job->RecordOptimizedCompilationStats();
RecordFunctionCompilation(CodeEventListener::LAZY_COMPILE_TAG, info);
- if (shared->SearchOptimizedCodeMap(info->context()->native_context(),
- info->osr_ast_id()) == nullptr) {
- InsertCodeIntoOptimizedCodeMap(info);
- }
+ InsertCodeIntoOptimizedCodeCache(info);
if (FLAG_trace_opt) {
PrintF("[completed optimizing ");
info->closure()->ShortPrint();
@@ -1035,73 +1052,71 @@ MaybeHandle<Code> GetLazyCode(Handle<JSFunction> function) {
TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("v8.compile"), "V8.CompileCode");
AggregatedHistogramTimerScope timer(isolate->counters()->compile_lazy());
- Handle<Code> cached_code;
- if (GetCodeFromOptimizedCodeMap(function, BailoutId::None())
- .ToHandle(&cached_code)) {
- if (FLAG_trace_opt) {
- PrintF("[found optimized code for ");
- function->ShortPrint();
- PrintF(" during unoptimized compile]\n");
+ if (function->shared()->is_compiled()) {
+ // Function has already been compiled, get the optimized code if possible,
+ // otherwise return baseline code.
+ Handle<Code> cached_code;
+ if (GetCodeFromOptimizedCodeCache(function, BailoutId::None())
+ .ToHandle(&cached_code)) {
+ if (FLAG_trace_opt) {
+ PrintF("[found optimized code for ");
+ function->ShortPrint();
+ PrintF(" during unoptimized compile]\n");
+ }
+ DCHECK(function->shared()->is_compiled());
+ return cached_code;
}
- DCHECK(function->shared()->is_compiled());
- return cached_code;
- }
- if (function->shared()->is_compiled() &&
- function->shared()->marked_for_tier_up()) {
- DCHECK(FLAG_mark_shared_functions_for_tier_up);
+ if (function->shared()->marked_for_tier_up()) {
+ DCHECK(FLAG_mark_shared_functions_for_tier_up);
- function->shared()->set_marked_for_tier_up(false);
+ function->shared()->set_marked_for_tier_up(false);
- if (FLAG_trace_opt) {
- PrintF("[optimizing method ");
- function->ShortPrint();
- PrintF(" eagerly (shared function marked for tier up)]\n");
- }
+ if (FLAG_trace_opt) {
+ PrintF("[optimizing method ");
+ function->ShortPrint();
+ PrintF(" eagerly (shared function marked for tier up)]\n");
+ }
- Handle<Code> code;
- if (GetOptimizedCodeMaybeLater(function).ToHandle(&code)) {
- return code;
+ Handle<Code> code;
+ if (GetOptimizedCodeMaybeLater(function).ToHandle(&code)) {
+ return code;
+ }
}
- }
- if (function->shared()->is_compiled()) {
return Handle<Code>(function->shared()->code());
- }
-
- if (function->shared()->HasBytecodeArray()) {
- Handle<Code> entry = isolate->builtins()->InterpreterEntryTrampoline();
- function->shared()->ReplaceCode(*entry);
- return entry;
- }
+ } else {
+ // Function doesn't have any baseline compiled code, compile now.
+ DCHECK(!function->shared()->HasBytecodeArray());
- ParseInfo parse_info(handle(function->shared()));
- Zone compile_zone(isolate->allocator(), ZONE_NAME);
- CompilationInfo info(&compile_zone, &parse_info, isolate, function);
- if (FLAG_preparser_scope_analysis) {
- Handle<SharedFunctionInfo> shared(function->shared());
- Handle<Script> script(Script::cast(function->shared()->script()));
- if (script->HasPreparsedScopeData()) {
- parse_info.preparsed_scope_data()->Deserialize(
- script->GetPreparsedScopeData());
+ ParseInfo parse_info(handle(function->shared()));
+ Zone compile_zone(isolate->allocator(), ZONE_NAME);
+ CompilationInfo info(&compile_zone, &parse_info, isolate, function);
+ if (FLAG_experimental_preparser_scope_analysis) {
+ Handle<SharedFunctionInfo> shared(function->shared());
+ Handle<Script> script(Script::cast(function->shared()->script()));
+ if (script->HasPreparsedScopeData()) {
+ parse_info.preparsed_scope_data()->Deserialize(
+ script->preparsed_scope_data());
+ }
}
- }
- Compiler::ConcurrencyMode inner_function_mode =
- FLAG_compiler_dispatcher_eager_inner ? Compiler::CONCURRENT
- : Compiler::NOT_CONCURRENT;
- Handle<Code> result;
- ASSIGN_RETURN_ON_EXCEPTION(
- isolate, result, GetUnoptimizedCode(&info, inner_function_mode), Code);
-
- if (FLAG_always_opt && !info.shared_info()->HasAsmWasmData()) {
- Handle<Code> opt_code;
- if (GetOptimizedCode(function, Compiler::NOT_CONCURRENT)
- .ToHandle(&opt_code)) {
- result = opt_code;
+ Compiler::ConcurrencyMode inner_function_mode =
+ FLAG_compiler_dispatcher_eager_inner ? Compiler::CONCURRENT
+ : Compiler::NOT_CONCURRENT;
+ Handle<Code> result;
+ ASSIGN_RETURN_ON_EXCEPTION(
+ isolate, result, GetUnoptimizedCode(&info, inner_function_mode), Code);
+
+ if (FLAG_always_opt && !info.shared_info()->HasAsmWasmData()) {
+ Handle<Code> opt_code;
+ if (GetOptimizedCode(function, Compiler::NOT_CONCURRENT)
+ .ToHandle(&opt_code)) {
+ result = opt_code;
+ }
}
- }
- return result;
+ return result;
+ }
}
@@ -1177,9 +1192,9 @@ Handle<SharedFunctionInfo> CompileToplevel(CompilationInfo* info) {
if (!script.is_null()) {
script->set_compilation_state(Script::COMPILATION_STATE_COMPILED);
- if (FLAG_preparser_scope_analysis) {
- Handle<FixedUint32Array> data(
- parse_info->preparsed_scope_data()->Serialize(isolate));
+ if (FLAG_experimental_preparser_scope_analysis) {
+ Handle<PodArray<uint32_t>> data =
+ parse_info->preparsed_scope_data()->Serialize(isolate);
script->set_preparsed_scope_data(*data);
}
}
@@ -1874,18 +1889,17 @@ void Compiler::PostInstantiation(Handle<JSFunction> function,
function->MarkForOptimization();
}
- Code* code = shared->SearchOptimizedCodeMap(
- function->context()->native_context(), BailoutId::None());
- if (code != nullptr) {
- // Caching of optimized code enabled and optimized code found.
- DCHECK(!code->marked_for_deoptimization());
- DCHECK(function->shared()->is_compiled());
- function->ReplaceCode(code);
- }
-
if (shared->is_compiled()) {
// TODO(mvstanton): pass pretenure flag to EnsureLiterals.
JSFunction::EnsureLiterals(function);
+
+ Code* code = function->feedback_vector()->optimized_code();
+ if (code != nullptr) {
+ // Caching of optimized code enabled and optimized code found.
+ DCHECK(!code->marked_for_deoptimization());
+ DCHECK(function->shared()->is_compiled());
+ function->ReplaceCode(code);
+ }
}
}