codeBlob.cpp revision 3602:da91efe96a93
1/*
2 * Copyright (c) 1998, 2012, 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 */
24
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 TARGET_ARCH_arm
52# include "nativeInst_arm.hpp"
53#endif
54#ifdef TARGET_ARCH_ppc
55# include "nativeInst_ppc.hpp"
56#endif
57#ifdef COMPILER1
58#include "c1/c1_Runtime1.hpp"
59#endif
60
61unsigned int align_code_offset(int offset) {
62  // align the size to CodeEntryAlignment
63  return
64    ((offset + (int)CodeHeap::header_size() + (CodeEntryAlignment-1)) & ~(CodeEntryAlignment-1))
65    - (int)CodeHeap::header_size();
66}
67
68
69// This must be consistent with the CodeBlob constructor's layout actions.
70unsigned int CodeBlob::allocation_size(CodeBuffer* cb, int header_size) {
71  unsigned int size = header_size;
72  size += round_to(cb->total_relocation_size(), oopSize);
73  // align the size to CodeEntryAlignment
74  size = align_code_offset(size);
75  size += round_to(cb->total_content_size(), oopSize);
76  size += round_to(cb->total_oop_size(), oopSize);
77  size += round_to(cb->total_metadata_size(), oopSize);
78  return size;
79}
80
81
82// Creates a simple CodeBlob. Sets up the size of the different regions.
83CodeBlob::CodeBlob(const char* name, int header_size, int size, int frame_complete, int locs_size) {
84  assert(size        == round_to(size,        oopSize), "unaligned size");
85  assert(locs_size   == round_to(locs_size,   oopSize), "unaligned size");
86  assert(header_size == round_to(header_size, oopSize), "unaligned size");
87  assert(!UseRelocIndex, "no space allocated for reloc index yet");
88
89  // Note: If UseRelocIndex is enabled, there needs to be (at least) one
90  //       extra word for the relocation information, containing the reloc
91  //       index table length. Unfortunately, the reloc index table imple-
92  //       mentation is not easily understandable and thus it is not clear
93  //       what exactly the format is supposed to be. For now, we just turn
94  //       off the use of this table (gri 7/6/2000).
95
96  _name                  = name;
97  _size                  = size;
98  _frame_complete_offset = frame_complete;
99  _header_size           = header_size;
100  _relocation_size       = locs_size;
101  _content_offset        = align_code_offset(header_size + _relocation_size);
102  _code_offset           = _content_offset;
103  _data_offset           = size;
104  _frame_size            =  0;
105  set_oop_maps(NULL);
106}
107
108
109// Creates a CodeBlob from a CodeBuffer. Sets up the size of the different regions,
110// and copy code and relocation info.
111CodeBlob::CodeBlob(
112  const char* name,
113  CodeBuffer* cb,
114  int         header_size,
115  int         size,
116  int         frame_complete,
117  int         frame_size,
118  OopMapSet*  oop_maps
119) {
120  assert(size        == round_to(size,        oopSize), "unaligned size");
121  assert(header_size == round_to(header_size, oopSize), "unaligned size");
122
123  _name                  = name;
124  _size                  = size;
125  _frame_complete_offset = frame_complete;
126  _header_size           = header_size;
127  _relocation_size       = round_to(cb->total_relocation_size(), oopSize);
128  _content_offset        = align_code_offset(header_size + _relocation_size);
129  _code_offset           = _content_offset + cb->total_offset_of(cb->insts());
130  _data_offset           = _content_offset + round_to(cb->total_content_size(), oopSize);
131  assert(_data_offset <= size, "codeBlob is too small");
132
133  cb->copy_code_and_locs_to(this);
134  set_oop_maps(oop_maps);
135  _frame_size = frame_size;
136#ifdef COMPILER1
137  // probably wrong for tiered
138  assert(_frame_size >= -1, "must use frame size or -1 for runtime stubs");
139#endif // COMPILER1
140}
141
142
143void CodeBlob::set_oop_maps(OopMapSet* p) {
144  // Danger Will Robinson! This method allocates a big
145  // chunk of memory, its your job to free it.
146  if (p != NULL) {
147    // We need to allocate a chunk big enough to hold the OopMapSet and all of its OopMaps
148    _oop_maps = (OopMapSet* )NEW_C_HEAP_ARRAY(unsigned char, p->heap_size(), mtCode);
149    p->copy_to((address)_oop_maps);
150  } else {
151    _oop_maps = NULL;
152  }
153}
154
155
156void CodeBlob::trace_new_stub(CodeBlob* stub, const char* name1, const char* name2) {
157  // Do not hold the CodeCache lock during name formatting.
158  assert(!CodeCache_lock->owned_by_self(), "release CodeCache before registering the stub");
159
160  if (stub != NULL) {
161    char stub_id[256];
162    assert(strlen(name1) + strlen(name2) < sizeof(stub_id), "");
163    jio_snprintf(stub_id, sizeof(stub_id), "%s%s", name1, name2);
164    if (PrintStubCode) {
165      tty->print_cr("Decoding %s " INTPTR_FORMAT, stub_id, (intptr_t) stub);
166      Disassembler::decode(stub->code_begin(), stub->code_end());
167    }
168    Forte::register_stub(stub_id, stub->code_begin(), stub->code_end());
169
170    if (JvmtiExport::should_post_dynamic_code_generated()) {
171      const char* stub_name = name2;
172      if (name2[0] == '\0')  stub_name = name1;
173      JvmtiExport::post_dynamic_code_generated(stub_name, stub->code_begin(), stub->code_end());
174    }
175  }
176
177  // Track memory usage statistic after releasing CodeCache_lock
178  MemoryService::track_code_cache_memory_usage();
179}
180
181
182void CodeBlob::flush() {
183  if (_oop_maps) {
184    FREE_C_HEAP_ARRAY(unsigned char, _oop_maps, mtCode);
185    _oop_maps = NULL;
186  }
187  _comments.free();
188}
189
190
191OopMap* CodeBlob::oop_map_for_return_address(address return_address) {
192  assert(oop_maps() != NULL, "nope");
193  return oop_maps()->find_map_at_offset((intptr_t) return_address - (intptr_t) code_begin());
194}
195
196
197//----------------------------------------------------------------------------------------------------
198// Implementation of BufferBlob
199
200
201BufferBlob::BufferBlob(const char* name, int size)
202: CodeBlob(name, sizeof(BufferBlob), size, CodeOffsets::frame_never_safe, /*locs_size:*/ 0)
203{}
204
205BufferBlob* BufferBlob::create(const char* name, int buffer_size) {
206  ThreadInVMfromUnknown __tiv;  // get to VM state in case we block on CodeCache_lock
207
208  BufferBlob* blob = NULL;
209  unsigned int size = sizeof(BufferBlob);
210  // align the size to CodeEntryAlignment
211  size = align_code_offset(size);
212  size += round_to(buffer_size, oopSize);
213  assert(name != NULL, "must provide a name");
214  {
215    MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
216    blob = new (size) BufferBlob(name, size);
217  }
218  // Track memory usage statistic after releasing CodeCache_lock
219  MemoryService::track_code_cache_memory_usage();
220
221  return blob;
222}
223
224
225BufferBlob::BufferBlob(const char* name, int size, CodeBuffer* cb)
226  : CodeBlob(name, cb, sizeof(BufferBlob), size, CodeOffsets::frame_never_safe, 0, NULL)
227{}
228
229BufferBlob* BufferBlob::create(const char* name, CodeBuffer* cb) {
230  ThreadInVMfromUnknown __tiv;  // get to VM state in case we block on CodeCache_lock
231
232  BufferBlob* blob = NULL;
233  unsigned int size = allocation_size(cb, sizeof(BufferBlob));
234  assert(name != NULL, "must provide a name");
235  {
236    MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
237    blob = new (size) BufferBlob(name, size, cb);
238  }
239  // Track memory usage statistic after releasing CodeCache_lock
240  MemoryService::track_code_cache_memory_usage();
241
242  return blob;
243}
244
245
246void* BufferBlob::operator new(size_t s, unsigned size) {
247  void* p = CodeCache::allocate(size);
248  return p;
249}
250
251
252void BufferBlob::free( BufferBlob *blob ) {
253  ThreadInVMfromUnknown __tiv;  // get to VM state in case we block on CodeCache_lock
254  {
255    MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
256    CodeCache::free((CodeBlob*)blob);
257  }
258  // Track memory usage statistic after releasing CodeCache_lock
259  MemoryService::track_code_cache_memory_usage();
260}
261
262
263//----------------------------------------------------------------------------------------------------
264// Implementation of AdapterBlob
265
266AdapterBlob::AdapterBlob(int size, CodeBuffer* cb) :
267  BufferBlob("I2C/C2I adapters", size, cb) {
268  CodeCache::commit(this);
269}
270
271AdapterBlob* AdapterBlob::create(CodeBuffer* cb) {
272  ThreadInVMfromUnknown __tiv;  // get to VM state in case we block on CodeCache_lock
273
274  AdapterBlob* blob = NULL;
275  unsigned int size = allocation_size(cb, sizeof(AdapterBlob));
276  {
277    MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
278    blob = new (size) AdapterBlob(size, cb);
279  }
280  // Track memory usage statistic after releasing CodeCache_lock
281  MemoryService::track_code_cache_memory_usage();
282
283  return blob;
284}
285
286
287//----------------------------------------------------------------------------------------------------
288// Implementation of MethodHandlesAdapterBlob
289
290MethodHandlesAdapterBlob* MethodHandlesAdapterBlob::create(int buffer_size) {
291  ThreadInVMfromUnknown __tiv;  // get to VM state in case we block on CodeCache_lock
292
293  MethodHandlesAdapterBlob* blob = NULL;
294  unsigned int size = sizeof(MethodHandlesAdapterBlob);
295  // align the size to CodeEntryAlignment
296  size = align_code_offset(size);
297  size += round_to(buffer_size, oopSize);
298  {
299    MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
300    blob = new (size) MethodHandlesAdapterBlob(size);
301  }
302  // Track memory usage statistic after releasing CodeCache_lock
303  MemoryService::track_code_cache_memory_usage();
304
305  return blob;
306}
307
308
309//----------------------------------------------------------------------------------------------------
310// Implementation of RuntimeStub
311
312RuntimeStub::RuntimeStub(
313  const char* name,
314  CodeBuffer* cb,
315  int         size,
316  int         frame_complete,
317  int         frame_size,
318  OopMapSet*  oop_maps,
319  bool        caller_must_gc_arguments
320)
321: CodeBlob(name, cb, sizeof(RuntimeStub), size, frame_complete, frame_size, oop_maps)
322{
323  _caller_must_gc_arguments = caller_must_gc_arguments;
324}
325
326
327RuntimeStub* RuntimeStub::new_runtime_stub(const char* stub_name,
328                                           CodeBuffer* cb,
329                                           int frame_complete,
330                                           int frame_size,
331                                           OopMapSet* oop_maps,
332                                           bool caller_must_gc_arguments)
333{
334  RuntimeStub* stub = NULL;
335  ThreadInVMfromUnknown __tiv;  // get to VM state in case we block on CodeCache_lock
336  {
337    MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
338    unsigned int size = allocation_size(cb, sizeof(RuntimeStub));
339    stub = new (size) RuntimeStub(stub_name, cb, size, frame_complete, frame_size, oop_maps, caller_must_gc_arguments);
340  }
341
342  trace_new_stub(stub, "RuntimeStub - ", stub_name);
343
344  return stub;
345}
346
347
348void* RuntimeStub::operator new(size_t s, unsigned size) {
349  void* p = CodeCache::allocate(size);
350  if (!p) fatal("Initial size of CodeCache is too small");
351  return p;
352}
353
354// operator new shared by all singletons:
355void* SingletonBlob::operator new(size_t s, unsigned size) {
356  void* p = CodeCache::allocate(size);
357  if (!p) fatal("Initial size of CodeCache is too small");
358  return p;
359}
360
361
362//----------------------------------------------------------------------------------------------------
363// Implementation of DeoptimizationBlob
364
365DeoptimizationBlob::DeoptimizationBlob(
366  CodeBuffer* cb,
367  int         size,
368  OopMapSet*  oop_maps,
369  int         unpack_offset,
370  int         unpack_with_exception_offset,
371  int         unpack_with_reexecution_offset,
372  int         frame_size
373)
374: SingletonBlob("DeoptimizationBlob", cb, sizeof(DeoptimizationBlob), size, frame_size, oop_maps)
375{
376  _unpack_offset           = unpack_offset;
377  _unpack_with_exception   = unpack_with_exception_offset;
378  _unpack_with_reexecution = unpack_with_reexecution_offset;
379#ifdef COMPILER1
380  _unpack_with_exception_in_tls   = -1;
381#endif
382}
383
384
385DeoptimizationBlob* DeoptimizationBlob::create(
386  CodeBuffer* cb,
387  OopMapSet*  oop_maps,
388  int        unpack_offset,
389  int        unpack_with_exception_offset,
390  int        unpack_with_reexecution_offset,
391  int        frame_size)
392{
393  DeoptimizationBlob* blob = NULL;
394  ThreadInVMfromUnknown __tiv;  // get to VM state in case we block on CodeCache_lock
395  {
396    MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
397    unsigned int size = allocation_size(cb, sizeof(DeoptimizationBlob));
398    blob = new (size) DeoptimizationBlob(cb,
399                                         size,
400                                         oop_maps,
401                                         unpack_offset,
402                                         unpack_with_exception_offset,
403                                         unpack_with_reexecution_offset,
404                                         frame_size);
405  }
406
407  trace_new_stub(blob, "DeoptimizationBlob");
408
409  return blob;
410}
411
412
413//----------------------------------------------------------------------------------------------------
414// Implementation of UncommonTrapBlob
415
416#ifdef COMPILER2
417UncommonTrapBlob::UncommonTrapBlob(
418  CodeBuffer* cb,
419  int         size,
420  OopMapSet*  oop_maps,
421  int         frame_size
422)
423: SingletonBlob("UncommonTrapBlob", cb, sizeof(UncommonTrapBlob), size, frame_size, oop_maps)
424{}
425
426
427UncommonTrapBlob* UncommonTrapBlob::create(
428  CodeBuffer* cb,
429  OopMapSet*  oop_maps,
430  int        frame_size)
431{
432  UncommonTrapBlob* blob = NULL;
433  ThreadInVMfromUnknown __tiv;  // get to VM state in case we block on CodeCache_lock
434  {
435    MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
436    unsigned int size = allocation_size(cb, sizeof(UncommonTrapBlob));
437    blob = new (size) UncommonTrapBlob(cb, size, oop_maps, frame_size);
438  }
439
440  trace_new_stub(blob, "UncommonTrapBlob");
441
442  return blob;
443}
444
445
446#endif // COMPILER2
447
448
449//----------------------------------------------------------------------------------------------------
450// Implementation of ExceptionBlob
451
452#ifdef COMPILER2
453ExceptionBlob::ExceptionBlob(
454  CodeBuffer* cb,
455  int         size,
456  OopMapSet*  oop_maps,
457  int         frame_size
458)
459: SingletonBlob("ExceptionBlob", cb, sizeof(ExceptionBlob), size, frame_size, oop_maps)
460{}
461
462
463ExceptionBlob* ExceptionBlob::create(
464  CodeBuffer* cb,
465  OopMapSet*  oop_maps,
466  int         frame_size)
467{
468  ExceptionBlob* blob = NULL;
469  ThreadInVMfromUnknown __tiv;  // get to VM state in case we block on CodeCache_lock
470  {
471    MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
472    unsigned int size = allocation_size(cb, sizeof(ExceptionBlob));
473    blob = new (size) ExceptionBlob(cb, size, oop_maps, frame_size);
474  }
475
476  trace_new_stub(blob, "ExceptionBlob");
477
478  return blob;
479}
480
481
482#endif // COMPILER2
483
484
485//----------------------------------------------------------------------------------------------------
486// Implementation of SafepointBlob
487
488SafepointBlob::SafepointBlob(
489  CodeBuffer* cb,
490  int         size,
491  OopMapSet*  oop_maps,
492  int         frame_size
493)
494: SingletonBlob("SafepointBlob", cb, sizeof(SafepointBlob), size, frame_size, oop_maps)
495{}
496
497
498SafepointBlob* SafepointBlob::create(
499  CodeBuffer* cb,
500  OopMapSet*  oop_maps,
501  int         frame_size)
502{
503  SafepointBlob* blob = NULL;
504  ThreadInVMfromUnknown __tiv;  // get to VM state in case we block on CodeCache_lock
505  {
506    MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
507    unsigned int size = allocation_size(cb, sizeof(SafepointBlob));
508    blob = new (size) SafepointBlob(cb, size, oop_maps, frame_size);
509  }
510
511  trace_new_stub(blob, "SafepointBlob");
512
513  return blob;
514}
515
516
517//----------------------------------------------------------------------------------------------------
518// Verification and printing
519
520void CodeBlob::verify() {
521  ShouldNotReachHere();
522}
523
524void CodeBlob::print_on(outputStream* st) const {
525  st->print_cr("[CodeBlob (" INTPTR_FORMAT ")]", this);
526  st->print_cr("Framesize: %d", _frame_size);
527}
528
529void CodeBlob::print_value_on(outputStream* st) const {
530  st->print_cr("[CodeBlob]");
531}
532
533void BufferBlob::verify() {
534  // unimplemented
535}
536
537void BufferBlob::print_on(outputStream* st) const {
538  CodeBlob::print_on(st);
539  print_value_on(st);
540}
541
542void BufferBlob::print_value_on(outputStream* st) const {
543  st->print_cr("BufferBlob (" INTPTR_FORMAT  ") used for %s", this, name());
544}
545
546void RuntimeStub::verify() {
547  // unimplemented
548}
549
550void RuntimeStub::print_on(outputStream* st) const {
551  CodeBlob::print_on(st);
552  st->print("Runtime Stub (" INTPTR_FORMAT "): ", this);
553  st->print_cr(name());
554  Disassembler::decode((CodeBlob*)this, st);
555}
556
557void RuntimeStub::print_value_on(outputStream* st) const {
558  st->print("RuntimeStub (" INTPTR_FORMAT "): ", this); st->print(name());
559}
560
561void SingletonBlob::verify() {
562  // unimplemented
563}
564
565void SingletonBlob::print_on(outputStream* st) const {
566  CodeBlob::print_on(st);
567  st->print_cr(name());
568  Disassembler::decode((CodeBlob*)this, st);
569}
570
571void SingletonBlob::print_value_on(outputStream* st) const {
572  st->print_cr(name());
573}
574
575void DeoptimizationBlob::print_value_on(outputStream* st) const {
576  st->print_cr("Deoptimization (frame not available)");
577}
578