Wed, 14 Oct 2020 17:44:48 +0800
Merge
1 /*
2 * Copyright (c) 1998, 2018, 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 CodeBlob::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 }
301 VtableBlob::VtableBlob(const char* name, int size) :
302 BufferBlob(name, size) {
303 }
305 VtableBlob* VtableBlob::create(const char* name, int buffer_size) {
306 ThreadInVMfromUnknown __tiv; // get to VM state in case we block on CodeCache_lock
308 VtableBlob* blob = NULL;
309 unsigned int size = sizeof(VtableBlob);
310 // align the size to CodeEntryAlignment
311 size = align_code_offset(size);
312 size += round_to(buffer_size, oopSize);
313 assert(name != NULL, "must provide a name");
314 {
315 MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
316 blob = new (size) VtableBlob(name, size);
317 }
318 // Track memory usage statistic after releasing CodeCache_lock
319 MemoryService::track_code_cache_memory_usage();
321 return blob;
322 }
324 //----------------------------------------------------------------------------------------------------
325 // Implementation of MethodHandlesAdapterBlob
327 MethodHandlesAdapterBlob* MethodHandlesAdapterBlob::create(int buffer_size) {
328 ThreadInVMfromUnknown __tiv; // get to VM state in case we block on CodeCache_lock
330 MethodHandlesAdapterBlob* blob = NULL;
331 unsigned int size = sizeof(MethodHandlesAdapterBlob);
332 // align the size to CodeEntryAlignment
333 size = align_code_offset(size);
334 size += round_to(buffer_size, oopSize);
335 {
336 MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
337 // The parameter 'true' indicates a critical memory allocation.
338 // This means that CodeCacheMinimumFreeSpace is used, if necessary
339 const bool is_critical = true;
340 blob = new (size, is_critical) MethodHandlesAdapterBlob(size);
341 }
342 // Track memory usage statistic after releasing CodeCache_lock
343 MemoryService::track_code_cache_memory_usage();
345 return blob;
346 }
349 //----------------------------------------------------------------------------------------------------
350 // Implementation of RuntimeStub
352 RuntimeStub::RuntimeStub(
353 const char* name,
354 CodeBuffer* cb,
355 int size,
356 int frame_complete,
357 int frame_size,
358 OopMapSet* oop_maps,
359 bool caller_must_gc_arguments
360 )
361 : CodeBlob(name, cb, sizeof(RuntimeStub), size, frame_complete, frame_size, oop_maps)
362 {
363 _caller_must_gc_arguments = caller_must_gc_arguments;
364 }
367 RuntimeStub* RuntimeStub::new_runtime_stub(const char* stub_name,
368 CodeBuffer* cb,
369 int frame_complete,
370 int frame_size,
371 OopMapSet* oop_maps,
372 bool caller_must_gc_arguments)
373 {
374 RuntimeStub* stub = NULL;
375 ThreadInVMfromUnknown __tiv; // get to VM state in case we block on CodeCache_lock
376 {
377 MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
378 unsigned int size = allocation_size(cb, sizeof(RuntimeStub));
379 stub = new (size) RuntimeStub(stub_name, cb, size, frame_complete, frame_size, oop_maps, caller_must_gc_arguments);
380 }
382 trace_new_stub(stub, "RuntimeStub - ", stub_name);
384 return stub;
385 }
388 void* RuntimeStub::operator new(size_t s, unsigned size) throw() {
389 void* p = CodeCache::allocate(size, true);
390 if (!p) fatal("Initial size of CodeCache is too small");
391 return p;
392 }
394 // operator new shared by all singletons:
395 void* SingletonBlob::operator new(size_t s, unsigned size) throw() {
396 void* p = CodeCache::allocate(size, true);
397 if (!p) fatal("Initial size of CodeCache is too small");
398 return p;
399 }
402 //----------------------------------------------------------------------------------------------------
403 // Implementation of DeoptimizationBlob
405 DeoptimizationBlob::DeoptimizationBlob(
406 CodeBuffer* cb,
407 int size,
408 OopMapSet* oop_maps,
409 int unpack_offset,
410 int unpack_with_exception_offset,
411 int unpack_with_reexecution_offset,
412 int frame_size
413 )
414 : SingletonBlob("DeoptimizationBlob", cb, sizeof(DeoptimizationBlob), size, frame_size, oop_maps)
415 {
416 _unpack_offset = unpack_offset;
417 _unpack_with_exception = unpack_with_exception_offset;
418 _unpack_with_reexecution = unpack_with_reexecution_offset;
419 #ifdef COMPILER1
420 _unpack_with_exception_in_tls = -1;
421 #endif
422 }
425 DeoptimizationBlob* DeoptimizationBlob::create(
426 CodeBuffer* cb,
427 OopMapSet* oop_maps,
428 int unpack_offset,
429 int unpack_with_exception_offset,
430 int unpack_with_reexecution_offset,
431 int frame_size)
432 {
433 DeoptimizationBlob* blob = NULL;
434 ThreadInVMfromUnknown __tiv; // get to VM state in case we block on CodeCache_lock
435 {
436 MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
437 unsigned int size = allocation_size(cb, sizeof(DeoptimizationBlob));
438 blob = new (size) DeoptimizationBlob(cb,
439 size,
440 oop_maps,
441 unpack_offset,
442 unpack_with_exception_offset,
443 unpack_with_reexecution_offset,
444 frame_size);
445 }
447 trace_new_stub(blob, "DeoptimizationBlob");
449 return blob;
450 }
453 //----------------------------------------------------------------------------------------------------
454 // Implementation of UncommonTrapBlob
456 #ifdef COMPILER2
457 UncommonTrapBlob::UncommonTrapBlob(
458 CodeBuffer* cb,
459 int size,
460 OopMapSet* oop_maps,
461 int frame_size
462 )
463 : SingletonBlob("UncommonTrapBlob", cb, sizeof(UncommonTrapBlob), size, frame_size, oop_maps)
464 {}
467 UncommonTrapBlob* UncommonTrapBlob::create(
468 CodeBuffer* cb,
469 OopMapSet* oop_maps,
470 int frame_size)
471 {
472 UncommonTrapBlob* blob = NULL;
473 ThreadInVMfromUnknown __tiv; // get to VM state in case we block on CodeCache_lock
474 {
475 MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
476 unsigned int size = allocation_size(cb, sizeof(UncommonTrapBlob));
477 blob = new (size) UncommonTrapBlob(cb, size, oop_maps, frame_size);
478 }
480 trace_new_stub(blob, "UncommonTrapBlob");
482 return blob;
483 }
486 #endif // COMPILER2
489 //----------------------------------------------------------------------------------------------------
490 // Implementation of ExceptionBlob
492 #ifdef COMPILER2
493 ExceptionBlob::ExceptionBlob(
494 CodeBuffer* cb,
495 int size,
496 OopMapSet* oop_maps,
497 int frame_size
498 )
499 : SingletonBlob("ExceptionBlob", cb, sizeof(ExceptionBlob), size, frame_size, oop_maps)
500 {}
503 ExceptionBlob* ExceptionBlob::create(
504 CodeBuffer* cb,
505 OopMapSet* oop_maps,
506 int frame_size)
507 {
508 ExceptionBlob* blob = NULL;
509 ThreadInVMfromUnknown __tiv; // get to VM state in case we block on CodeCache_lock
510 {
511 MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
512 unsigned int size = allocation_size(cb, sizeof(ExceptionBlob));
513 blob = new (size) ExceptionBlob(cb, size, oop_maps, frame_size);
514 }
516 trace_new_stub(blob, "ExceptionBlob");
518 return blob;
519 }
522 #endif // COMPILER2
525 //----------------------------------------------------------------------------------------------------
526 // Implementation of SafepointBlob
528 SafepointBlob::SafepointBlob(
529 CodeBuffer* cb,
530 int size,
531 OopMapSet* oop_maps,
532 int frame_size
533 )
534 : SingletonBlob("SafepointBlob", cb, sizeof(SafepointBlob), size, frame_size, oop_maps)
535 {}
538 SafepointBlob* SafepointBlob::create(
539 CodeBuffer* cb,
540 OopMapSet* oop_maps,
541 int frame_size)
542 {
543 SafepointBlob* blob = NULL;
544 ThreadInVMfromUnknown __tiv; // get to VM state in case we block on CodeCache_lock
545 {
546 MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
547 unsigned int size = allocation_size(cb, sizeof(SafepointBlob));
548 blob = new (size) SafepointBlob(cb, size, oop_maps, frame_size);
549 }
551 trace_new_stub(blob, "SafepointBlob");
553 return blob;
554 }
557 //----------------------------------------------------------------------------------------------------
558 // Verification and printing
560 void CodeBlob::verify() {
561 ShouldNotReachHere();
562 }
564 void CodeBlob::print_on(outputStream* st) const {
565 st->print_cr("[CodeBlob (" INTPTR_FORMAT ")]", p2i(this));
566 st->print_cr("Framesize: %d", _frame_size);
567 }
569 void CodeBlob::print_value_on(outputStream* st) const {
570 st->print_cr("[CodeBlob]");
571 }
573 void BufferBlob::verify() {
574 // unimplemented
575 }
577 void BufferBlob::print_on(outputStream* st) const {
578 CodeBlob::print_on(st);
579 print_value_on(st);
580 }
582 void BufferBlob::print_value_on(outputStream* st) const {
583 st->print_cr("BufferBlob (" INTPTR_FORMAT ") used for %s", p2i(this), name());
584 }
586 void RuntimeStub::verify() {
587 // unimplemented
588 }
590 void RuntimeStub::print_on(outputStream* st) const {
591 ttyLocker ttyl;
592 CodeBlob::print_on(st);
593 st->print("Runtime Stub (" INTPTR_FORMAT "): ", p2i(this));
594 st->print_cr("%s", name());
595 Disassembler::decode((CodeBlob*)this, st);
596 }
598 void RuntimeStub::print_value_on(outputStream* st) const {
599 st->print("RuntimeStub (" INTPTR_FORMAT "): ", p2i(this)); st->print("%s", name());
600 }
602 void SingletonBlob::verify() {
603 // unimplemented
604 }
606 void SingletonBlob::print_on(outputStream* st) const {
607 ttyLocker ttyl;
608 CodeBlob::print_on(st);
609 st->print_cr("%s", name());
610 Disassembler::decode((CodeBlob*)this, st);
611 }
613 void SingletonBlob::print_value_on(outputStream* st) const {
614 st->print_cr("%s", name());
615 }
617 void DeoptimizationBlob::print_value_on(outputStream* st) const {
618 st->print_cr("Deoptimization (frame not available)");
619 }