Mercurial > hg > graal-jvmci-8
comparison src/share/vm/c1/c1_Runtime1.cpp @ 1584:b812ff5abc73
6958292: C1: Enable parallel compilation
Summary: Enable parallel compilation in C1
Reviewed-by: never, kvn
author | iveresov |
---|---|
date | Fri, 04 Jun 2010 11:18:04 -0700 |
parents | c18cbe5936b8 |
children | 136b78722a08 |
comparison
equal
deleted
inserted
replaced
1583:02e771df338e | 1584:b812ff5abc73 |
---|---|
58 assert(_num_rt_args == args, "can't change the number of args"); | 58 assert(_num_rt_args == args, "can't change the number of args"); |
59 } | 59 } |
60 | 60 |
61 // Implementation of Runtime1 | 61 // Implementation of Runtime1 |
62 | 62 |
63 bool Runtime1::_is_initialized = false; | |
64 CodeBlob* Runtime1::_blobs[Runtime1::number_of_ids]; | 63 CodeBlob* Runtime1::_blobs[Runtime1::number_of_ids]; |
65 const char *Runtime1::_blob_names[] = { | 64 const char *Runtime1::_blob_names[] = { |
66 RUNTIME1_STUBS(STUB_NAME, LAST_STUB_NAME) | 65 RUNTIME1_STUBS(STUB_NAME, LAST_STUB_NAME) |
67 }; | 66 }; |
68 | 67 |
87 int Runtime1::_throw_incompatible_class_change_error_count = 0; | 86 int Runtime1::_throw_incompatible_class_change_error_count = 0; |
88 int Runtime1::_throw_array_store_exception_count = 0; | 87 int Runtime1::_throw_array_store_exception_count = 0; |
89 int Runtime1::_throw_count = 0; | 88 int Runtime1::_throw_count = 0; |
90 #endif | 89 #endif |
91 | 90 |
92 BufferBlob* Runtime1::_buffer_blob = NULL; | |
93 | |
94 // Simple helper to see if the caller of a runtime stub which | 91 // Simple helper to see if the caller of a runtime stub which |
95 // entered the VM has been deoptimized | 92 // entered the VM has been deoptimized |
96 | 93 |
97 static bool caller_is_deopted() { | 94 static bool caller_is_deopted() { |
98 JavaThread* thread = JavaThread::current(); | 95 JavaThread* thread = JavaThread::current(); |
115 assert(caller_is_deopted(), "Must be deoptimized"); | 112 assert(caller_is_deopted(), "Must be deoptimized"); |
116 } | 113 } |
117 } | 114 } |
118 | 115 |
119 | 116 |
120 BufferBlob* Runtime1::get_buffer_blob() { | 117 void Runtime1::generate_blob_for(BufferBlob* buffer_blob, StubID id) { |
121 // Allocate code buffer space only once | |
122 BufferBlob* blob = _buffer_blob; | |
123 if (blob == NULL) { | |
124 // setup CodeBuffer. Preallocate a BufferBlob of size | |
125 // NMethodSizeLimit plus some extra space for constants. | |
126 int code_buffer_size = desired_max_code_buffer_size() + desired_max_constant_size(); | |
127 blob = BufferBlob::create("Compiler1 temporary CodeBuffer", | |
128 code_buffer_size); | |
129 guarantee(blob != NULL, "must create initial code buffer"); | |
130 _buffer_blob = blob; | |
131 } | |
132 return _buffer_blob; | |
133 } | |
134 | |
135 void Runtime1::setup_code_buffer(CodeBuffer* code, int call_stub_estimate) { | |
136 // Preinitialize the consts section to some large size: | |
137 int locs_buffer_size = 20 * (relocInfo::length_limit + sizeof(relocInfo)); | |
138 char* locs_buffer = NEW_RESOURCE_ARRAY(char, locs_buffer_size); | |
139 code->insts()->initialize_shared_locs((relocInfo*)locs_buffer, | |
140 locs_buffer_size / sizeof(relocInfo)); | |
141 code->initialize_consts_size(desired_max_constant_size()); | |
142 // Call stubs + deopt/exception handler | |
143 code->initialize_stubs_size((call_stub_estimate * LIR_Assembler::call_stub_size) + | |
144 LIR_Assembler::exception_handler_size + | |
145 LIR_Assembler::deopt_handler_size); | |
146 } | |
147 | |
148 | |
149 void Runtime1::generate_blob_for(StubID id) { | |
150 assert(0 <= id && id < number_of_ids, "illegal stub id"); | 118 assert(0 <= id && id < number_of_ids, "illegal stub id"); |
151 ResourceMark rm; | 119 ResourceMark rm; |
152 // create code buffer for code storage | 120 // create code buffer for code storage |
153 CodeBuffer code(get_buffer_blob()->instructions_begin(), | 121 CodeBuffer code(buffer_blob->instructions_begin(), |
154 get_buffer_blob()->instructions_size()); | 122 buffer_blob->instructions_size()); |
155 | 123 |
156 setup_code_buffer(&code, 0); | 124 Compilation::setup_code_buffer(&code, 0); |
157 | 125 |
158 // create assembler for code generation | 126 // create assembler for code generation |
159 StubAssembler* sasm = new StubAssembler(&code, name_for(id), id); | 127 StubAssembler* sasm = new StubAssembler(&code, name_for(id), id); |
160 // generate code for runtime stub | 128 // generate code for runtime stub |
161 OopMapSet* oop_maps; | 129 OopMapSet* oop_maps; |
202 assert(blob != NULL, "blob must exist"); | 170 assert(blob != NULL, "blob must exist"); |
203 _blobs[id] = blob; | 171 _blobs[id] = blob; |
204 } | 172 } |
205 | 173 |
206 | 174 |
207 void Runtime1::initialize() { | 175 void Runtime1::initialize(BufferBlob* blob) { |
208 // Warning: If we have more than one compilation running in parallel, we | 176 // platform-dependent initialization |
209 // need a lock here with the current setup (lazy initialization). | 177 initialize_pd(); |
210 if (!is_initialized()) { | 178 // generate stubs |
211 _is_initialized = true; | 179 for (int id = 0; id < number_of_ids; id++) generate_blob_for(blob, (StubID)id); |
212 | 180 // printing |
213 // platform-dependent initialization | |
214 initialize_pd(); | |
215 // generate stubs | |
216 for (int id = 0; id < number_of_ids; id++) generate_blob_for((StubID)id); | |
217 // printing | |
218 #ifndef PRODUCT | 181 #ifndef PRODUCT |
219 if (PrintSimpleStubs) { | 182 if (PrintSimpleStubs) { |
220 ResourceMark rm; | 183 ResourceMark rm; |
221 for (int id = 0; id < number_of_ids; id++) { | 184 for (int id = 0; id < number_of_ids; id++) { |
222 _blobs[id]->print(); | 185 _blobs[id]->print(); |
223 if (_blobs[id]->oop_maps() != NULL) { | 186 if (_blobs[id]->oop_maps() != NULL) { |
224 _blobs[id]->oop_maps()->print(); | 187 _blobs[id]->oop_maps()->print(); |
225 } | |
226 } | 188 } |
227 } | 189 } |
190 } | |
228 #endif | 191 #endif |
229 } | |
230 } | 192 } |
231 | 193 |
232 | 194 |
233 CodeBlob* Runtime1::blob_for(StubID id) { | 195 CodeBlob* Runtime1::blob_for(StubID id) { |
234 assert(0 <= id && id < number_of_ids, "illegal stub id"); | 196 assert(0 <= id && id < number_of_ids, "illegal stub id"); |
235 if (!is_initialized()) initialize(); | |
236 return _blobs[id]; | 197 return _blobs[id]; |
237 } | 198 } |
238 | 199 |
239 | 200 |
240 const char* Runtime1::name_for(StubID id) { | 201 const char* Runtime1::name_for(StubID id) { |