| Index: src/compiler.cc
|
| diff --git a/src/compiler.cc b/src/compiler.cc
|
| index b6de99c343f142540beff1436f77214c99d3f758..8b7e65ac96c6c1517f2993f1e57a7abfa4b4e896 100644
|
| --- a/src/compiler.cc
|
| +++ b/src/compiler.cc
|
| @@ -1120,166 +1120,6 @@ Handle<Code> Compiler::InstallOptimizedCode(
|
| }
|
|
|
|
|
| -static uint32_t CurrentPcOffset(Isolate* isolate,
|
| - Handle<JSFunction> function,
|
| - Handle<Code> unoptimized) {
|
| - JavaScriptFrameIterator it(isolate);
|
| - JavaScriptFrame* frame = it.frame();
|
| - ASSERT(frame->function() == *function);
|
| - ASSERT(frame->LookupCode() == *unoptimized);
|
| - ASSERT(unoptimized->contains(frame->pc()));
|
| -
|
| - // Use linear search of the unoptimized code's back edge table to find
|
| - // the AST id matching the PC.
|
| - return static_cast<uint32_t>(frame->pc() - unoptimized->instruction_start());
|
| -}
|
| -
|
| -
|
| -static bool IsSuitableForOnStackReplacement(Isolate* isolate,
|
| - Handle<JSFunction> function,
|
| - Handle<Code> unoptimized) {
|
| - // Keep track of whether we've succeeded in optimizing.
|
| - if (!unoptimized->optimizable()) return false;
|
| - // If we are trying to do OSR when there are already optimized
|
| - // activations of the function, it means (a) the function is directly or
|
| - // indirectly recursive and (b) an optimized invocation has been
|
| - // deoptimized so that we are currently in an unoptimized activation.
|
| - // Check for optimized activations of this function.
|
| - for (JavaScriptFrameIterator it(isolate); !it.done(); it.Advance()) {
|
| - JavaScriptFrame* frame = it.frame();
|
| - if (frame->is_optimized() && frame->function() == *function) return false;
|
| - }
|
| -
|
| - return true;
|
| -}
|
| -
|
| -
|
| -Handle<Code> Compiler::CompileForOnStackReplacement(
|
| - Handle<JSFunction> function) {
|
| - Isolate* isolate = function->GetIsolate();
|
| - Handle<Code> unoptimized(function->shared()->code(), isolate);
|
| -
|
| - Deoptimizer::RevertInterruptCode(isolate, *unoptimized);
|
| - if (FLAG_trace_osr) {
|
| - PrintF("[OSR - restored original interrupt calls in ");
|
| - function->PrintName();
|
| - PrintF("]\n");
|
| - }
|
| -
|
| - if (IsSuitableForOnStackReplacement(isolate, function, unoptimized)) {
|
| - // Find the PC offset in unoptimized code and translate to an AST id.
|
| - uint32_t pc_offset = CurrentPcOffset(isolate, function, unoptimized);
|
| - BailoutId ast_id = unoptimized->TranslatePcOffsetToAstId(pc_offset);
|
| - ASSERT(!ast_id.IsNone());
|
| - if (FLAG_trace_osr) {
|
| - PrintF("[OSR - replacing at AST id %d in ", ast_id.ToInt());
|
| - function->PrintName();
|
| - PrintF("]\n");
|
| - }
|
| -
|
| - // Attempt OSR compilation.
|
| - Handle<Code> result = JSFunction::CompileOsr(
|
| - function, ast_id, CLEAR_EXCEPTION);
|
| -
|
| - if (!result.is_null() && result->kind() == Code::OPTIMIZED_FUNCTION) {
|
| - // OSR compilation succeeded.
|
| - DeoptimizationInputData* data =
|
| - DeoptimizationInputData::cast(result->deoptimization_data());
|
| - if (FLAG_trace_osr) {
|
| - PrintF("[OSR - entry, offset %d in optimized code]\n",
|
| - data->OsrPcOffset()->value());
|
| - }
|
| - ASSERT(BailoutId(data->OsrAstId()->value()) == ast_id);
|
| - return result;
|
| - }
|
| - }
|
| -
|
| - if (FLAG_trace_osr) {
|
| - PrintF("[OSR - attempt failed for ");
|
| - function->PrintName();
|
| - PrintF("]\n");
|
| - }
|
| - return Handle<Code>::null();
|
| -}
|
| -
|
| -
|
| -Handle<Code> Compiler::CompileForConcurrentOSR(Handle<JSFunction> function) {
|
| - Isolate* isolate = function->GetIsolate();
|
| - Handle<Code> unoptimized(function->shared()->code(), isolate);
|
| -
|
| - uint32_t pc_offset = CurrentPcOffset(isolate, function, unoptimized);
|
| -
|
| - if (isolate->optimizing_compiler_thread()->
|
| - IsQueuedForOSR(function, pc_offset)) {
|
| - // Still waiting for the optimizing compiler thread to finish. Carry on.
|
| - if (FLAG_trace_osr) {
|
| - PrintF("[COSR - polling recompile tasks for ");
|
| - function->PrintName();
|
| - PrintF("]\n");
|
| - }
|
| - return Handle<Code>::null();
|
| - }
|
| -
|
| - OptimizingCompiler* compiler = isolate->optimizing_compiler_thread()->
|
| - FindReadyOSRCandidate(function, pc_offset);
|
| -
|
| - if (compiler != NULL) {
|
| - BailoutId ast_id = compiler->info()->osr_ast_id();
|
| -
|
| - if (FLAG_trace_osr) {
|
| - PrintF("[COSR - optimization complete for ");
|
| - function->PrintName();
|
| - PrintF(", restoring interrupt calls]\n");
|
| - }
|
| - Deoptimizer::RevertInterruptCode(isolate, *unoptimized);
|
| -
|
| - // TODO(titzer): don't install the OSR code into the function.
|
| - Handle<Code> result = InstallOptimizedCode(compiler);
|
| -
|
| - isolate->optimizing_compiler_thread()->RemoveStaleOSRCandidates();
|
| -
|
| - if (result.is_null()) {
|
| - if (FLAG_trace_osr) {
|
| - PrintF("[COSR - optimization failed for ");
|
| - function->PrintName();
|
| - PrintF("]\n");
|
| - }
|
| - return Handle<Code>::null();
|
| - }
|
| - // Check the result matches our expectations, and don't use it otherwise.
|
| - if (result->kind() == Code::OPTIMIZED_FUNCTION) {
|
| - DeoptimizationInputData* data =
|
| - DeoptimizationInputData::cast(result->deoptimization_data());
|
| -
|
| - if (data->OsrPcOffset()->value() >= 0) {
|
| - ASSERT(BailoutId(data->OsrAstId()->value()) == ast_id);
|
| - if (FLAG_trace_osr) {
|
| - PrintF("[COSR - entry at AST id %d, offset %d in optimized code]\n",
|
| - ast_id.ToInt(), data->OsrPcOffset()->value());
|
| - }
|
| - return result;
|
| - }
|
| - }
|
| - return Handle<Code>::null();
|
| - }
|
| -
|
| - if (!IsSuitableForOnStackReplacement(isolate, function, unoptimized)) {
|
| - if (FLAG_trace_osr) {
|
| - PrintF("[COSR - ");
|
| - function->PrintName();
|
| - PrintF(" is unsuitable, restoring interrupt calls]\n");
|
| - }
|
| - Deoptimizer::RevertInterruptCode(isolate, *unoptimized);
|
| - return Handle<Code>::null();
|
| - }
|
| -
|
| - if (!RecompileConcurrent(function, pc_offset)) {
|
| - Deoptimizer::RevertInterruptCode(isolate, *unoptimized);
|
| - }
|
| - return Handle<Code>::null();
|
| -}
|
| -
|
| -
|
| Handle<SharedFunctionInfo> Compiler::BuildFunctionInfo(FunctionLiteral* literal,
|
| Handle<Script> script) {
|
| // Precondition: code has been parsed and scopes have been analyzed.
|
|
|