Index: src/compiler.cc |
diff --git a/src/compiler.cc b/src/compiler.cc |
index bf7702be4f51558e920372fb4bd90d9942a36e33..8bd534a334aed5b1236fe4e0fb570edd0b92332f 100644 |
--- a/src/compiler.cc |
+++ b/src/compiler.cc |
@@ -20,7 +20,6 @@ |
#include "src/crankshaft/hydrogen.h" |
#include "src/debug/debug.h" |
#include "src/debug/liveedit.h" |
-#include "src/deoptimizer.h" |
#include "src/frames-inl.h" |
#include "src/full-codegen/full-codegen.h" |
#include "src/globals.h" |
@@ -778,72 +777,6 @@ CompilationJob::Status FinalizeOptimizedCompilationJob(CompilationJob* job) { |
return CompilationJob::FAILED; |
} |
-class InterpreterActivationsFinder : public ThreadVisitor, |
- public OptimizedFunctionVisitor { |
- public: |
- explicit InterpreterActivationsFinder(SharedFunctionInfo* shared) |
- : shared_(shared), has_activations_(false) {} |
- |
- void VisitThread(Isolate* isolate, ThreadLocalTop* top) { |
- Address* activation_pc_address = nullptr; |
- JavaScriptFrameIterator it(isolate, top); |
- for (; !it.done(); it.Advance()) { |
- JavaScriptFrame* frame = it.frame(); |
- if (FLAG_ignition_osr && frame->is_optimized() && |
- frame->function()->shared() == shared_) { |
- // There might be optimized OSR code active on the stack that is not |
- // reachable through a function. We count this as an activation. |
- has_activations_ = true; |
- } |
- if (frame->is_interpreted() && frame->function()->shared() == shared_) { |
- has_activations_ = true; |
- activation_pc_address = frame->pc_address(); |
- } |
- } |
- |
- if (activation_pc_address) { |
- activation_pc_addresses_.push_back(activation_pc_address); |
- } |
- } |
- |
- void VisitFunction(JSFunction* function) { |
- if (function->Inlines(shared_)) has_activations_ = true; |
- } |
- |
- void EnterContext(Context* context) {} |
- void LeaveContext(Context* context) {} |
- |
- bool MarkActivationsForBaselineOnReturn(Isolate* isolate) { |
- if (activation_pc_addresses_.empty()) return false; |
- |
- for (Address* activation_pc_address : activation_pc_addresses_) { |
- DCHECK(isolate->inner_pointer_to_code_cache() |
- ->GetCacheEntry(*activation_pc_address) |
- ->code->is_interpreter_trampoline_builtin()); |
- *activation_pc_address = |
- isolate->builtins()->InterpreterMarkBaselineOnReturn()->entry(); |
- } |
- return true; |
- } |
- |
- bool has_activations() { return has_activations_; } |
- |
- private: |
- SharedFunctionInfo* shared_; |
- bool has_activations_; |
- std::vector<Address*> activation_pc_addresses_; |
-}; |
- |
-bool HasInterpreterActivations( |
- Isolate* isolate, InterpreterActivationsFinder* activations_finder) { |
- activations_finder->VisitThread(isolate, isolate->thread_local_top()); |
- isolate->thread_manager()->IterateArchivedThreads(activations_finder); |
- // There might be optimized functions that rely on bytecode being around. We |
- // need to prevent switching the given function to baseline code. |
- Deoptimizer::VisitAllOptimizedFunctions(isolate, activations_finder); |
- return activations_finder->has_activations(); |
-} |
- |
MaybeHandle<Code> GetBaselineCode(Handle<JSFunction> function) { |
Isolate* isolate = function->GetIsolate(); |
VMState<COMPILER> state(isolate); |
@@ -879,31 +812,6 @@ MaybeHandle<Code> GetBaselineCode(Handle<JSFunction> function) { |
return MaybeHandle<Code>(); |
} |
- // TODO(4280): For now we disable switching to baseline code in the presence |
- // of interpreter activations of the given function. The reasons is that the |
- // underlying bytecode is cleared below. Note that this only applies in case |
- // the --ignition-preserve-bytecode flag is not passed. |
- if (!FLAG_ignition_preserve_bytecode) { |
- InterpreterActivationsFinder activations_finder(function->shared()); |
- if (HasInterpreterActivations(isolate, &activations_finder)) { |
- if (FLAG_trace_opt) { |
- OFStream os(stdout); |
- os << "[unable to switch " << Brief(*function) << " due to activations]" |
- << std::endl; |
- } |
- |
- if (activations_finder.MarkActivationsForBaselineOnReturn(isolate)) { |
- if (FLAG_trace_opt) { |
- OFStream os(stdout); |
- os << "[marking " << Brief(function->shared()) |
- << " for baseline recompilation on return]" << std::endl; |
- } |
- } |
- |
- return MaybeHandle<Code>(); |
- } |
- } |
- |
if (FLAG_trace_opt) { |
OFStream os(stdout); |
os << "[switching method " << Brief(*function) << " to baseline code]" |
@@ -922,12 +830,6 @@ MaybeHandle<Code> GetBaselineCode(Handle<JSFunction> function) { |
return MaybeHandle<Code>(); |
} |
- // TODO(4280): For now we play it safe and remove the bytecode array when we |
- // switch to baseline code. We might consider keeping around the bytecode so |
- // that it can be used as the "source of truth" eventually. Note that this |
- // only applies in case the --ignition-preserve-bytecode flag is not passed. |
- if (!FLAG_ignition_preserve_bytecode) shared->ClearBytecodeArray(); |
- |
// Update the shared function info with the scope info. |
InstallSharedScopeInfo(&info, shared); |
@@ -1312,19 +1214,6 @@ bool Compiler::EnsureDeoptimizationSupport(CompilationInfo* info) { |
// TurboFan in this case. |
if (IsResumableFunction(shared->kind())) return false; |
- // TODO(4280): For now we disable switching to baseline code in the presence |
- // of interpreter activations of the given function. The reasons is that the |
- // underlying bytecode is cleared below. The expensive check for activations |
- // only needs to be done when the given function has bytecode, otherwise we |
- // can be sure there are no activations. Note that this only applies in case |
- // the --ignition-preserve-bytecode flag is not passed. |
- if (!FLAG_ignition_preserve_bytecode && shared->HasBytecodeArray()) { |
- InterpreterActivationsFinder activations_finder(*shared); |
- if (HasInterpreterActivations(info->isolate(), &activations_finder)) { |
- return false; |
- } |
- } |
- |
// When we call PrepareForSerializing below, we will change the shared |
// ParseInfo. Make sure to reset it. |
bool old_will_serialize_value = info->parse_info()->will_serialize(); |
@@ -1341,14 +1230,6 @@ bool Compiler::EnsureDeoptimizationSupport(CompilationInfo* info) { |
info->parse_info()->set_will_serialize(old_will_serialize_value); |
- // TODO(4280): For now we play it safe and remove the bytecode array when we |
- // switch to baseline code. We might consider keeping around the bytecode so |
- // that it can be used as the "source of truth" eventually. Note that this |
- // only applies in case the --ignition-preserve-bytecode flag is not passed. |
- if (!FLAG_ignition_preserve_bytecode && shared->HasBytecodeArray()) { |
- shared->ClearBytecodeArray(); |
- } |
- |
// The scope info might not have been set if a lazily compiled |
// function is inlined before being called for the first time. |
if (shared->scope_info() == ScopeInfo::Empty(info->isolate())) { |