codeBlob.cpp revision 1601:126ea7725993
117706Sjulian/*
217706Sjulian * Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved.
317706Sjulian * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
417706Sjulian *
517706Sjulian * This code is free software; you can redistribute it and/or modify it
617706Sjulian * under the terms of the GNU General Public License version 2 only, as
717706Sjulian * published by the Free Software Foundation.
817706Sjulian *
917706Sjulian * This code is distributed in the hope that it will be useful, but WITHOUT
1017706Sjulian * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
1117706Sjulian * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
1217706Sjulian * version 2 for more details (a copy is included in the LICENSE file that
1317706Sjulian * accompanied this code).
1417706Sjulian *
1517706Sjulian * You should have received a copy of the GNU General Public License version
1617706Sjulian * 2 along with this work; if not, write to the Free Software Foundation,
1717706Sjulian * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
1817706Sjulian *
1917706Sjulian * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
2017706Sjulian * or visit www.oracle.com if you need additional information or have any
2117706Sjulian * questions.
2217706Sjulian *
2349439Sdeischen */
2417706Sjulian
2517706Sjulian# include "incls/_precompiled.incl"
2617706Sjulian# include "incls/_codeBlob.cpp.incl"
2717706Sjulian
2817706Sjulianunsigned int align_code_offset(int offset) {
2917706Sjulian  // align the size to CodeEntryAlignment
3017706Sjulian  return
3117706Sjulian    ((offset + (int)CodeHeap::header_size() + (CodeEntryAlignment-1)) & ~(CodeEntryAlignment-1))
3250476Speter    - (int)CodeHeap::header_size();
3317706Sjulian}
3417706Sjulian
3517706Sjulian
3617706Sjulian// This must be consistent with the CodeBlob constructor's layout actions.
3717706Sjulianunsigned int CodeBlob::allocation_size(CodeBuffer* cb, int header_size) {
3871581Sdeischen  unsigned int size = header_size;
3971581Sdeischen  size += round_to(cb->total_relocation_size(), oopSize);
4035509Sjb  // align the size to CodeEntryAlignment
4117706Sjulian  size = align_code_offset(size);
4271581Sdeischen  size += round_to(cb->total_code_size(), oopSize);
4317706Sjulian  size += round_to(cb->total_oop_size(), oopSize);
4461681Sjasone  return size;
4561681Sjasone}
4635509Sjb
4735509Sjb
4835509Sjb// Creates a simple CodeBlob. Sets up the size of the different regions.
4958094SdeischenCodeBlob::CodeBlob(const char* name, int header_size, int size, int frame_complete, int locs_size) {
5061681Sjasone  assert(size == round_to(size, oopSize), "unaligned size");
5161681Sjasone  assert(locs_size == round_to(locs_size, oopSize), "unaligned size");
5258094Sdeischen  assert(header_size == round_to(header_size, oopSize), "unaligned size");
5358094Sdeischen  assert(!UseRelocIndex, "no space allocated for reloc index yet");
5458094Sdeischen
5544963Sjb  // Note: If UseRelocIndex is enabled, there needs to be (at least) one
5648046Sjb  //       extra word for the relocation information, containing the reloc
5748046Sjb  //       index table length. Unfortunately, the reloc index table imple-
5844963Sjb  //       mentation is not easily understandable and thus it is not clear
5948046Sjb  //       what exactly the format is supposed to be. For now, we just turn
6044963Sjb  //       off the use of this table (gri 7/6/2000).
6161681Sjasone
6261681Sjasone  _name                  = name;
6361681Sjasone  _size                  = size;
6461681Sjasone  _frame_complete_offset = frame_complete;
6561681Sjasone  _header_size           = header_size;
6661681Sjasone  _relocation_size       = locs_size;
6761681Sjasone  _instructions_offset   = align_code_offset(header_size + locs_size);
6861681Sjasone  _data_offset           = size;
6961681Sjasone  _frame_size            =  0;
7061681Sjasone  set_oop_maps(NULL);
7161681Sjasone}
7261681Sjasone
7361681Sjasone
7461681Sjasone// Creates a CodeBlob from a CodeBuffer. Sets up the size of the different regions,
7561681Sjasone// and copy code and relocation info.
7661681SjasoneCodeBlob::CodeBlob(
7761681Sjasone  const char* name,
7861681Sjasone  CodeBuffer* cb,
7961681Sjasone  int         header_size,
8061681Sjasone  int         size,
8161681Sjasone  int         frame_complete,
8261681Sjasone  int         frame_size,
8344963Sjb  OopMapSet*  oop_maps
8444963Sjb) {
8548046Sjb  assert(size == round_to(size, oopSize), "unaligned size");
8648046Sjb  assert(header_size == round_to(header_size, oopSize), "unaligned size");
8744963Sjb
8848046Sjb  _name                  = name;
8917706Sjulian  _size                  = size;
9017706Sjulian  _frame_complete_offset = frame_complete;
9117706Sjulian  _header_size           = header_size;
9217706Sjulian  _relocation_size       = round_to(cb->total_relocation_size(), oopSize);
93  _instructions_offset   = align_code_offset(header_size + _relocation_size);
94  _data_offset           = _instructions_offset + round_to(cb->total_code_size(), oopSize);
95  assert(_data_offset <= size, "codeBlob is too small");
96
97  cb->copy_code_and_locs_to(this);
98  set_oop_maps(oop_maps);
99  _frame_size = frame_size;
100#ifdef COMPILER1
101  // probably wrong for tiered
102  assert(_frame_size >= -1, "must use frame size or -1 for runtime stubs");
103#endif // COMPILER1
104}
105
106
107void CodeBlob::set_oop_maps(OopMapSet* p) {
108  // Danger Will Robinson! This method allocates a big
109  // chunk of memory, its your job to free it.
110  if (p != NULL) {
111    // We need to allocate a chunk big enough to hold the OopMapSet and all of its OopMaps
112    _oop_maps = (OopMapSet* )NEW_C_HEAP_ARRAY(unsigned char, p->heap_size());
113    p->copy_to((address)_oop_maps);
114  } else {
115    _oop_maps = NULL;
116  }
117}
118
119
120void CodeBlob::flush() {
121  if (_oop_maps) {
122    FREE_C_HEAP_ARRAY(unsigned char, _oop_maps);
123    _oop_maps = NULL;
124  }
125  _comments.free();
126}
127
128
129OopMap* CodeBlob::oop_map_for_return_address(address return_address) {
130  address pc = return_address ;
131  assert (oop_maps() != NULL, "nope");
132  return oop_maps()->find_map_at_offset ((intptr_t) pc - (intptr_t) instructions_begin());
133}
134
135
136//----------------------------------------------------------------------------------------------------
137// Implementation of BufferBlob
138
139
140BufferBlob::BufferBlob(const char* name, int size)
141: CodeBlob(name, sizeof(BufferBlob), size, CodeOffsets::frame_never_safe, /*locs_size:*/ 0)
142{}
143
144BufferBlob* BufferBlob::create(const char* name, int buffer_size) {
145  ThreadInVMfromUnknown __tiv;  // get to VM state in case we block on CodeCache_lock
146
147  BufferBlob* blob = NULL;
148  unsigned int size = sizeof(BufferBlob);
149  // align the size to CodeEntryAlignment
150  size = align_code_offset(size);
151  size += round_to(buffer_size, oopSize);
152  assert(name != NULL, "must provide a name");
153  {
154    MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
155    blob = new (size) BufferBlob(name, size);
156  }
157  // Track memory usage statistic after releasing CodeCache_lock
158  MemoryService::track_code_cache_memory_usage();
159
160  return blob;
161}
162
163
164BufferBlob::BufferBlob(const char* name, int size, CodeBuffer* cb)
165  : CodeBlob(name, cb, sizeof(BufferBlob), size, CodeOffsets::frame_never_safe, 0, NULL)
166{}
167
168BufferBlob* BufferBlob::create(const char* name, CodeBuffer* cb) {
169  ThreadInVMfromUnknown __tiv;  // get to VM state in case we block on CodeCache_lock
170
171  BufferBlob* blob = NULL;
172  unsigned int size = allocation_size(cb, sizeof(BufferBlob));
173  assert(name != NULL, "must provide a name");
174  {
175    MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
176    blob = new (size) BufferBlob(name, size, cb);
177  }
178  // Track memory usage statistic after releasing CodeCache_lock
179  MemoryService::track_code_cache_memory_usage();
180
181  return blob;
182}
183
184
185void* BufferBlob::operator new(size_t s, unsigned size) {
186  void* p = CodeCache::allocate(size);
187  return p;
188}
189
190
191void BufferBlob::free( BufferBlob *blob ) {
192  ThreadInVMfromUnknown __tiv;  // get to VM state in case we block on CodeCache_lock
193  {
194    MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
195    CodeCache::free((CodeBlob*)blob);
196  }
197  // Track memory usage statistic after releasing CodeCache_lock
198  MemoryService::track_code_cache_memory_usage();
199}
200
201
202//----------------------------------------------------------------------------------------------------
203// Implementation of AdapterBlob
204
205AdapterBlob::AdapterBlob(int size, CodeBuffer* cb) :
206  BufferBlob("I2C/C2I adapters", size, cb) {
207  CodeCache::commit(this);
208}
209
210AdapterBlob* AdapterBlob::create(CodeBuffer* cb) {
211  ThreadInVMfromUnknown __tiv;  // get to VM state in case we block on CodeCache_lock
212
213  AdapterBlob* blob = NULL;
214  unsigned int size = allocation_size(cb, sizeof(AdapterBlob));
215  {
216    MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
217    blob = new (size) AdapterBlob(size, cb);
218  }
219  // Track memory usage statistic after releasing CodeCache_lock
220  MemoryService::track_code_cache_memory_usage();
221
222  return blob;
223}
224
225
226//----------------------------------------------------------------------------------------------------
227// Implementation of MethodHandlesAdapterBlob
228
229MethodHandlesAdapterBlob* MethodHandlesAdapterBlob::create(int buffer_size) {
230  ThreadInVMfromUnknown __tiv;  // get to VM state in case we block on CodeCache_lock
231
232  MethodHandlesAdapterBlob* blob = NULL;
233  unsigned int size = sizeof(MethodHandlesAdapterBlob);
234  // align the size to CodeEntryAlignment
235  size = align_code_offset(size);
236  size += round_to(buffer_size, oopSize);
237  {
238    MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
239    blob = new (size) MethodHandlesAdapterBlob(size);
240  }
241  // Track memory usage statistic after releasing CodeCache_lock
242  MemoryService::track_code_cache_memory_usage();
243
244  return blob;
245}
246
247
248//----------------------------------------------------------------------------------------------------
249// Implementation of RuntimeStub
250
251RuntimeStub::RuntimeStub(
252  const char* name,
253  CodeBuffer* cb,
254  int         size,
255  int         frame_complete,
256  int         frame_size,
257  OopMapSet*  oop_maps,
258  bool        caller_must_gc_arguments
259)
260: CodeBlob(name, cb, sizeof(RuntimeStub), size, frame_complete, frame_size, oop_maps)
261{
262  _caller_must_gc_arguments = caller_must_gc_arguments;
263}
264
265
266RuntimeStub* RuntimeStub::new_runtime_stub(const char* stub_name,
267                                           CodeBuffer* cb,
268                                           int frame_complete,
269                                           int frame_size,
270                                           OopMapSet* oop_maps,
271                                           bool caller_must_gc_arguments)
272{
273  RuntimeStub* stub = NULL;
274  ThreadInVMfromUnknown __tiv;  // get to VM state in case we block on CodeCache_lock
275  {
276    MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
277    unsigned int size = allocation_size(cb, sizeof(RuntimeStub));
278    stub = new (size) RuntimeStub(stub_name, cb, size, frame_complete, frame_size, oop_maps, caller_must_gc_arguments);
279  }
280
281  // Do not hold the CodeCache lock during name formatting.
282  if (stub != NULL) {
283    char stub_id[256];
284    jio_snprintf(stub_id, sizeof(stub_id), "RuntimeStub - %s", stub_name);
285    if (PrintStubCode) {
286      tty->print_cr("Decoding %s " INTPTR_FORMAT, stub_id, stub);
287      Disassembler::decode(stub->instructions_begin(), stub->instructions_end());
288    }
289    Forte::register_stub(stub_id, stub->instructions_begin(), stub->instructions_end());
290
291    if (JvmtiExport::should_post_dynamic_code_generated()) {
292      JvmtiExport::post_dynamic_code_generated(stub_name, stub->instructions_begin(), stub->instructions_end());
293    }
294  }
295
296  // Track memory usage statistic after releasing CodeCache_lock
297  MemoryService::track_code_cache_memory_usage();
298
299  return stub;
300}
301
302
303void* RuntimeStub::operator new(size_t s, unsigned size) {
304  void* p = CodeCache::allocate(size);
305  if (!p) fatal("Initial size of CodeCache is too small");
306  return p;
307}
308
309
310//----------------------------------------------------------------------------------------------------
311// Implementation of DeoptimizationBlob
312
313DeoptimizationBlob::DeoptimizationBlob(
314  CodeBuffer* cb,
315  int         size,
316  OopMapSet*  oop_maps,
317  int         unpack_offset,
318  int         unpack_with_exception_offset,
319  int         unpack_with_reexecution_offset,
320  int         frame_size
321)
322: SingletonBlob("DeoptimizationBlob", cb, sizeof(DeoptimizationBlob), size, frame_size, oop_maps)
323{
324  _unpack_offset           = unpack_offset;
325  _unpack_with_exception   = unpack_with_exception_offset;
326  _unpack_with_reexecution = unpack_with_reexecution_offset;
327#ifdef COMPILER1
328  _unpack_with_exception_in_tls   = -1;
329#endif
330}
331
332
333DeoptimizationBlob* DeoptimizationBlob::create(
334  CodeBuffer* cb,
335  OopMapSet*  oop_maps,
336  int        unpack_offset,
337  int        unpack_with_exception_offset,
338  int        unpack_with_reexecution_offset,
339  int        frame_size)
340{
341  DeoptimizationBlob* blob = NULL;
342  ThreadInVMfromUnknown __tiv;  // get to VM state in case we block on CodeCache_lock
343  {
344    MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
345    unsigned int size = allocation_size(cb, sizeof(DeoptimizationBlob));
346    blob = new (size) DeoptimizationBlob(cb,
347                                         size,
348                                         oop_maps,
349                                         unpack_offset,
350                                         unpack_with_exception_offset,
351                                         unpack_with_reexecution_offset,
352                                         frame_size);
353  }
354
355  // Do not hold the CodeCache lock during name formatting.
356  if (blob != NULL) {
357    char blob_id[256];
358    jio_snprintf(blob_id, sizeof(blob_id), "DeoptimizationBlob@" PTR_FORMAT, blob->instructions_begin());
359    if (PrintStubCode) {
360      tty->print_cr("Decoding %s " INTPTR_FORMAT, blob_id, blob);
361      Disassembler::decode(blob->instructions_begin(), blob->instructions_end());
362    }
363    Forte::register_stub(blob_id, blob->instructions_begin(), blob->instructions_end());
364
365    if (JvmtiExport::should_post_dynamic_code_generated()) {
366      JvmtiExport::post_dynamic_code_generated("DeoptimizationBlob",
367                                               blob->instructions_begin(),
368                                               blob->instructions_end());
369    }
370  }
371
372  // Track memory usage statistic after releasing CodeCache_lock
373  MemoryService::track_code_cache_memory_usage();
374
375  return blob;
376}
377
378
379void* DeoptimizationBlob::operator new(size_t s, unsigned size) {
380  void* p = CodeCache::allocate(size);
381  if (!p) fatal("Initial size of CodeCache is too small");
382  return p;
383}
384
385//----------------------------------------------------------------------------------------------------
386// Implementation of UncommonTrapBlob
387
388#ifdef COMPILER2
389UncommonTrapBlob::UncommonTrapBlob(
390  CodeBuffer* cb,
391  int         size,
392  OopMapSet*  oop_maps,
393  int         frame_size
394)
395: SingletonBlob("UncommonTrapBlob", cb, sizeof(UncommonTrapBlob), size, frame_size, oop_maps)
396{}
397
398
399UncommonTrapBlob* UncommonTrapBlob::create(
400  CodeBuffer* cb,
401  OopMapSet*  oop_maps,
402  int        frame_size)
403{
404  UncommonTrapBlob* blob = NULL;
405  ThreadInVMfromUnknown __tiv;  // get to VM state in case we block on CodeCache_lock
406  {
407    MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
408    unsigned int size = allocation_size(cb, sizeof(UncommonTrapBlob));
409    blob = new (size) UncommonTrapBlob(cb, size, oop_maps, frame_size);
410  }
411
412  // Do not hold the CodeCache lock during name formatting.
413  if (blob != NULL) {
414    char blob_id[256];
415    jio_snprintf(blob_id, sizeof(blob_id), "UncommonTrapBlob@" PTR_FORMAT, blob->instructions_begin());
416    if (PrintStubCode) {
417      tty->print_cr("Decoding %s " INTPTR_FORMAT, blob_id, blob);
418      Disassembler::decode(blob->instructions_begin(), blob->instructions_end());
419    }
420    Forte::register_stub(blob_id, blob->instructions_begin(), blob->instructions_end());
421
422    if (JvmtiExport::should_post_dynamic_code_generated()) {
423      JvmtiExport::post_dynamic_code_generated("UncommonTrapBlob",
424                                               blob->instructions_begin(),
425                                               blob->instructions_end());
426    }
427  }
428
429  // Track memory usage statistic after releasing CodeCache_lock
430  MemoryService::track_code_cache_memory_usage();
431
432  return blob;
433}
434
435
436void* UncommonTrapBlob::operator new(size_t s, unsigned size) {
437  void* p = CodeCache::allocate(size);
438  if (!p) fatal("Initial size of CodeCache is too small");
439  return p;
440}
441#endif // COMPILER2
442
443
444//----------------------------------------------------------------------------------------------------
445// Implementation of ExceptionBlob
446
447#ifdef COMPILER2
448ExceptionBlob::ExceptionBlob(
449  CodeBuffer* cb,
450  int         size,
451  OopMapSet*  oop_maps,
452  int         frame_size
453)
454: SingletonBlob("ExceptionBlob", cb, sizeof(ExceptionBlob), size, frame_size, oop_maps)
455{}
456
457
458ExceptionBlob* ExceptionBlob::create(
459  CodeBuffer* cb,
460  OopMapSet*  oop_maps,
461  int         frame_size)
462{
463  ExceptionBlob* blob = NULL;
464  ThreadInVMfromUnknown __tiv;  // get to VM state in case we block on CodeCache_lock
465  {
466    MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
467    unsigned int size = allocation_size(cb, sizeof(ExceptionBlob));
468    blob = new (size) ExceptionBlob(cb, size, oop_maps, frame_size);
469  }
470
471  // We do not need to hold the CodeCache lock during name formatting
472  if (blob != NULL) {
473    char blob_id[256];
474    jio_snprintf(blob_id, sizeof(blob_id), "ExceptionBlob@" PTR_FORMAT, blob->instructions_begin());
475    if (PrintStubCode) {
476      tty->print_cr("Decoding %s " INTPTR_FORMAT, blob_id, blob);
477      Disassembler::decode(blob->instructions_begin(), blob->instructions_end());
478    }
479    Forte::register_stub(blob_id, blob->instructions_begin(), blob->instructions_end());
480
481    if (JvmtiExport::should_post_dynamic_code_generated()) {
482      JvmtiExport::post_dynamic_code_generated("ExceptionBlob",
483                                               blob->instructions_begin(),
484                                               blob->instructions_end());
485    }
486  }
487
488  // Track memory usage statistic after releasing CodeCache_lock
489  MemoryService::track_code_cache_memory_usage();
490
491  return blob;
492}
493
494
495void* ExceptionBlob::operator new(size_t s, unsigned size) {
496  void* p = CodeCache::allocate(size);
497  if (!p) fatal("Initial size of CodeCache is too small");
498  return p;
499}
500#endif // COMPILER2
501
502
503//----------------------------------------------------------------------------------------------------
504// Implementation of SafepointBlob
505
506SafepointBlob::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{}
514
515
516SafepointBlob* 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  }
528
529  // We do not need to hold the CodeCache lock during name formatting.
530  if (blob != NULL) {
531    char blob_id[256];
532    jio_snprintf(blob_id, sizeof(blob_id), "SafepointBlob@" PTR_FORMAT, blob->instructions_begin());
533    if (PrintStubCode) {
534      tty->print_cr("Decoding %s " INTPTR_FORMAT, blob_id, blob);
535      Disassembler::decode(blob->instructions_begin(), blob->instructions_end());
536    }
537    Forte::register_stub(blob_id, blob->instructions_begin(), blob->instructions_end());
538
539    if (JvmtiExport::should_post_dynamic_code_generated()) {
540      JvmtiExport::post_dynamic_code_generated("SafepointBlob",
541                                               blob->instructions_begin(),
542                                               blob->instructions_end());
543    }
544  }
545
546  // Track memory usage statistic after releasing CodeCache_lock
547  MemoryService::track_code_cache_memory_usage();
548
549  return blob;
550}
551
552
553void* SafepointBlob::operator new(size_t s, unsigned size) {
554  void* p = CodeCache::allocate(size);
555  if (!p) fatal("Initial size of CodeCache is too small");
556  return p;
557}
558
559
560//----------------------------------------------------------------------------------------------------
561// Verification and printing
562
563void CodeBlob::verify() {
564  ShouldNotReachHere();
565}
566
567void CodeBlob::print_on(outputStream* st) const {
568  st->print_cr("[CodeBlob (" INTPTR_FORMAT ")]", this);
569  st->print_cr("Framesize: %d", _frame_size);
570}
571
572void CodeBlob::print_value_on(outputStream* st) const {
573  st->print_cr("[CodeBlob]");
574}
575
576void BufferBlob::verify() {
577  // unimplemented
578}
579
580void BufferBlob::print_on(outputStream* st) const {
581  CodeBlob::print_on(st);
582  print_value_on(st);
583}
584
585void BufferBlob::print_value_on(outputStream* st) const {
586  st->print_cr("BufferBlob (" INTPTR_FORMAT  ") used for %s", this, name());
587}
588
589void RuntimeStub::verify() {
590  // unimplemented
591}
592
593void RuntimeStub::print_on(outputStream* st) const {
594  CodeBlob::print_on(st);
595  st->print("Runtime Stub (" INTPTR_FORMAT "): ", this);
596  st->print_cr(name());
597  Disassembler::decode((CodeBlob*)this, st);
598}
599
600void RuntimeStub::print_value_on(outputStream* st) const {
601  st->print("RuntimeStub (" INTPTR_FORMAT "): ", this); st->print(name());
602}
603
604void SingletonBlob::verify() {
605  // unimplemented
606}
607
608void SingletonBlob::print_on(outputStream* st) const {
609  CodeBlob::print_on(st);
610  st->print_cr(name());
611  Disassembler::decode((CodeBlob*)this, st);
612}
613
614void SingletonBlob::print_value_on(outputStream* st) const {
615  st->print_cr(name());
616}
617
618void DeoptimizationBlob::print_value_on(outputStream* st) const {
619  st->print_cr("Deoptimization (frame not available)");
620}
621