From 4320933925b324acf74fce95b8916552510efe43 Mon Sep 17 00:00:00 2001 From: Alexander Markov Date: Fri, 20 Nov 2020 22:40:14 +0000 Subject: [PATCH] [vm] Add deopt info for runtime calls in slow path Fixes https://github.com/dart-lang/sdk/issues/44266 TEST=runtime/observatory/tests/service/pause_on_exception_from_slow_path_test.dart Change-Id: I35736ea9aab4e61f14b304dbe7ac93a771145bdb Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/173360 Commit-Queue: Alexander Markov Reviewed-by: Ryan Macnak --- ...ause_on_exception_from_slow_path_test.dart | 39 +++++++++++++++++++ .../tests/service/service_kernel.status | 1 + .../compiler/backend/flow_graph_compiler.cc | 3 +- 3 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 runtime/observatory/tests/service/pause_on_exception_from_slow_path_test.dart diff --git a/runtime/observatory/tests/service/pause_on_exception_from_slow_path_test.dart b/runtime/observatory/tests/service/pause_on_exception_from_slow_path_test.dart new file mode 100644 index 00000000000..4b6438026c0 --- /dev/null +++ b/runtime/observatory/tests/service/pause_on_exception_from_slow_path_test.dart @@ -0,0 +1,39 @@ +// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. +// VMOptions=--deterministic --optimization-counter-threshold=1000 + +import 'dart:convert'; + +import 'package:observatory/service_io.dart'; +import 'package:test/test.dart'; +import 'test_helper.dart'; +import 'service_test_common.dart'; + +class X { + late String _y; + + @pragma('vm:never-inline') + String get y => _y; +} + +testeeMain() async { + final x = X(); + x._y = ""; + for (var i = 0; i < 2000; i++) x.y; + + X().y; +} + +var tests = [ + hasStoppedWithUnhandledException, + (Isolate isolate) async { + print("We stopped!"); + var stack = await isolate.getStack(); + } +]; + +main(args) => runIsolateTests(args, tests, + pause_on_unhandled_exceptions: true, + testeeConcurrent: testeeMain, + extraArgs: extraDebuggingArgs); diff --git a/runtime/observatory/tests/service/service_kernel.status b/runtime/observatory/tests/service/service_kernel.status index d8996be4233..7a297eb92cd 100644 --- a/runtime/observatory/tests/service/service_kernel.status +++ b/runtime/observatory/tests/service/service_kernel.status @@ -153,6 +153,7 @@ next_through_simple_linear_2_test: SkipByDesign next_through_simple_linear_test: SkipByDesign parameters_in_scope_at_entry_test: Skip, Timeout pause_idle_isolate_test: Skip, Timeout +pause_on_exception_from_slow_path_test: SkipByDesign pause_on_exceptions_test: SkipByDesign pause_on_start_then_step_test: SkipByDesign pause_on_unhandled_async_exceptions2_test: SkipByDesign diff --git a/runtime/vm/compiler/backend/flow_graph_compiler.cc b/runtime/vm/compiler/backend/flow_graph_compiler.cc index b8b18c7a65c..05024028339 100644 --- a/runtime/vm/compiler/backend/flow_graph_compiler.cc +++ b/runtime/vm/compiler/backend/flow_graph_compiler.cc @@ -849,6 +849,7 @@ CompilerDeoptInfo* FlowGraphCompiler::AddDeoptIndexAtCall(intptr_t deopt_id) { CompilerDeoptInfo* FlowGraphCompiler::AddSlowPathDeoptInfo(intptr_t deopt_id, Environment* env) { ASSERT(deopt_id != DeoptId::kNone); + deopt_id = DeoptId::ToDeoptAfter(deopt_id); CompilerDeoptInfo* info = new (zone()) CompilerDeoptInfo(deopt_id, ICData::kDeoptUnknown, 0, env); info->set_pc_offset(assembler()->CodeSize()); @@ -3083,7 +3084,7 @@ void ThrowErrorSlowPathCode::EmitNativeCode(FlowGraphCompiler* compiler) { instruction()->token_pos(), try_index_); AddMetadataForRuntimeCall(compiler); compiler->RecordSafepoint(locs, num_args); - if ((try_index_ != kInvalidTryIndex) || + if (!FLAG_precompiled_mode || (try_index_ != kInvalidTryIndex) || (compiler->CurrentTryIndex() != kInvalidTryIndex)) { Environment* env = compiler->SlowPathEnvironmentFor(instruction(), num_args);