Commit Graph

185 Commits

Author SHA1 Message Date
Alexander Markov 9e2ce9a773 [vm,bytecode] Avoid duplicated initializing StoreFieldTOS
This is the follow-up for 46cef9bfdd.
After that change, VM's optimizer (canonicalization) removes
initializing stores which store null, even if they're overwriting the
result of another initializing store. This causes incorrect behavior
in cases like this:

class A {
  int x = 3;
  A() : x = null {}
}

To accomodate for this change in the VM's optimizer, bytecode generator
should elide duplicate stores, similarly to AST-based flow graph
builder.

Fixes language_2/field_parameter_test in AOT mode with bytecode.

Change-Id: I9b1e25840f639d88bf62dc990f183878ecf1b59b
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/121649
Reviewed-by: Ryan Macnak <rmacnak@google.com>
Commit-Queue: Alexander Markov <alexmarkov@google.com>
2019-10-15 18:57:19 +00:00
Alexander Markov 3c3bd8d7c9 [vm,aot,bytecode] Support obfuscation
In order to support obfuscation, string constants are decoupled
from public names in bytecode (names are obfuscated, but string
constants aren't). List of protected names is written in a separate
section in bytecode component.

Obfuscator is extended to support getter and setter
names coming from bytecode.

Change-Id: I8e8d820d1a8b97e32e8ad1b064b827bdb017430b
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/121261
Commit-Queue: Alexander Markov <alexmarkov@google.com>
Reviewed-by: Régis Crelier <regis@google.com>
Reviewed-by: Ryan Macnak <rmacnak@google.com>
2019-10-14 18:12:29 +00:00
Alexander Markov 8f679ab9f9 [vm,bytecode] Swap == operands in switch cases
For a switch statement

  switch(foo) {
    case c_1: ...
    ...
    case c_N: ...
  }

Bytecode was calling foo.operator==(c_i). This is less efficient than
c_i.operator==(foo), as c_i is a constant with a known actual type
and operator== can be always devirtualized and inlined.

Change-Id: I786ea193de1fa1830854602318e436f601296f5e
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/121405
Reviewed-by: Ryan Macnak <rmacnak@google.com>
Reviewed-by: Régis Crelier <regis@google.com>
Commit-Queue: Alexander Markov <alexmarkov@google.com>
2019-10-11 21:11:40 +00:00
Alexander Markov 62ee78eeec [vm,bytecode] Generate calls for causal-async-stacks more consistently
In order to support causal-async-stacks, the following synthetic calls
are inserted: _asyncStackTraceHelper, _setAsyncThreadStackTrace and
_clearAsyncThreadStackTrace.

_asyncStackTraceHelper is always generated in the async transformation.
_setAsyncThreadStackTrace and _clearAsyncThreadStackTrace are inserted
during bytecode generation (or in the flow graph builder in case of AST
pipeline). If bytecode generation options are set inconsistently with
--causal-async-stacks VM option, then it was possible that
_asyncStackTraceHelper was generated but other calls were not generated,
causing incorrect (full, non-truncated) async stack traces. This also
causes performance regression as collecting full stack traces takes
much more time.

This change makes generation of all these calls more consistent: if
causal async stacks are disabled during bytecode generation, then all
three calls are omitted. Also, in case these calls were generated and
present in bytecode, but VM option --causal-async-stacks is disabled,
then bytecode flow graph builder turns all these three calls into no-ops.

Change-Id: I93eb1d83c675ee093799bb8e37ca3d60a3c5c19d
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/120927
Commit-Queue: Alexander Markov <alexmarkov@google.com>
Reviewed-by: Ryan Macnak <rmacnak@google.com>
Reviewed-by: Régis Crelier <regis@google.com>
2019-10-09 22:10:21 +00:00
Alexander Markov 3bb32f6778 [vm/bytecode] Generate complex conditions more efficiently in bytecode
Change-Id: I7cbf3a91dc96843f10af9560a58269badbe31bac
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/109729
Reviewed-by: Ryan Macnak <rmacnak@google.com>
Reviewed-by: Régis Crelier <regis@google.com>
Commit-Queue: Alexander Markov <alexmarkov@google.com>
2019-10-09 19:32:54 +00:00
Alexander Markov 2ca6bc29b3 [vm,bytecode] More efficient bytecode for calls through fields/getters
Previously, calls through field/getter were generated as dynamic calls
because InterfaceCall with field/getter target doesn't correctly
represent what such call should do. This results in a quite inefficient
code in AOT mode.

With this change, calls through fields/getters are decomposed into two
calls, while keeping the same order of evaluation.

Change-Id: Ieb33927c1b39d1b4d8eafb7bd542675820474068
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/120628
Commit-Queue: Alexander Markov <alexmarkov@google.com>
Reviewed-by: Régis Crelier <regis@google.com>
2019-10-08 22:27:10 +00:00
Régis Crelier 735d8b7c64 [VM/nnbd] Propagate nnbd flag on Library from kernel to VM and bytecode.
Also fix a few obsolete comments.

Change-Id: Ice4d36abb950575316db02c3dad2b94a505d7e0b
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/120743
Commit-Queue: Régis Crelier <regis@google.com>
Reviewed-by: Siva Annamalai <asiva@google.com>
Reviewed-by: Ryan Macnak <rmacnak@google.com>
Reviewed-by: Alexander Markov <alexmarkov@google.com>
2019-10-08 22:25:20 +00:00
Alexander Markov ae251757a9 [vm,aot,bytecode] Performance fixes
* AOT call specializer handles devirtualized static calls to integer
  and double operations more efficiently, so direct call metadata
  should be preferred over specialized bytecode instructions.

* Avoid clearing 'inferredTypeMetadata', which contains inferred-type
  metadata for all members. Previously it was cleared after generating
  the first member by mistake.

Change-Id: Ieaa6ad74cc2168c30b0c9865d17b195c49f85744
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/120627
Reviewed-by: Ryan Macnak <rmacnak@google.com>
Reviewed-by: Régis Crelier <regis@google.com>
Commit-Queue: Alexander Markov <alexmarkov@google.com>
2019-10-07 23:06:09 +00:00
asiva 01ebf92dde [VM] Consume extension member/is late flag setting when reading kernel file.
Consume the extension flag setting for functions and the extension flag and is late
flags for fields when reading kernel file and set bit in Function/Field objects.

Change-Id: I661d30d53e817d968151d2b95474a6daf918de13
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/118000
Reviewed-by: Alexander Markov <alexmarkov@google.com>
Commit-Queue: Siva Annamalai <asiva@google.com>
2019-10-07 22:43:19 +00:00
Alexander Markov c77c2728dd [vm,aot,bytecode] Handle inferred-type metadata when generating bytecode
Change-Id: Ifadb25c782db5c95025e7275daf0676abd73cf49
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/120341
Reviewed-by: Régis Crelier <regis@google.com>
Commit-Queue: Alexander Markov <alexmarkov@google.com>
2019-10-06 16:51:43 +00:00
Zichang Guo 28f21d4e99 [vm/bytecode] correct source position of clearAsyncThreadStackTrace
source position of clearAsyncThreadStackTrace should not have a valid source position.
This fixes code coverage regression.

Bug: https://github.com/dart-lang/sdk/issues/38628
Change-Id: I41b1822a07b9d4becdda58bb810f03733289cd2f
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/120002
Commit-Queue: Zichang Guo <zichangguo@google.com>
Reviewed-by: Alexander Markov <alexmarkov@google.com>
2019-10-04 03:12:53 +00:00
Alexander Markov 07a63a17a4 [vm,aot,bytecode] Handle procedure-attributes metadata when generating bytecode
Change-Id: I26e1a15d979ce13ca60298de28ced49b6882cf52
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/119765
Commit-Queue: Alexander Markov <alexmarkov@google.com>
Reviewed-by: Ryan Macnak <rmacnak@google.com>
Reviewed-by: Régis Crelier <regis@google.com>
2019-10-03 16:27:33 +00:00
Alexander Markov 1ed707703d [vm/bytecode] Mark try blocks generated for try/finally as synthetic
This matches behavior of AST-based flow graph builder. Debugger ignores
synthetic (is_generated) try blocks when it figures out if thrown
exception is unhandled, so in order to ignore all try/finally blocks
they should be marked as synthetic.

Fixes https://github.com/dart-lang/sdk/issues/38697

Change-Id: I06840362a255b500e1e9317af90a61bbdea2a310
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/119726
Reviewed-by: Ryan Macnak <rmacnak@google.com>
Reviewed-by: Régis Crelier <regis@google.com>
Commit-Queue: Alexander Markov <alexmarkov@google.com>
2019-10-02 23:15:11 +00:00
Dmitry Stefantsov bdf6b9505e [cfe] Ask for subtype checking mode explicitly
The interpretation of the subtype check result depends on the mode.  In partial
NNBD mode all type errors that wouldn't be errors in non-NNBD programs should
become warnings.  In full NNBD mode all such errors are errors.  This CL adds
the mode explicitly to the interface of the subtype check as a parameter.

Bug: http://dartbug.com/38673
Change-Id: I14bcdd260618530cfdd8189c01abba7469a16679
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/119545
Reviewed-by: Johnni Winther <johnniwinther@google.com>
Commit-Queue: Dmitry Stefantsov <dmitryas@google.com>
2019-10-02 11:30:29 +00:00
Alexander Markov 5920048fa2 [vm,aot,bytecode] Handle direct-call metadata when generating bytecode
AOT transformations add vm.direct-call.metadata with devirtualization
information to AST nodes.

Bytecode generator should take this information into account when
generating bytecode in case of AOT. Bytecode format is extended with
CheckReceiverForNull and UncheckedDirectCall instructions, and
DirectCallViaDynamicForwarder constant pool entry in order to represent
devirtualized calls.

Change-Id: I697432ddd0b58d2d0413715132ba5e90eb606ec1
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/119201
Reviewed-by: Régis Crelier <regis@google.com>
Reviewed-by: Ryan Macnak <rmacnak@google.com>
Commit-Queue: Alexander Markov <alexmarkov@google.com>
2019-10-01 00:20:48 +00:00
Ryan Macnak 14983a2941 [vm/bytecode] Add timeline events for major compilation phases.
Change-Id: Ie2a1f8a5979bb58133535b7698c5137d4ab2b046
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/118648
Reviewed-by: Jens Johansen <jensj@google.com>
Reviewed-by: Alexander Markov <alexmarkov@google.com>
Commit-Queue: Ryan Macnak <rmacnak@google.com>
2019-09-30 16:36:09 +00:00
Alexander Markov dd65f97118 [vm/bytecode] Save/restore globalDebuggingNames around bytecode generation
Global variable globalDebuggingNames in the front-end can accumulate a
lot of garbage (all ASTs) if toString() is called from an AST node.

Bytecode generator uses Expression.getStaticType a lot, which calls
Expression.getStaticTypeAsInstanceOf, which sometimes calls toString()
when it throws an error (these crashes are tracked in
https://github.com/dart-lang/sdk/issues/34496 and bytecode generator
has a workaround to catch them).

As a result, after bytecode generation all ASTs were hanging out of
globalDebuggingNames, which leaks a lot of memory.

Fixes https://github.com/dart-lang/sdk/issues/38553

Change-Id: Ic1516d5ec9bf60861ae678e150c66d2e9394e2cd
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/118914
Commit-Queue: Alexander Markov <alexmarkov@google.com>
Reviewed-by: Ryan Macnak <rmacnak@google.com>
2019-09-26 03:24:42 +00:00
Alexander Markov e2a3f9a9d7 [vm/bytecode] Move bytecode metadata when creating a fresh component
When dropping AST and creating a new fresh component with bytecode,
bytecode metadata should not be left on the old component, as it might
cause higher memory usage in case of incremental compilation
(when old component is retained).

Issue: https://github.com/dart-lang/sdk/issues/38553
Change-Id: Ic315d7af7adc5ee57094a817ffcd3cb33c5e71c7
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/118902
Reviewed-by: Régis Crelier <regis@google.com>
Commit-Queue: Alexander Markov <alexmarkov@google.com>
2019-09-25 20:49:29 +00:00
Dmitry Stefantsov e034104f04 [cfe] Remove TypeEnvironment.*Type getters
The getters were returning types of undefined nullabilities.  Now the
nullability-aware getters on CoreTypes should be used instead.

Closes #38224.

Bug: http://dartbug.com/38224
Change-Id: I617a0ef8ee17ebd792c2bc1ec6477a5ee469fee1
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/118570
Reviewed-by: Johnni Winther <johnniwinther@google.com>
Commit-Queue: Dmitry Stefantsov <dmitryas@google.com>
2019-09-25 13:28:28 +00:00
Alexander Markov 3135eb569d [vm/bytecode] Fix initial scope in field initializers
Fixes language_2/async_await_test with bytecode in
dartk-reload-linux-release-x64 configuration.

Change-Id: I6e7c7ae89cea2be8e1948a7ea0314c679387aa06
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/117930
Reviewed-by: Régis Crelier <regis@google.com>
Commit-Queue: Alexander Markov <alexmarkov@google.com>
2019-09-19 01:46:34 +00:00
Alexander Markov 631e547c2f [vm/bytecode] Setup initial scope before the first CheckStack
Sometimes we need to stop at the first CheckStack and scan call stack in
the debugger, so debugger needs to know initial context level on function
entry, even before setting up initial context.

This change moves the first scope declaration before the first CheckStack.
Parameters which are not captured are also declared in the initial scope.
After creating an initial context we may add the 2nd scope, along with
captured parameters.

Fixes flaky crashes due to context level mismatch in
service/async_generator_breakpoint_test/1 with bytecode in debug mode.

Change-Id: I11ce1407ee58954b167e51a25302272b05365386
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/117296
Reviewed-by: Régis Crelier <regis@google.com>
Commit-Queue: Alexander Markov <alexmarkov@google.com>
2019-09-16 21:21:54 +00:00
Alexander Markov 3e1154cb5b [vm/bytecode] Move CheckStack after function type arguments handling
When generating deopt info in SIMDBC mode (DeoptInfoBuilder::AddCopy,
DeoptInfoBuilder::ToCpuRegisterSource) kSpecialDbcRegister source
locations are not supported.

In order to avoid such deopt info, this change moves CheckStack bytecode
instruction after function type arguments handling is finished (function
type arguments handling uses arguments descriptor which resides in
kArgsDescriptorsReg special DBC register). This placement of CheckStack is
also more aligned with what AST-based flow graph builder generates.

Fixes lib_2/math/min_max_test with bytecode in dartk-reload-mac-release-simdbc64
configuration.

Change-Id: I7d9863b8290a78a6e24e5806cc5053d55c93ce5c
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/117221
Reviewed-by: Régis Crelier <regis@google.com>
Commit-Queue: Alexander Markov <alexmarkov@google.com>
2019-09-13 23:03:55 +00:00
Alexander Markov 76bc894576 [vm/bytecode] Generate explicit DebugCheck for assignment to static field
Instead of always implying debugger stop at StoreStaticTOS bytecode,
bytecode generator now explicitly generates (or omits) DebugCheck bytecode.
This is needed to match behavior of AST flow graph builder of omitting
extra debugger stops when RHS expression is not trivial.

Fixes service/debugging_test with bytecode.

Change-Id: Id2e70998efb2a32a101fba4133ffa6a259ab1eb2
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/116443
Reviewed-by: Régis Crelier <regis@google.com>
Commit-Queue: Alexander Markov <alexmarkov@google.com>
2019-09-09 23:24:09 +00:00
Alexander Markov 4fbd758f9e [vm/bytecode] Optimize comparisons with null
BinaryTrees(RunTime): 72191.33325 us. -> 68058.06103333333 us.
(linux/x64, bytecode compiler enabled)

Issue: https://github.com/dart-lang/sdk/issues/36429

Change-Id: Ie5344d874f6b4afc5e8b6516fc6283d83963f17f
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/115601
Commit-Queue: Alexander Markov <alexmarkov@google.com>
Reviewed-by: Régis Crelier <regis@google.com>
2019-09-05 17:52:41 +00:00
Régis Crelier 15c1487874 [vm/bytecode] Allow breakpoint on rethrow; mark closures as debuggable or not.
Generated rethrow statements do not require a 'DebugCheck', but explicit rethrow
statements do, so that user breakpoints can be set on rethrow.
Add a IsDebuggable flag on bytecode closures and set it properly.
Remove unused code in a service test.
Add verbosity to debugger.

Change-Id: Ia436cbe62e38cfaec6f9fdf7f8cc2ee5607228e6
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/115602
Commit-Queue: Régis Crelier <regis@google.com>
Reviewed-by: Alexander Markov <alexmarkov@google.com>
2019-09-04 23:56:16 +00:00
Régis Crelier 5da853060c [vm/bytecode] Move prologue CheckStack opcode after closure context is copied.
The bytecode generator should not emit a CheckStack before the initial context
is properly setup. This fixes #38110.

Change-Id: I94000ebe698437d088c0e307a8735b11cfcd9c8f
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/115066
Reviewed-by: Alexander Markov <alexmarkov@google.com>
Commit-Queue: Régis Crelier <regis@google.com>
2019-08-30 21:22:29 +00:00
Alexander Markov d7c944b4c0 [vm/bytecode] Support library dependencies in bytecode for mirrors and vm-service.
Library dependencies are serialized in bytecode as extended annotations.

Fixes the following tests with bytecode:
co19_2/Language/Metadata/before_export_t01
co19_2/Language/Metadata/before_import_t01
service/library_dependency_test

Change-Id: Idfbac6fcd56318d994d179864f0f5fd7d95089a9
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/114928
Commit-Queue: Alexander Markov <alexmarkov@google.com>
Reviewed-by: Ryan Macnak <rmacnak@google.com>
Reviewed-by: Régis Crelier <regis@google.com>
2019-08-29 21:07:06 +00:00
Régis Crelier d57a8f7451 [vm/bytecode] Remove DebugCheck in synthetic non-local transfer (no source pos).
This fixes the following test:
service/async_star_step_out_test

Change-Id: I5def5fd277dcc4d32838c6ddb225441ece45e71f
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/114751
Commit-Queue: Régis Crelier <regis@google.com>
Reviewed-by: Régis Crelier <regis@google.com>
Reviewed-by: Alexander Markov <alexmarkov@google.com>
2019-08-28 22:32:31 +00:00
Régis Crelier a290271dea [vm/bytecode] Throw should be 'debug checked', but not ReThrow.
Since both throw and rethrow statements share the same 'Throw' bytecode opcode
(differentiated by an operand), we make the opcode not implicitly 'debug
checked' anymore.
Instead, we emit a 'DebugCheck' opcode for the throw statement only.

This fixes the following test:
service/async_single_step_exception_test

Change-Id: I4e540ea0a640fda5365d51933ce4e5125548e2f2
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/114754
Commit-Queue: Régis Crelier <regis@google.com>
Reviewed-by: Alexander Markov <alexmarkov@google.com>
2019-08-28 22:20:53 +00:00
Alexander Markov 6784bcb370 [vm/bytecode] Fix source position for catch clause
Fixes service/next_through_multi_catch_test with bytecode.

Change-Id: I095b3a784f3e59b64f493ec43b265a70f295a0f4
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/114880
Reviewed-by: Régis Crelier <regis@google.com>
Reviewed-by: Ryan Macnak <rmacnak@google.com>
Commit-Queue: Alexander Markov <alexmarkov@google.com>
2019-08-28 18:19:51 +00:00
Alexander Markov 5cbcc88304 [vm/bytecode] Add DebugCheck for variable set with as-expression RHS
This emulates behavior of AST-based flow graph builder which would
insert DebugStepCheck if RHS is LoadLocal.
As-expression generated by AST-based flow graph builder results
in LoadLocal (unless it's casting to a top type).

Fixes service/next_through_is_and_as_test with bytecode.

Change-Id: Icb809d42daf2a4ebbad22bfa92bc737406144489
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/114740
Reviewed-by: Régis Crelier <regis@google.com>
Commit-Queue: Alexander Markov <alexmarkov@google.com>
2019-08-28 02:27:03 +00:00
Régis Crelier 726762c4bd [vm/bytecode] Remove source information from setAsyncThreadStackTrace in prolog.
Removing source information for this call prevents the debugger to set a
breakpoint in compiled bytecode on this call which occurs prior to the first
DebugStepCheck in the function.

However, this change uncovered a bug in debugging interpreted bytecode:
The first source range of an async_op function gets split into 3 ranges, with
the middle range specifying a NoSource token position. The debugger does not
set a breakpoint in the first range, because DebugCheck is not yet encountered,
which is correct, but it failed to look for another range (the 3rd one) with the
same token position.

Change-Id: I11dcc75d115cb57b37f62afd83c783cf563b63e0
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/114700
Reviewed-by: Alexander Markov <alexmarkov@google.com>
Commit-Queue: Régis Crelier <regis@google.com>
2019-08-27 22:45:52 +00:00
Alexander Markov f2ab9478ee [vm/bytecode] Avoid extra DebugCheck in variable declaration
The extra DebugCheck is skipped depending on the initializer expression,
similarly to VariableSet.

This matches how AST-based flow graph builder inserts DebugStepCheck for
VariableDeclaration.

Test: runtime/observatory/tests/service/async_star_step_out_test.dart
Change-Id: Id1b11813b533996e219891f416e7008a994dbc51
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/114593
Reviewed-by: Régis Crelier <regis@google.com>
Commit-Queue: Alexander Markov <alexmarkov@google.com>
2019-08-27 16:52:17 +00:00
Aske Simon Christensen d44ada3c52 [vm] Remove constant evaluator calls in the VM and bytecode generator.
These are unnecessary now that constant evaluation is performed as
part of the front-end transformations.

Change-Id: Ia7c47476ddd4d4b3d0483eb4e40cab7677ec5b7c
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/112243
Commit-Queue: Aske Simon Christensen <askesc@google.com>
Reviewed-by: Alexander Markov <alexmarkov@google.com>
2019-08-27 14:07:55 +00:00
Aske Simon Christensen 497765f59f [vm] Move VM constant patching before constant evaluation.
This ensures that the VM host endian optimization described in
http://dartbug.com/32836 works properly after the explicit call to
the constant evaluator in the AOT compiler is removed.

Change-Id: I69424c7d27d113a70700a5cdad345bf632272ab6
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/112083
Reviewed-by: Martin Kustermann <kustermann@google.com>
Reviewed-by: Johnni Winther <johnniwinther@google.com>
2019-08-27 14:07:55 +00:00
Alexander Markov e878bdafe9 [vm/bytecode] Add DebugCheck to stop at return statement before executing finally blocks
Fixes service/debugging_inlined_finally_test in bytecode mode.

Change-Id: I323c3db7a5c31b840d178daffa65d0281e072a21
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/114588
Reviewed-by: Régis Crelier <regis@google.com>
2019-08-26 23:52:30 +00:00
Alexander Markov da4e6eb6e3 [vm/bytecode] Correct source positions for for-in statements
Fixes service/next_through_for_each_loop_test in bytecode mode.

Change-Id: Ida3269f3ca6127b088855f173bd8a2e18faf884d
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/114553
Reviewed-by: Régis Crelier <regis@google.com>
Commit-Queue: Alexander Markov <alexmarkov@google.com>
2019-08-26 22:03:08 +00:00
Alexander Markov a00a8df2d9 [vm/bytecode] Correct source positions for switch cases
This fixes the following tests in bytecode mode:
service/step_through_switch_test broke
service/step_through_switch_with_continue_test

Change-Id: I3f6f835185b9dae86e5ebebfdd4484b4d1cb6af0
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/114549
Reviewed-by: Régis Crelier <regis@google.com>
Commit-Queue: Alexander Markov <alexmarkov@google.com>
2019-08-26 20:44:06 +00:00
Alexander Markov 524f78e6cb [vm/bytecode] Fix symbols for private parameter names
Fixes lib_2/mirrors/initializing_formals_test/03 test in bytecode mode.

Change-Id: I937b9f1d3651cbfb3ea7531105d21589f94e7961
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/114460
Reviewed-by: Régis Crelier <regis@google.com>
Reviewed-by: Ryan Macnak <rmacnak@google.com>
Commit-Queue: Alexander Markov <alexmarkov@google.com>
2019-08-23 23:36:18 +00:00
Alexander Markov 6ee9e67156 [vm/bytecode] Mark synthetic calls in source positions so debugger can skip them
Change-Id: I40ea385f650e04433ed404c51ee78e128f37445a
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/114303
Commit-Queue: Alexander Markov <alexmarkov@google.com>
Reviewed-by: Régis Crelier <regis@google.com>
Reviewed-by: Ryan Macnak <rmacnak@google.com>
2019-08-23 17:06:11 +00:00
Alexander Markov 5e428ed638 [vm/bytecode] Fixes for expression evaluation
* Set parent for TypeParameters created in createExpressionEvaluationComponent.

* Resolve references from bytecode to an expression evaluation class
  using real class. Expression evaluation class could be referenced
  from type parameters.

* Avoid registering expression evaluation classes in hierarchy. They
  shouldn't be discovered through direct subclasses or implementors,
  as expression evaluation classes don't have cids.

* Add :function_type_arguments_var local variable to bytecode local
  variables info, so expression evaluation can find function type
  arguments which are in scope.

Change-Id: I515431a989b4d02af4ecf90579931dd59d3acadd
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/114182
Reviewed-by: Régis Crelier <regis@google.com>
Commit-Queue: Alexander Markov <alexmarkov@google.com>
2019-08-22 22:53:12 +00:00
Alexander Markov 3617c8d704 [vm/bytecode] Add missing DebugCheck to local function declaration
This debugger stop is generated by AST-based flow graph builder but
not covered by stopping at any particular bytecode instruction.

Change-Id: Id9c53cbbcda5ec589c7a24917fb9d79f5a27452b
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/114183
Reviewed-by: Régis Crelier <regis@google.com>
Commit-Queue: Alexander Markov <alexmarkov@google.com>
2019-08-22 21:17:45 +00:00
Alexander Markov 9fda4c1101 [vm/bytecode] Avoid using closure call instructions if code coverage may be needed
This is a workaround to https://github.com/dart-lang/sdk/issues/37944.
Closure call instructions are not tracked by code coverage, so this change
avoids generating them in bytecode if incremental kernel compiler is used -
when vm-service is enabled with command-line option and code coverage
may be needed.

Change-Id: Ifb3bc5e90a9f8ccb04073994d761bc301bc274ab
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/114045
Reviewed-by: Régis Crelier <regis@google.com>
Reviewed-by: Ryan Macnak <rmacnak@google.com>
Commit-Queue: Alexander Markov <alexmarkov@google.com>
2019-08-22 00:28:34 +00:00
Alexander Markov 5e5313c8d6 [vm/bytecode] Keep unreachable code for code coverage
This change adds a bytecode generation option 'keep-unreachable-code' to
avoid eliminating unreachable code from constant conditions.
This option is enabled in kernel service.

If unreachable code is eliminated, then call instructions are not generated
and ICData objects are not created. Source code report is collected
using created ICData objects and will not flag the unreachable code as
not executed.

Change-Id: Ic73e19c653505e0dfab4648ab65ef6b90370e0b4
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/113960
Reviewed-by: Régis Crelier <regis@google.com>
Reviewed-by: Ryan Macnak <rmacnak@google.com>
Commit-Queue: Alexander Markov <alexmarkov@google.com>
2019-08-21 02:28:44 +00:00
Alexander Markov 922c2bfbb0 [vm/bytecode] Include source info and asserts into platform with bytecode
* Include source positions, source text (if provided by front-end, which is
  controlled by a separate option) and assertions into platform with bytecode.
  Also use environment defines if provided.

* Omit bytecode for synthetic static fields '_redirecting#' injected
  by front-end, as they contain invalid AST nodes (taking tear-off of
  a constructor). This is needed to avoid emitting bytecode which cannot be
  loaded.

* Correctly merge source information such as source text and line numbers
  in bytecode generator if the script was originally created for an
  anonymous mixin application without such information.

* Always include import URIs into source information, even if other information is
  excluded (for members in anonymous mixin applications / noSuchMethod forwarders /
  forwarding stubs).

* Set native resolvers for vm/cc/PrintJSON test, as printing all objects to JSON
  involves collecting token positions, which may read bytecode from platform and
  need native resolvers to process native method entries.

Change-Id: I971e880c25439c0ec69db3a231a0085ccd5d15ad
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/113780
Commit-Queue: Alexander Markov <alexmarkov@google.com>
Reviewed-by: Régis Crelier <regis@google.com>
2019-08-21 01:08:24 +00:00
Alexander Markov 513ef1dfe1 [vm/bytecode] Avoid using map().toList() in bytecode generator
Code map((x) => ...).toList() is less efficient compared to an explicit loop.
Replacing these code patterns with loops slightly improves bytecode generation
speed (dart2js 1271 -> 1188 ms).

Also, map with closure consumes more stack space which results in flaky
stack overflow errors in kernel service on a test with deeply nested constants.

Change-Id: If209fc28d521abcbad46b5b2c7cffefcf8cd0ecb
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/113217
Reviewed-by: Ryan Macnak <rmacnak@google.com>
Reviewed-by: Régis Crelier <regis@google.com>
Commit-Queue: Alexander Markov <alexmarkov@google.com>
2019-08-15 22:15:02 +00:00
Alexander Markov f255c0c8d3 [vm/bytecode] Revise PushStatic bytecode instruction
PushStatic instruction expects field object to be pushed onto the stack.
This is useless, as PushStatic also references field with its D operand.
This change replaces PushStatic instruction with LoadStatic which doesn't
take field object on the stack, so PushConstant/PushStatic pair is replaced
with a single LoadStatic instruction.

This change also enables constant propagation of values of injected CID
fields, which are not known at bytecode generation time.

Change-Id: Ifbdd3aea2aab338f6c9ec3e5728948c4d8541a4b
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/112489
Commit-Queue: Alexander Markov <alexmarkov@google.com>
Reviewed-by: Ryan Macnak <rmacnak@google.com>
Reviewed-by: Régis Crelier <regis@google.com>
2019-08-09 21:02:31 +00:00
Alexander Markov ea9091b278 [vm/bytecode] Drop abstract and generate body for static external functions
Fixes crash in bytecode reader when trying to read body of
'abstract static external' function in test
co19_2/Language/Functions/External_Functions/not_connected_to_a_body_t01.

Change-Id: Ie60a6467a1b05aaf4c78baca50d67d29dfad3751
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/111984
Reviewed-by: Régis Crelier <regis@google.com>
Reviewed-by: Ryan Macnak <rmacnak@google.com>
Commit-Queue: Alexander Markov <alexmarkov@google.com>
2019-08-05 23:16:07 +00:00
Régis Crelier c923007f37 [vm/bytecode] Fixes and improvements in bytecode debugger.
Remove DebugCheck on Jump opcode.
Emit explicit DebugCheck bytecode instructions for VariableSet (see CL 111221).
Emit explicit DebugCheck bytecode instructions for VariableDeclaration.
Emit explicit DebugCheck bytecode instructions in _generateNonLocalControlTransfer before context is unwound.
Refactor prologue of async op functions, so that the same DebugCheck opcode is
encountered on every reentry.
Allow extra single steps when debugging bytecode in service tests.
Support context level calculation of compiled frames.
Adjust filter of synthetic variables in debugger.
Fix logic to skip single steps in bytecode prologue.

Change-Id: I1d6236c37af1aded0eebca1c3e3bb1978f7369dc
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/111867
Commit-Queue: Régis Crelier <regis@google.com>
Reviewed-by: Alexander Markov <alexmarkov@google.com>
2019-08-05 17:54:17 +00:00
Alexander Markov ac45ee7e63 [vm/bytecode] Support exactness tracking in bytecode
MicroClosureCreateTearoffClassSecondTime(RunTime) 3922 us -> 2030 us.

Issue: https://github.com/dart-lang/sdk/issues/36429
Change-Id: I3a6f93950a469969d82243fd1744d5a4f7fb1e78
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/111868
Reviewed-by: Ryan Macnak <rmacnak@google.com>
Commit-Queue: Alexander Markov <alexmarkov@google.com>
2019-08-03 17:36:31 +00:00