Thu, 12 Oct 2017 21:27:07 +0800
merge
1 /*
2 * Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
25 /*
26 * This file has been modified by Loongson Technology in 2015. These
27 * modifications are Copyright (c) 2015 Loongson Technology, and are made
28 * available on the same license terms set forth above.
29 */
31 #include "precompiled.hpp"
32 #include "code/codeBlob.hpp"
33 #include "code/codeCache.hpp"
34 #include "code/relocInfo.hpp"
35 #include "compiler/disassembler.hpp"
36 #include "interpreter/bytecode.hpp"
37 #include "memory/allocation.inline.hpp"
38 #include "memory/heap.hpp"
39 #include "oops/oop.inline.hpp"
40 #include "prims/forte.hpp"
41 #include "runtime/handles.inline.hpp"
42 #include "runtime/interfaceSupport.hpp"
43 #include "runtime/mutexLocker.hpp"
44 #include "runtime/safepoint.hpp"
45 #include "runtime/sharedRuntime.hpp"
46 #include "runtime/vframe.hpp"
47 #include "services/memoryService.hpp"
48 #ifdef TARGET_ARCH_x86
49 # include "nativeInst_x86.hpp"
50 #endif
51 #ifdef TARGET_ARCH_sparc
52 # include "nativeInst_sparc.hpp"
53 #endif
54 #ifdef TARGET_ARCH_zero
55 # include "nativeInst_zero.hpp"
56 #endif
57 #ifdef TARGET_ARCH_arm
58 # include "nativeInst_arm.hpp"
59 #endif
60 #ifdef TARGET_ARCH_ppc
61 # include "nativeInst_ppc.hpp"
62 #endif
63 #ifdef TARGET_ARCH_mips
64 # include "nativeInst_mips.hpp"
65 #endif
66 #ifdef COMPILER1
67 #include "c1/c1_Runtime1.hpp"
68 #endif
70 unsigned int align_code_offset(int offset) {
71 // align the size to CodeEntryAlignment
72 return
73 ((offset + (int)CodeHeap::header_size() + (CodeEntryAlignment-1)) & ~(CodeEntryAlignment-1))
74 - (int)CodeHeap::header_size();
75 }
78 // This must be consistent with the CodeBlob constructor's layout actions.
79 unsigned int CodeBlob::allocation_size(CodeBuffer* cb, int header_size) {
80 unsigned int size = header_size;
81 size += round_to(cb->total_relocation_size(), oopSize);
82 // align the size to CodeEntryAlignment
83 size = align_code_offset(size);
84 size += round_to(cb->total_content_size(), oopSize);
85 size += round_to(cb->total_oop_size(), oopSize);
86 size += round_to(cb->total_metadata_size(), oopSize);
87 return size;
88 }
91 // Creates a simple CodeBlob. Sets up the size of the different regions.
92 CodeBlob::CodeBlob(const char* name, int header_size, int size, int frame_complete, int locs_size) {
93 assert(size == round_to(size, oopSize), "unaligned size");
94 assert(locs_size == round_to(locs_size, oopSize), "unaligned size");
95 assert(header_size == round_to(header_size, oopSize), "unaligned size");
96 assert(!UseRelocIndex, "no space allocated for reloc index yet");
98 // Note: If UseRelocIndex is enabled, there needs to be (at least) one
99 // extra word for the relocation information, containing the reloc
100 // index table length. Unfortunately, the reloc index table imple-
101 // mentation is not easily understandable and thus it is not clear
102 // what exactly the format is supposed to be. For now, we just turn
103 // off the use of this table (gri 7/6/2000).
105 _name = name;
106 _size = size;
107 _frame_complete_offset = frame_complete;
108 _header_size = header_size;
109 _relocation_size = locs_size;
110 _content_offset = align_code_offset(header_size + _relocation_size);
111 _code_offset = _content_offset;
112 _data_offset = size;
113 _frame_size = 0;
114 set_oop_maps(NULL);
115 }
118 // Creates a CodeBlob from a CodeBuffer. Sets up the size of the different regions,
119 // and copy code and relocation info.
120 CodeBlob::CodeBlob(
121 const char* name,
122 CodeBuffer* cb,
123 int header_size,
124 int size,
125 int frame_complete,
126 int frame_size,
127 OopMapSet* oop_maps
128 ) {
129 assert(size == round_to(size, oopSize), "unaligned size");
130 assert(header_size == round_to(header_size, oopSize), "unaligned size");
132 _name = name;
133 _size = size;
134 _frame_complete_offset = frame_complete;
135 _header_size = header_size;
136 _relocation_size = round_to(cb->total_relocation_size(), oopSize);
137 _content_offset = align_code_offset(header_size + _relocation_size);
138 _code_offset = _content_offset + cb->total_offset_of(cb->insts());
139 _data_offset = _content_offset + round_to(cb->total_content_size(), oopSize);
140 assert(_data_offset <= size, "codeBlob is too small");
142 cb->copy_code_and_locs_to(this);
143 set_oop_maps(oop_maps);
144 _frame_size = frame_size;
145 #ifdef COMPILER1
146 // probably wrong for tiered
147 assert(_frame_size >= -1, "must use frame size or -1 for runtime stubs");
148 #endif // COMPILER1
149 }
152 void CodeBlob::set_oop_maps(OopMapSet* p) {
153 // Danger Will Robinson! This method allocates a big
154 // chunk of memory, its your job to free it.
155 if (p != NULL) {
156 // We need to allocate a chunk big enough to hold the OopMapSet and all of its OopMaps
157 _oop_maps = (OopMapSet* )NEW_C_HEAP_ARRAY(unsigned char, p->heap_size(), mtCode);
158 p->copy_to((address)_oop_maps);
159 } else {
160 _oop_maps = NULL;
161 }
162 }
165 void CodeBlob::trace_new_stub(CodeBlob* stub, const char* name1, const char* name2) {
166 // Do not hold the CodeCache lock during name formatting.
167 assert(!CodeCache_lock->owned_by_self(), "release CodeCache before registering the stub");
169 if (stub != NULL) {
170 char stub_id[256];
171 assert(strlen(name1) + strlen(name2) < sizeof(stub_id), "");
172 jio_snprintf(stub_id, sizeof(stub_id), "%s%s", name1, name2);
173 if (PrintStubCode) {
174 ttyLocker ttyl;
175 tty->print_cr("Decoding %s " INTPTR_FORMAT, stub_id, (intptr_t) stub);
176 Disassembler::decode(stub->code_begin(), stub->code_end());
177 tty->cr();
178 }
179 Forte::register_stub(stub_id, stub->code_begin(), stub->code_end());
181 if (JvmtiExport::should_post_dynamic_code_generated()) {
182 const char* stub_name = name2;
183 if (name2[0] == '\0') stub_name = name1;
184 JvmtiExport::post_dynamic_code_generated(stub_name, stub->code_begin(), stub->code_end());
185 }
186 }
188 // Track memory usage statistic after releasing CodeCache_lock
189 MemoryService::track_code_cache_memory_usage();
190 }
193 void CodeBlob::flush() {
194 if (_oop_maps) {
195 FREE_C_HEAP_ARRAY(unsigned char, _oop_maps, mtCode);
196 _oop_maps = NULL;
197 }
198 _strings.free();
199 }
202 OopMap* CodeBlob::oop_map_for_return_address(address return_address) {
203 assert(oop_maps() != NULL, "nope");
204 return oop_maps()->find_map_at_offset((intptr_t) return_address - (intptr_t) code_begin());
205 }
208 //----------------------------------------------------------------------------------------------------
209 // Implementation of BufferBlob
212 BufferBlob::BufferBlob(const char* name, int size)
213 : CodeBlob(name, sizeof(BufferBlob), size, CodeOffsets::frame_never_safe, /*locs_size:*/ 0)
214 {}
216 BufferBlob* BufferBlob::create(const char* name, int buffer_size) {
217 ThreadInVMfromUnknown __tiv; // get to VM state in case we block on CodeCache_lock
219 BufferBlob* blob = NULL;
220 unsigned int size = sizeof(BufferBlob);
221 // align the size to CodeEntryAlignment
222 size = align_code_offset(size);
223 size += round_to(buffer_size, oopSize);
224 assert(name != NULL, "must provide a name");
225 {
226 MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
227 blob = new (size) BufferBlob(name, size);
228 }
229 // Track memory usage statistic after releasing CodeCache_lock
230 MemoryService::track_code_cache_memory_usage();
232 return blob;
233 }
236 BufferBlob::BufferBlob(const char* name, int size, CodeBuffer* cb)
237 : CodeBlob(name, cb, sizeof(BufferBlob), size, CodeOffsets::frame_never_safe, 0, NULL)
238 {}
240 BufferBlob* BufferBlob::create(const char* name, CodeBuffer* cb) {
241 ThreadInVMfromUnknown __tiv; // get to VM state in case we block on CodeCache_lock
243 BufferBlob* blob = NULL;
244 unsigned int size = allocation_size(cb, sizeof(BufferBlob));
245 assert(name != NULL, "must provide a name");
246 {
247 MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
248 blob = new (size) BufferBlob(name, size, cb);
249 }
250 // Track memory usage statistic after releasing CodeCache_lock
251 MemoryService::track_code_cache_memory_usage();
253 return blob;
254 }
257 void* BufferBlob::operator new(size_t s, unsigned size, bool is_critical) throw() {
258 void* p = CodeCache::allocate(size, is_critical);
259 return p;
260 }
263 void BufferBlob::free( BufferBlob *blob ) {
264 ThreadInVMfromUnknown __tiv; // get to VM state in case we block on CodeCache_lock
265 blob->flush();
266 {
267 MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
268 CodeCache::free((CodeBlob*)blob);
269 }
270 // Track memory usage statistic after releasing CodeCache_lock
271 MemoryService::track_code_cache_memory_usage();
272 }
275 //----------------------------------------------------------------------------------------------------
276 // Implementation of AdapterBlob
278 AdapterBlob::AdapterBlob(int size, CodeBuffer* cb) :
279 BufferBlob("I2C/C2I adapters", size, cb) {
280 CodeCache::commit(this);
281 }
283 AdapterBlob* AdapterBlob::create(CodeBuffer* cb) {
284 ThreadInVMfromUnknown __tiv; // get to VM state in case we block on CodeCache_lock
286 AdapterBlob* blob = NULL;
287 unsigned int size = allocation_size(cb, sizeof(AdapterBlob));
288 {
289 MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
290 // The parameter 'true' indicates a critical memory allocation.
291 // This means that CodeCacheMinimumFreeSpace is used, if necessary
292 const bool is_critical = true;
293 blob = new (size, is_critical) AdapterBlob(size, cb);
294 }
295 // Track memory usage statistic after releasing CodeCache_lock
296 MemoryService::track_code_cache_memory_usage();
298 return blob;
299 }
302 //----------------------------------------------------------------------------------------------------
303 // Implementation of MethodHandlesAdapterBlob
305 MethodHandlesAdapterBlob* MethodHandlesAdapterBlob::create(int buffer_size) {
306 ThreadInVMfromUnknown __tiv; // get to VM state in case we block on CodeCache_lock
308 MethodHandlesAdapterBlob* blob = NULL;
309 unsigned int size = sizeof(MethodHandlesAdapterBlob);
310 // align the size to CodeEntryAlignment
311 size = align_code_offset(size);
312 size += round_to(buffer_size, oopSize);
313 {
314 MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
315 // The parameter 'true' indicates a critical memory allocation.
316 // This means that CodeCacheMinimumFreeSpace is used, if necessary
317 const bool is_critical = true;
318 blob = new (size, is_critical) MethodHandlesAdapterBlob(size);
319 }
320 // Track memory usage statistic after releasing CodeCache_lock
321 MemoryService::track_code_cache_memory_usage();
323 return blob;
324 }
327 //----------------------------------------------------------------------------------------------------
328 // Implementation of RuntimeStub
330 RuntimeStub::RuntimeStub(
331 const char* name,
332 CodeBuffer* cb,
333 int size,
334 int frame_complete,
335 int frame_size,
336 OopMapSet* oop_maps,
337 bool caller_must_gc_arguments
338 )
339 : CodeBlob(name, cb, sizeof(RuntimeStub), size, frame_complete, frame_size, oop_maps)
340 {
341 _caller_must_gc_arguments = caller_must_gc_arguments;
342 }
345 RuntimeStub* RuntimeStub::new_runtime_stub(const char* stub_name,
346 CodeBuffer* cb,
347 int frame_complete,
348 int frame_size,
349 OopMapSet* oop_maps,
350 bool caller_must_gc_arguments)
351 {
352 RuntimeStub* stub = NULL;
353 ThreadInVMfromUnknown __tiv; // get to VM state in case we block on CodeCache_lock
354 {
355 MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
356 unsigned int size = allocation_size(cb, sizeof(RuntimeStub));
357 stub = new (size) RuntimeStub(stub_name, cb, size, frame_complete, frame_size, oop_maps, caller_must_gc_arguments);
358 }
360 trace_new_stub(stub, "RuntimeStub - ", stub_name);
362 return stub;
363 }
366 void* RuntimeStub::operator new(size_t s, unsigned size) throw() {
367 void* p = CodeCache::allocate(size, true);
368 if (!p) fatal("Initial size of CodeCache is too small");
369 return p;
370 }
372 // operator new shared by all singletons:
373 void* SingletonBlob::operator new(size_t s, unsigned size) throw() {
374 void* p = CodeCache::allocate(size, true);
375 if (!p) fatal("Initial size of CodeCache is too small");
376 return p;
377 }
380 //----------------------------------------------------------------------------------------------------
381 // Implementation of DeoptimizationBlob
383 DeoptimizationBlob::DeoptimizationBlob(
384 CodeBuffer* cb,
385 int size,
386 OopMapSet* oop_maps,
387 int unpack_offset,
388 int unpack_with_exception_offset,
389 int unpack_with_reexecution_offset,
390 int frame_size
391 )
392 : SingletonBlob("DeoptimizationBlob", cb, sizeof(DeoptimizationBlob), size, frame_size, oop_maps)
393 {
394 _unpack_offset = unpack_offset;
395 _unpack_with_exception = unpack_with_exception_offset;
396 _unpack_with_reexecution = unpack_with_reexecution_offset;
397 #ifdef COMPILER1
398 _unpack_with_exception_in_tls = -1;
399 #endif
400 }
403 DeoptimizationBlob* DeoptimizationBlob::create(
404 CodeBuffer* cb,
405 OopMapSet* oop_maps,
406 int unpack_offset,
407 int unpack_with_exception_offset,
408 int unpack_with_reexecution_offset,
409 int frame_size)
410 {
411 DeoptimizationBlob* blob = NULL;
412 ThreadInVMfromUnknown __tiv; // get to VM state in case we block on CodeCache_lock
413 {
414 MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
415 unsigned int size = allocation_size(cb, sizeof(DeoptimizationBlob));
416 blob = new (size) DeoptimizationBlob(cb,
417 size,
418 oop_maps,
419 unpack_offset,
420 unpack_with_exception_offset,
421 unpack_with_reexecution_offset,
422 frame_size);
423 }
425 trace_new_stub(blob, "DeoptimizationBlob");
427 return blob;
428 }
431 //----------------------------------------------------------------------------------------------------
432 // Implementation of UncommonTrapBlob
434 #ifdef COMPILER2
435 UncommonTrapBlob::UncommonTrapBlob(
436 CodeBuffer* cb,
437 int size,
438 OopMapSet* oop_maps,
439 int frame_size
440 )
441 : SingletonBlob("UncommonTrapBlob", cb, sizeof(UncommonTrapBlob), size, frame_size, oop_maps)
442 {}
445 UncommonTrapBlob* UncommonTrapBlob::create(
446 CodeBuffer* cb,
447 OopMapSet* oop_maps,
448 int frame_size)
449 {
450 UncommonTrapBlob* blob = NULL;
451 ThreadInVMfromUnknown __tiv; // get to VM state in case we block on CodeCache_lock
452 {
453 MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
454 unsigned int size = allocation_size(cb, sizeof(UncommonTrapBlob));
455 blob = new (size) UncommonTrapBlob(cb, size, oop_maps, frame_size);
456 }
458 trace_new_stub(blob, "UncommonTrapBlob");
460 return blob;
461 }
464 #endif // COMPILER2
467 //----------------------------------------------------------------------------------------------------
468 // Implementation of ExceptionBlob
470 #ifdef COMPILER2
471 ExceptionBlob::ExceptionBlob(
472 CodeBuffer* cb,
473 int size,
474 OopMapSet* oop_maps,
475 int frame_size
476 )
477 : SingletonBlob("ExceptionBlob", cb, sizeof(ExceptionBlob), size, frame_size, oop_maps)
478 {}
481 ExceptionBlob* ExceptionBlob::create(
482 CodeBuffer* cb,
483 OopMapSet* oop_maps,
484 int frame_size)
485 {
486 ExceptionBlob* blob = NULL;
487 ThreadInVMfromUnknown __tiv; // get to VM state in case we block on CodeCache_lock
488 {
489 MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
490 unsigned int size = allocation_size(cb, sizeof(ExceptionBlob));
491 blob = new (size) ExceptionBlob(cb, size, oop_maps, frame_size);
492 }
494 trace_new_stub(blob, "ExceptionBlob");
496 return blob;
497 }
500 #endif // COMPILER2
503 //----------------------------------------------------------------------------------------------------
504 // Implementation of SafepointBlob
506 SafepointBlob::SafepointBlob(
507 CodeBuffer* cb,
508 int size,
509 OopMapSet* oop_maps,
510 int frame_size
511 )
512 : SingletonBlob("SafepointBlob", cb, sizeof(SafepointBlob), size, frame_size, oop_maps)
513 {}
516 SafepointBlob* SafepointBlob::create(
517 CodeBuffer* cb,
518 OopMapSet* oop_maps,
519 int frame_size)
520 {
521 SafepointBlob* blob = NULL;
522 ThreadInVMfromUnknown __tiv; // get to VM state in case we block on CodeCache_lock
523 {
524 MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
525 unsigned int size = allocation_size(cb, sizeof(SafepointBlob));
526 blob = new (size) SafepointBlob(cb, size, oop_maps, frame_size);
527 }
529 trace_new_stub(blob, "SafepointBlob");
531 return blob;
532 }
535 //----------------------------------------------------------------------------------------------------
536 // Verification and printing
538 void CodeBlob::verify() {
539 ShouldNotReachHere();
540 }
542 void CodeBlob::print_on(outputStream* st) const {
543 st->print_cr("[CodeBlob (" INTPTR_FORMAT ")]", p2i(this));
544 st->print_cr("Framesize: %d", _frame_size);
545 }
547 void CodeBlob::print_value_on(outputStream* st) const {
548 st->print_cr("[CodeBlob]");
549 }
551 void BufferBlob::verify() {
552 // unimplemented
553 }
555 void BufferBlob::print_on(outputStream* st) const {
556 CodeBlob::print_on(st);
557 print_value_on(st);
558 }
560 void BufferBlob::print_value_on(outputStream* st) const {
561 st->print_cr("BufferBlob (" INTPTR_FORMAT ") used for %s", p2i(this), name());
562 }
564 void RuntimeStub::verify() {
565 // unimplemented
566 }
568 void RuntimeStub::print_on(outputStream* st) const {
569 ttyLocker ttyl;
570 CodeBlob::print_on(st);
571 st->print("Runtime Stub (" INTPTR_FORMAT "): ", p2i(this));
572 st->print_cr("%s", name());
573 Disassembler::decode((CodeBlob*)this, st);
574 }
576 void RuntimeStub::print_value_on(outputStream* st) const {
577 st->print("RuntimeStub (" INTPTR_FORMAT "): ", p2i(this)); st->print("%s", name());
578 }
580 void SingletonBlob::verify() {
581 // unimplemented
582 }
584 void SingletonBlob::print_on(outputStream* st) const {
585 ttyLocker ttyl;
586 CodeBlob::print_on(st);
587 st->print_cr("%s", name());
588 Disassembler::decode((CodeBlob*)this, st);
589 }
591 void SingletonBlob::print_value_on(outputStream* st) const {
592 st->print_cr("%s", name());
593 }
595 void DeoptimizationBlob::print_value_on(outputStream* st) const {
596 st->print_cr("Deoptimization (frame not available)");
597 }