Tue, 23 Nov 2010 13:22:55 -0800
6989984: Use standard include model for Hospot
Summary: Replaced MakeDeps and the includeDB files with more standardized solutions.
Reviewed-by: coleenp, kvn, kamg
1 /*
2 * Copyright (c) 1998, 2010, 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 #include "precompiled.hpp"
26 #include "code/codeBlob.hpp"
27 #include "code/codeCache.hpp"
28 #include "code/relocInfo.hpp"
29 #include "compiler/disassembler.hpp"
30 #include "interpreter/bytecode.hpp"
31 #include "memory/allocation.inline.hpp"
32 #include "memory/heap.hpp"
33 #include "oops/oop.inline.hpp"
34 #include "prims/forte.hpp"
35 #include "runtime/handles.inline.hpp"
36 #include "runtime/interfaceSupport.hpp"
37 #include "runtime/mutexLocker.hpp"
38 #include "runtime/safepoint.hpp"
39 #include "runtime/sharedRuntime.hpp"
40 #include "runtime/vframe.hpp"
41 #include "services/memoryService.hpp"
42 #ifdef TARGET_ARCH_x86
43 # include "nativeInst_x86.hpp"
44 #endif
45 #ifdef TARGET_ARCH_sparc
46 # include "nativeInst_sparc.hpp"
47 #endif
48 #ifdef TARGET_ARCH_zero
49 # include "nativeInst_zero.hpp"
50 #endif
51 #ifdef COMPILER1
52 #include "c1/c1_Runtime1.hpp"
53 #endif
55 unsigned int align_code_offset(int offset) {
56 // align the size to CodeEntryAlignment
57 return
58 ((offset + (int)CodeHeap::header_size() + (CodeEntryAlignment-1)) & ~(CodeEntryAlignment-1))
59 - (int)CodeHeap::header_size();
60 }
63 // This must be consistent with the CodeBlob constructor's layout actions.
64 unsigned int CodeBlob::allocation_size(CodeBuffer* cb, int header_size) {
65 unsigned int size = header_size;
66 size += round_to(cb->total_relocation_size(), oopSize);
67 // align the size to CodeEntryAlignment
68 size = align_code_offset(size);
69 size += round_to(cb->total_content_size(), oopSize);
70 size += round_to(cb->total_oop_size(), oopSize);
71 return size;
72 }
75 // Creates a simple CodeBlob. Sets up the size of the different regions.
76 CodeBlob::CodeBlob(const char* name, int header_size, int size, int frame_complete, int locs_size) {
77 assert(size == round_to(size, oopSize), "unaligned size");
78 assert(locs_size == round_to(locs_size, oopSize), "unaligned size");
79 assert(header_size == round_to(header_size, oopSize), "unaligned size");
80 assert(!UseRelocIndex, "no space allocated for reloc index yet");
82 // Note: If UseRelocIndex is enabled, there needs to be (at least) one
83 // extra word for the relocation information, containing the reloc
84 // index table length. Unfortunately, the reloc index table imple-
85 // mentation is not easily understandable and thus it is not clear
86 // what exactly the format is supposed to be. For now, we just turn
87 // off the use of this table (gri 7/6/2000).
89 _name = name;
90 _size = size;
91 _frame_complete_offset = frame_complete;
92 _header_size = header_size;
93 _relocation_size = locs_size;
94 _content_offset = align_code_offset(header_size + _relocation_size);
95 _code_offset = _content_offset;
96 _data_offset = size;
97 _frame_size = 0;
98 set_oop_maps(NULL);
99 }
102 // Creates a CodeBlob from a CodeBuffer. Sets up the size of the different regions,
103 // and copy code and relocation info.
104 CodeBlob::CodeBlob(
105 const char* name,
106 CodeBuffer* cb,
107 int header_size,
108 int size,
109 int frame_complete,
110 int frame_size,
111 OopMapSet* oop_maps
112 ) {
113 assert(size == round_to(size, oopSize), "unaligned size");
114 assert(header_size == round_to(header_size, oopSize), "unaligned size");
116 _name = name;
117 _size = size;
118 _frame_complete_offset = frame_complete;
119 _header_size = header_size;
120 _relocation_size = round_to(cb->total_relocation_size(), oopSize);
121 _content_offset = align_code_offset(header_size + _relocation_size);
122 _code_offset = _content_offset + cb->total_offset_of(cb->insts());
123 _data_offset = _content_offset + round_to(cb->total_content_size(), oopSize);
124 assert(_data_offset <= size, "codeBlob is too small");
126 cb->copy_code_and_locs_to(this);
127 set_oop_maps(oop_maps);
128 _frame_size = frame_size;
129 #ifdef COMPILER1
130 // probably wrong for tiered
131 assert(_frame_size >= -1, "must use frame size or -1 for runtime stubs");
132 #endif // COMPILER1
133 }
136 void CodeBlob::set_oop_maps(OopMapSet* p) {
137 // Danger Will Robinson! This method allocates a big
138 // chunk of memory, its your job to free it.
139 if (p != NULL) {
140 // We need to allocate a chunk big enough to hold the OopMapSet and all of its OopMaps
141 _oop_maps = (OopMapSet* )NEW_C_HEAP_ARRAY(unsigned char, p->heap_size());
142 p->copy_to((address)_oop_maps);
143 } else {
144 _oop_maps = NULL;
145 }
146 }
149 void CodeBlob::flush() {
150 if (_oop_maps) {
151 FREE_C_HEAP_ARRAY(unsigned char, _oop_maps);
152 _oop_maps = NULL;
153 }
154 _comments.free();
155 }
158 OopMap* CodeBlob::oop_map_for_return_address(address return_address) {
159 assert(oop_maps() != NULL, "nope");
160 return oop_maps()->find_map_at_offset((intptr_t) return_address - (intptr_t) code_begin());
161 }
164 //----------------------------------------------------------------------------------------------------
165 // Implementation of BufferBlob
168 BufferBlob::BufferBlob(const char* name, int size)
169 : CodeBlob(name, sizeof(BufferBlob), size, CodeOffsets::frame_never_safe, /*locs_size:*/ 0)
170 {}
172 BufferBlob* BufferBlob::create(const char* name, int buffer_size) {
173 ThreadInVMfromUnknown __tiv; // get to VM state in case we block on CodeCache_lock
175 BufferBlob* blob = NULL;
176 unsigned int size = sizeof(BufferBlob);
177 // align the size to CodeEntryAlignment
178 size = align_code_offset(size);
179 size += round_to(buffer_size, oopSize);
180 assert(name != NULL, "must provide a name");
181 {
182 MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
183 blob = new (size) BufferBlob(name, size);
184 }
185 // Track memory usage statistic after releasing CodeCache_lock
186 MemoryService::track_code_cache_memory_usage();
188 return blob;
189 }
192 BufferBlob::BufferBlob(const char* name, int size, CodeBuffer* cb)
193 : CodeBlob(name, cb, sizeof(BufferBlob), size, CodeOffsets::frame_never_safe, 0, NULL)
194 {}
196 BufferBlob* BufferBlob::create(const char* name, CodeBuffer* cb) {
197 ThreadInVMfromUnknown __tiv; // get to VM state in case we block on CodeCache_lock
199 BufferBlob* blob = NULL;
200 unsigned int size = allocation_size(cb, sizeof(BufferBlob));
201 assert(name != NULL, "must provide a name");
202 {
203 MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
204 blob = new (size) BufferBlob(name, size, cb);
205 }
206 // Track memory usage statistic after releasing CodeCache_lock
207 MemoryService::track_code_cache_memory_usage();
209 return blob;
210 }
213 void* BufferBlob::operator new(size_t s, unsigned size) {
214 void* p = CodeCache::allocate(size);
215 return p;
216 }
219 void BufferBlob::free( BufferBlob *blob ) {
220 ThreadInVMfromUnknown __tiv; // get to VM state in case we block on CodeCache_lock
221 {
222 MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
223 CodeCache::free((CodeBlob*)blob);
224 }
225 // Track memory usage statistic after releasing CodeCache_lock
226 MemoryService::track_code_cache_memory_usage();
227 }
230 //----------------------------------------------------------------------------------------------------
231 // Implementation of AdapterBlob
233 AdapterBlob::AdapterBlob(int size, CodeBuffer* cb) :
234 BufferBlob("I2C/C2I adapters", size, cb) {
235 CodeCache::commit(this);
236 }
238 AdapterBlob* AdapterBlob::create(CodeBuffer* cb) {
239 ThreadInVMfromUnknown __tiv; // get to VM state in case we block on CodeCache_lock
241 AdapterBlob* blob = NULL;
242 unsigned int size = allocation_size(cb, sizeof(AdapterBlob));
243 {
244 MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
245 blob = new (size) AdapterBlob(size, cb);
246 }
247 // Track memory usage statistic after releasing CodeCache_lock
248 MemoryService::track_code_cache_memory_usage();
250 return blob;
251 }
254 //----------------------------------------------------------------------------------------------------
255 // Implementation of MethodHandlesAdapterBlob
257 MethodHandlesAdapterBlob* MethodHandlesAdapterBlob::create(int buffer_size) {
258 ThreadInVMfromUnknown __tiv; // get to VM state in case we block on CodeCache_lock
260 MethodHandlesAdapterBlob* blob = NULL;
261 unsigned int size = sizeof(MethodHandlesAdapterBlob);
262 // align the size to CodeEntryAlignment
263 size = align_code_offset(size);
264 size += round_to(buffer_size, oopSize);
265 {
266 MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
267 blob = new (size) MethodHandlesAdapterBlob(size);
268 }
269 // Track memory usage statistic after releasing CodeCache_lock
270 MemoryService::track_code_cache_memory_usage();
272 return blob;
273 }
276 //----------------------------------------------------------------------------------------------------
277 // Implementation of RuntimeStub
279 RuntimeStub::RuntimeStub(
280 const char* name,
281 CodeBuffer* cb,
282 int size,
283 int frame_complete,
284 int frame_size,
285 OopMapSet* oop_maps,
286 bool caller_must_gc_arguments
287 )
288 : CodeBlob(name, cb, sizeof(RuntimeStub), size, frame_complete, frame_size, oop_maps)
289 {
290 _caller_must_gc_arguments = caller_must_gc_arguments;
291 }
294 RuntimeStub* RuntimeStub::new_runtime_stub(const char* stub_name,
295 CodeBuffer* cb,
296 int frame_complete,
297 int frame_size,
298 OopMapSet* oop_maps,
299 bool caller_must_gc_arguments)
300 {
301 RuntimeStub* stub = NULL;
302 ThreadInVMfromUnknown __tiv; // get to VM state in case we block on CodeCache_lock
303 {
304 MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
305 unsigned int size = allocation_size(cb, sizeof(RuntimeStub));
306 stub = new (size) RuntimeStub(stub_name, cb, size, frame_complete, frame_size, oop_maps, caller_must_gc_arguments);
307 }
309 // Do not hold the CodeCache lock during name formatting.
310 if (stub != NULL) {
311 char stub_id[256];
312 jio_snprintf(stub_id, sizeof(stub_id), "RuntimeStub - %s", stub_name);
313 if (PrintStubCode) {
314 tty->print_cr("Decoding %s " INTPTR_FORMAT, stub_id, stub);
315 Disassembler::decode(stub->code_begin(), stub->code_end());
316 }
317 Forte::register_stub(stub_id, stub->code_begin(), stub->code_end());
319 if (JvmtiExport::should_post_dynamic_code_generated()) {
320 JvmtiExport::post_dynamic_code_generated(stub_name, stub->code_begin(), stub->code_end());
321 }
322 }
324 // Track memory usage statistic after releasing CodeCache_lock
325 MemoryService::track_code_cache_memory_usage();
327 return stub;
328 }
331 void* RuntimeStub::operator new(size_t s, unsigned size) {
332 void* p = CodeCache::allocate(size);
333 if (!p) fatal("Initial size of CodeCache is too small");
334 return p;
335 }
338 //----------------------------------------------------------------------------------------------------
339 // Implementation of DeoptimizationBlob
341 DeoptimizationBlob::DeoptimizationBlob(
342 CodeBuffer* cb,
343 int size,
344 OopMapSet* oop_maps,
345 int unpack_offset,
346 int unpack_with_exception_offset,
347 int unpack_with_reexecution_offset,
348 int frame_size
349 )
350 : SingletonBlob("DeoptimizationBlob", cb, sizeof(DeoptimizationBlob), size, frame_size, oop_maps)
351 {
352 _unpack_offset = unpack_offset;
353 _unpack_with_exception = unpack_with_exception_offset;
354 _unpack_with_reexecution = unpack_with_reexecution_offset;
355 #ifdef COMPILER1
356 _unpack_with_exception_in_tls = -1;
357 #endif
358 }
361 DeoptimizationBlob* DeoptimizationBlob::create(
362 CodeBuffer* cb,
363 OopMapSet* oop_maps,
364 int unpack_offset,
365 int unpack_with_exception_offset,
366 int unpack_with_reexecution_offset,
367 int frame_size)
368 {
369 DeoptimizationBlob* blob = NULL;
370 ThreadInVMfromUnknown __tiv; // get to VM state in case we block on CodeCache_lock
371 {
372 MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
373 unsigned int size = allocation_size(cb, sizeof(DeoptimizationBlob));
374 blob = new (size) DeoptimizationBlob(cb,
375 size,
376 oop_maps,
377 unpack_offset,
378 unpack_with_exception_offset,
379 unpack_with_reexecution_offset,
380 frame_size);
381 }
383 // Do not hold the CodeCache lock during name formatting.
384 if (blob != NULL) {
385 char blob_id[256];
386 jio_snprintf(blob_id, sizeof(blob_id), "DeoptimizationBlob@" PTR_FORMAT, blob->code_begin());
387 if (PrintStubCode) {
388 tty->print_cr("Decoding %s " INTPTR_FORMAT, blob_id, blob);
389 Disassembler::decode(blob->code_begin(), blob->code_end());
390 }
391 Forte::register_stub(blob_id, blob->code_begin(), blob->code_end());
393 if (JvmtiExport::should_post_dynamic_code_generated()) {
394 JvmtiExport::post_dynamic_code_generated("DeoptimizationBlob", blob->code_begin(), blob->code_end());
395 }
396 }
398 // Track memory usage statistic after releasing CodeCache_lock
399 MemoryService::track_code_cache_memory_usage();
401 return blob;
402 }
405 void* DeoptimizationBlob::operator new(size_t s, unsigned size) {
406 void* p = CodeCache::allocate(size);
407 if (!p) fatal("Initial size of CodeCache is too small");
408 return p;
409 }
411 //----------------------------------------------------------------------------------------------------
412 // Implementation of UncommonTrapBlob
414 #ifdef COMPILER2
415 UncommonTrapBlob::UncommonTrapBlob(
416 CodeBuffer* cb,
417 int size,
418 OopMapSet* oop_maps,
419 int frame_size
420 )
421 : SingletonBlob("UncommonTrapBlob", cb, sizeof(UncommonTrapBlob), size, frame_size, oop_maps)
422 {}
425 UncommonTrapBlob* UncommonTrapBlob::create(
426 CodeBuffer* cb,
427 OopMapSet* oop_maps,
428 int frame_size)
429 {
430 UncommonTrapBlob* blob = NULL;
431 ThreadInVMfromUnknown __tiv; // get to VM state in case we block on CodeCache_lock
432 {
433 MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
434 unsigned int size = allocation_size(cb, sizeof(UncommonTrapBlob));
435 blob = new (size) UncommonTrapBlob(cb, size, oop_maps, frame_size);
436 }
438 // Do not hold the CodeCache lock during name formatting.
439 if (blob != NULL) {
440 char blob_id[256];
441 jio_snprintf(blob_id, sizeof(blob_id), "UncommonTrapBlob@" PTR_FORMAT, blob->code_begin());
442 if (PrintStubCode) {
443 tty->print_cr("Decoding %s " INTPTR_FORMAT, blob_id, blob);
444 Disassembler::decode(blob->code_begin(), blob->code_end());
445 }
446 Forte::register_stub(blob_id, blob->code_begin(), blob->code_end());
448 if (JvmtiExport::should_post_dynamic_code_generated()) {
449 JvmtiExport::post_dynamic_code_generated("UncommonTrapBlob", blob->code_begin(), blob->code_end());
450 }
451 }
453 // Track memory usage statistic after releasing CodeCache_lock
454 MemoryService::track_code_cache_memory_usage();
456 return blob;
457 }
460 void* UncommonTrapBlob::operator new(size_t s, unsigned size) {
461 void* p = CodeCache::allocate(size);
462 if (!p) fatal("Initial size of CodeCache is too small");
463 return p;
464 }
465 #endif // COMPILER2
468 //----------------------------------------------------------------------------------------------------
469 // Implementation of ExceptionBlob
471 #ifdef COMPILER2
472 ExceptionBlob::ExceptionBlob(
473 CodeBuffer* cb,
474 int size,
475 OopMapSet* oop_maps,
476 int frame_size
477 )
478 : SingletonBlob("ExceptionBlob", cb, sizeof(ExceptionBlob), size, frame_size, oop_maps)
479 {}
482 ExceptionBlob* ExceptionBlob::create(
483 CodeBuffer* cb,
484 OopMapSet* oop_maps,
485 int frame_size)
486 {
487 ExceptionBlob* blob = NULL;
488 ThreadInVMfromUnknown __tiv; // get to VM state in case we block on CodeCache_lock
489 {
490 MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
491 unsigned int size = allocation_size(cb, sizeof(ExceptionBlob));
492 blob = new (size) ExceptionBlob(cb, size, oop_maps, frame_size);
493 }
495 // We do not need to hold the CodeCache lock during name formatting
496 if (blob != NULL) {
497 char blob_id[256];
498 jio_snprintf(blob_id, sizeof(blob_id), "ExceptionBlob@" PTR_FORMAT, blob->code_begin());
499 if (PrintStubCode) {
500 tty->print_cr("Decoding %s " INTPTR_FORMAT, blob_id, blob);
501 Disassembler::decode(blob->code_begin(), blob->code_end());
502 }
503 Forte::register_stub(blob_id, blob->code_begin(), blob->code_end());
505 if (JvmtiExport::should_post_dynamic_code_generated()) {
506 JvmtiExport::post_dynamic_code_generated("ExceptionBlob", blob->code_begin(), blob->code_end());
507 }
508 }
510 // Track memory usage statistic after releasing CodeCache_lock
511 MemoryService::track_code_cache_memory_usage();
513 return blob;
514 }
517 void* ExceptionBlob::operator new(size_t s, unsigned size) {
518 void* p = CodeCache::allocate(size);
519 if (!p) fatal("Initial size of CodeCache is too small");
520 return p;
521 }
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 // We do not need to hold the CodeCache lock during name formatting.
552 if (blob != NULL) {
553 char blob_id[256];
554 jio_snprintf(blob_id, sizeof(blob_id), "SafepointBlob@" PTR_FORMAT, blob->code_begin());
555 if (PrintStubCode) {
556 tty->print_cr("Decoding %s " INTPTR_FORMAT, blob_id, blob);
557 Disassembler::decode(blob->code_begin(), blob->code_end());
558 }
559 Forte::register_stub(blob_id, blob->code_begin(), blob->code_end());
561 if (JvmtiExport::should_post_dynamic_code_generated()) {
562 JvmtiExport::post_dynamic_code_generated("SafepointBlob", blob->code_begin(), blob->code_end());
563 }
564 }
566 // Track memory usage statistic after releasing CodeCache_lock
567 MemoryService::track_code_cache_memory_usage();
569 return blob;
570 }
573 void* SafepointBlob::operator new(size_t s, unsigned size) {
574 void* p = CodeCache::allocate(size);
575 if (!p) fatal("Initial size of CodeCache is too small");
576 return p;
577 }
580 //----------------------------------------------------------------------------------------------------
581 // Verification and printing
583 void CodeBlob::verify() {
584 ShouldNotReachHere();
585 }
587 void CodeBlob::print_on(outputStream* st) const {
588 st->print_cr("[CodeBlob (" INTPTR_FORMAT ")]", this);
589 st->print_cr("Framesize: %d", _frame_size);
590 }
592 void CodeBlob::print_value_on(outputStream* st) const {
593 st->print_cr("[CodeBlob]");
594 }
596 void BufferBlob::verify() {
597 // unimplemented
598 }
600 void BufferBlob::print_on(outputStream* st) const {
601 CodeBlob::print_on(st);
602 print_value_on(st);
603 }
605 void BufferBlob::print_value_on(outputStream* st) const {
606 st->print_cr("BufferBlob (" INTPTR_FORMAT ") used for %s", this, name());
607 }
609 void RuntimeStub::verify() {
610 // unimplemented
611 }
613 void RuntimeStub::print_on(outputStream* st) const {
614 CodeBlob::print_on(st);
615 st->print("Runtime Stub (" INTPTR_FORMAT "): ", this);
616 st->print_cr(name());
617 Disassembler::decode((CodeBlob*)this, st);
618 }
620 void RuntimeStub::print_value_on(outputStream* st) const {
621 st->print("RuntimeStub (" INTPTR_FORMAT "): ", this); st->print(name());
622 }
624 void SingletonBlob::verify() {
625 // unimplemented
626 }
628 void SingletonBlob::print_on(outputStream* st) const {
629 CodeBlob::print_on(st);
630 st->print_cr(name());
631 Disassembler::decode((CodeBlob*)this, st);
632 }
634 void SingletonBlob::print_value_on(outputStream* st) const {
635 st->print_cr(name());
636 }
638 void DeoptimizationBlob::print_value_on(outputStream* st) const {
639 st->print_cr("Deoptimization (frame not available)");
640 }