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

Side by Side Diff: runtime/vm/compiler.h

Issue 1454553004: Create code and instruction object, and install them in the background compilation thread while br… (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Address comments Created 5 years, 1 month 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 unified diff | Download patch
« no previous file with comments | « runtime/vm/code_generator.cc ('k') | runtime/vm/compiler.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #ifndef VM_COMPILER_H_ 5 #ifndef VM_COMPILER_H_
6 #define VM_COMPILER_H_ 6 #define VM_COMPILER_H_
7 7
8 #include "vm/allocation.h" 8 #include "vm/allocation.h"
9 #include "vm/growable_array.h" 9 #include "vm/growable_array.h"
10 #include "vm/runtime_entry.h" 10 #include "vm/runtime_entry.h"
11 #include "vm/thread_pool.h" 11 #include "vm/thread_pool.h"
12 12
13 namespace dart { 13 namespace dart {
14 14
15 // Forward declarations. 15 // Forward declarations.
16 class BackgroundCompilationQueue; 16 class BackgroundCompilationQueue;
17 class Class; 17 class Class;
18 class Code; 18 class Code;
19 class CompilationWorkQueue; 19 class CompilationWorkQueue;
20 class Function; 20 class Function;
21 class Library; 21 class Library;
22 class ParsedFunction; 22 class ParsedFunction;
23 class QueueElement; 23 class QueueElement;
24 class RawInstance; 24 class RawInstance;
25 class Script; 25 class Script;
26 class SequenceNode; 26 class SequenceNode;
27 27
28 // Carries result from background compilation: code and generation counters
29 // that help check if the code may have become invalid during background
30 // compilation.
31 class BackgroundCompilationResult : public ValueObject {
32 public:
33 BackgroundCompilationResult();
34
35 // Initializes with current isolate-stored generations
36 void Init();
37
38 void set_result_code(const Code& value) { result_code_ = value.raw(); }
39 const Code& result_code() const { return result_code_; }
40
41 uint32_t cha_invalidation_gen() const { return cha_invalidation_gen_; }
42 uint32_t field_invalidation_gen() const { return field_invalidation_gen_; }
43 uint32_t prefix_invalidation_gen() const { return prefix_invalidation_gen_; }
44
45 void SetFromQElement(QueueElement* value);
46
47 void SetLeafClasses(const GrowableArray<Class*>& leaf_classes);
48 void SetGuardedFields(const ZoneGrowableArray<const Field*>& guarded_fields);
49 void SetDeoptimizeDependentFields(const GrowableArray<const Field*>& fields);
50
51 const Array& leaf_classes() const { return leaf_classes_; }
52 const Array& guarded_fields() const { return guarded_fields_; }
53 const Array& deoptimize_dependent_fields() const {
54 return deoptimize_dependent_fields_;
55 }
56
57 // Returns true if all relevant gen-counts are current and code is valid.
58 bool IsValid() const;
59
60 // Remove gen-counts from validation check.
61 void ClearCHAInvalidationGen() {
62 cha_invalidation_gen_ = Isolate::kInvalidGen;
63 }
64 void ClearFieldInvalidationGen() {
65 field_invalidation_gen_ = Isolate::kInvalidGen;
66 }
67 void ClearPrefixInvalidationGen() {
68 prefix_invalidation_gen_ = Isolate::kInvalidGen;
69 }
70
71 void PrintValidity() const;
72
73 private:
74 Code& result_code_;
75 Array& leaf_classes_;
76 Array& guarded_fields_;
77 Array& deoptimize_dependent_fields_;
78 uint32_t cha_invalidation_gen_;
79 uint32_t field_invalidation_gen_;
80 uint32_t prefix_invalidation_gen_;
81 };
82
83 28
84 class Compiler : public AllStatic { 29 class Compiler : public AllStatic {
85 public: 30 public:
86 static const intptr_t kNoOSRDeoptId = Thread::kNoDeoptId; 31 static const intptr_t kNoOSRDeoptId = Thread::kNoDeoptId;
87 32
88 static bool IsBackgroundCompilation(); 33 static bool IsBackgroundCompilation();
89 34
90 // Extracts top level entities from the script and populates 35 // Extracts top level entities from the script and populates
91 // the class dictionary of the library. 36 // the class dictionary of the library.
92 // 37 //
(...skipping 16 matching lines...) Expand all
109 const Function& function); 54 const Function& function);
110 55
111 // Generates optimized code for function. 56 // Generates optimized code for function.
112 // 57 //
113 // Returns Error::null() if there is no compilation error. 58 // Returns Error::null() if there is no compilation error.
114 // If 'result_code' is not NULL, then the generated code is returned but 59 // If 'result_code' is not NULL, then the generated code is returned but
115 // not installed. 60 // not installed.
116 static RawError* CompileOptimizedFunction( 61 static RawError* CompileOptimizedFunction(
117 Thread* thread, 62 Thread* thread,
118 const Function& function, 63 const Function& function,
119 intptr_t osr_id = kNoOSRDeoptId, 64 intptr_t osr_id = kNoOSRDeoptId);
120 BackgroundCompilationResult* res = NULL);
121 65
122 // Generates code for given parsed function (without parsing it again) and 66 // Generates code for given parsed function (without parsing it again) and
123 // sets its code field. 67 // sets its code field.
124 // 68 //
125 // Returns Error::null() if there is no compilation error. 69 // Returns Error::null() if there is no compilation error.
126 static RawError* CompileParsedFunction(ParsedFunction* parsed_function); 70 static RawError* CompileParsedFunction(ParsedFunction* parsed_function);
127 71
128 // Generates and executes code for a given code fragment, e.g. a 72 // Generates and executes code for a given code fragment, e.g. a
129 // compile time constant expression. Returns the result returned 73 // compile time constant expression. Returns the result returned
130 // by the fragment. 74 // by the fragment.
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
175 class BackgroundCompiler : public ThreadPool::Task { 119 class BackgroundCompiler : public ThreadPool::Task {
176 public: 120 public:
177 static void EnsureInit(Thread* thread); 121 static void EnsureInit(Thread* thread);
178 122
179 static void Stop(BackgroundCompiler* task); 123 static void Stop(BackgroundCompiler* task);
180 124
181 // Call to optimize a function in the background, enters the function in the 125 // Call to optimize a function in the background, enters the function in the
182 // compilation queue. 126 // compilation queue.
183 void CompileOptimized(const Function& function); 127 void CompileOptimized(const Function& function);
184 128
185 // Call to activate/install optimized code (must occur in the mutator thread).
186 void InstallGeneratedCode();
187
188
189 void VisitPointers(ObjectPointerVisitor* visitor); 129 void VisitPointers(ObjectPointerVisitor* visitor);
190 130
191 BackgroundCompilationQueue* function_queue() const { return function_queue_; } 131 BackgroundCompilationQueue* function_queue() const { return function_queue_; }
192 BackgroundCompilationQueue* result_queue() const { return result_queue_; }
193 132
194 private: 133 private:
195 explicit BackgroundCompiler(Isolate* isolate); 134 explicit BackgroundCompiler(Isolate* isolate);
196 135
197 virtual void Run(); 136 virtual void Run();
198 137
199 void AddResult(const BackgroundCompilationResult& value);
200
201 Isolate* isolate_; 138 Isolate* isolate_;
202 bool running_; // While true, will try to read queue and compile. 139 bool running_; // While true, will try to read queue and compile.
203 bool* done_; // True if the thread is done. 140 bool* done_; // True if the thread is done.
204 Monitor* queue_monitor_; // Controls access to the queue. 141 Monitor* queue_monitor_; // Controls access to the queue.
205 Monitor* done_monitor_; // Notify/wait that the thread is done. 142 Monitor* done_monitor_; // Notify/wait that the thread is done.
206 143
207 BackgroundCompilationQueue* function_queue_; 144 BackgroundCompilationQueue* function_queue_;
208 BackgroundCompilationQueue* result_queue_;
209 145
210 DISALLOW_IMPLICIT_CONSTRUCTORS(BackgroundCompiler); 146 DISALLOW_IMPLICIT_CONSTRUCTORS(BackgroundCompiler);
211 }; 147 };
212 148
213 } // namespace dart 149 } // namespace dart
214 150
215 #endif // VM_COMPILER_H_ 151 #endif // VM_COMPILER_H_
OLDNEW
« no previous file with comments | « runtime/vm/code_generator.cc ('k') | runtime/vm/compiler.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698