Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(728)

Unified Diff: runtime/vm/compiler.cc

Issue 1834763004: Track loading happening in parallel with background compilation and abort compilation if necessary. (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: comments Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « runtime/vm/atomic.h ('k') | runtime/vm/flow_graph_inliner.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/compiler.cc
diff --git a/runtime/vm/compiler.cc b/runtime/vm/compiler.cc
index 4b5a737afbc83ffa285ad9ddb85edce6971da4db..bf5eac59933cec7484c67d3055bb0ec67b8e600c 100644
--- a/runtime/vm/compiler.cc
+++ b/runtime/vm/compiler.cc
@@ -378,16 +378,12 @@ class CompileParsedFunctionHelper : public ValueObject {
optimized_(optimized),
osr_id_(osr_id),
thread_(Thread::Current()),
- cha_invalidation_gen_at_start_(isolate()->cha_invalidation_gen()),
field_invalidation_gen_at_start_(isolate()->field_invalidation_gen()),
- prefix_invalidation_gen_at_start_(
- isolate()->prefix_invalidation_gen()) {
+ loading_invalidation_gen_at_start_(
+ isolate()->loading_invalidation_gen()) {
}
bool Compile(CompilationPipeline* pipeline);
- uint32_t prefix_invalidation_gen_at_start() const {
- return prefix_invalidation_gen_at_start_;
- }
private:
ParsedFunction* parsed_function() const { return parsed_function_; }
@@ -395,12 +391,12 @@ class CompileParsedFunctionHelper : public ValueObject {
intptr_t osr_id() const { return osr_id_; }
Thread* thread() const { return thread_; }
Isolate* isolate() const { return thread_->isolate(); }
- uint32_t cha_invalidation_gen_at_start() const {
- return cha_invalidation_gen_at_start_;
- }
- uint32_t field_invalidation_gen_at_start() const {
+ intptr_t field_invalidation_gen_at_start() const {
return field_invalidation_gen_at_start_;
}
+ intptr_t loading_invalidation_gen_at_start() const {
+ return loading_invalidation_gen_at_start_;
+ }
void FinalizeCompilation(Assembler* assembler,
FlowGraphCompiler* graph_compiler,
FlowGraph* flow_graph);
@@ -409,9 +405,8 @@ class CompileParsedFunctionHelper : public ValueObject {
const bool optimized_;
const intptr_t osr_id_;
Thread* const thread_;
- const uint32_t cha_invalidation_gen_at_start_;
- const uint32_t field_invalidation_gen_at_start_;
- const uint32_t prefix_invalidation_gen_at_start_;
+ const intptr_t field_invalidation_gen_at_start_;
+ const intptr_t loading_invalidation_gen_at_start_;
DISALLOW_COPY_AND_ASSIGN(CompileParsedFunctionHelper);
};
@@ -501,15 +496,6 @@ NOT_IN_PRODUCT(
const bool trace_compiler =
FLAG_trace_compiler || FLAG_trace_optimizing_compiler;
bool code_is_valid = true;
- if (!thread()->cha()->leaf_classes().is_empty()) {
- if (cha_invalidation_gen_at_start() !=
- isolate()->cha_invalidation_gen()) {
- code_is_valid = false;
- if (trace_compiler) {
- THR_Print("--> FAIL: CHA invalidation.");
- }
- }
- }
if (!flow_graph->parsed_function().guarded_fields()->is_empty()) {
if (field_invalidation_gen_at_start() !=
isolate()->field_invalidation_gen()) {
@@ -519,13 +505,11 @@ NOT_IN_PRODUCT(
}
}
}
- if (parsed_function()->HasDeferredPrefixes()) {
- if (prefix_invalidation_gen_at_start() !=
- isolate()->prefix_invalidation_gen()) {
- code_is_valid = false;
- if (trace_compiler) {
- THR_Print("--> FAIL: Prefix invalidation.");
- }
+ if (loading_invalidation_gen_at_start() !=
+ isolate()->loading_invalidation_gen()) {
+ code_is_valid = false;
+ if (trace_compiler) {
+ THR_Print("--> FAIL: Loading invalidation.");
}
}
if (code_is_valid) {
@@ -1154,9 +1138,9 @@ static RawError* CompileFunctionHelper(CompilationPipeline* pipeline,
if (optimized) {
INC_STAT(thread, num_functions_optimized, 1);
}
- // Makes sure no libraries are loaded during parsing.
- const uint32_t prefix_invalidation_gen_at_start =
- isolate->prefix_invalidation_gen();
+ // Makes sure no classes are loaded during parsing in background.
+ const intptr_t loading_invalidation_gen_at_start =
+ isolate->loading_invalidation_gen();
{
HANDLESCOPE(thread);
const int64_t num_tokens_before = STAT_VALUE(thread, num_tokens_consumed);
@@ -1167,14 +1151,19 @@ static RawError* CompileFunctionHelper(CompilationPipeline* pipeline,
num_tokens_after - num_tokens_before);
}
+
CompileParsedFunctionHelper helper(parsed_function, optimized, osr_id);
- if (prefix_invalidation_gen_at_start !=
- helper.prefix_invalidation_gen_at_start()) {
- ASSERT(Compiler::IsBackgroundCompilation());
- // Deferred loading occured while parsing or copying ICData. We need
- // to abort here because deopt-ids may have changed.
- Compiler::AbortBackgroundCompilation(Thread::kNoDeoptId);
+
+ if (Compiler::IsBackgroundCompilation()) {
+ if (isolate->IsTopLevelParsing() ||
+ (loading_invalidation_gen_at_start !=
+ isolate->loading_invalidation_gen())) {
+ // Loading occured while parsing. We need to abort here because state
+ // changed while compiling.
+ Compiler::AbortBackgroundCompilation(Thread::kNoDeoptId);
+ }
}
+
const bool success = helper.Compile(pipeline);
if (!success) {
if (optimized) {
« no previous file with comments | « runtime/vm/atomic.h ('k') | runtime/vm/flow_graph_inliner.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698