hotspot/src/share/vm/code/codeBlob.cpp
author coleenp
Mon, 14 Jan 2013 11:01:39 -0500
changeset 15194 a35093d73168
parent 13887 89b873bcc55b
child 16368 713209c45a82
permissions -rw-r--r--
8006005: Fix constant pool index validation and alignment trap for method parameter reflection Summary: This patch addresses an alignment trap due to the storage format of method parameters data in constMethod. It also adds code to validate constant pool indexes for method parameters data. Reviewed-by: jrose, dholmes Contributed-by: eric.mccorkle@oracle.com
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
     2
 * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     4
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
489c9b5090e2 Initial load
duke
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
489c9b5090e2 Initial load
duke
parents:
diff changeset
     7
 * published by the Free Software Foundation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     8
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
489c9b5090e2 Initial load
duke
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
489c9b5090e2 Initial load
duke
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
489c9b5090e2 Initial load
duke
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
489c9b5090e2 Initial load
duke
parents:
diff changeset
    13
 * accompanied this code).
489c9b5090e2 Initial load
duke
parents:
diff changeset
    14
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
489c9b5090e2 Initial load
duke
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    18
 *
5547
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5050
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5050
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5050
diff changeset
    21
 * questions.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    22
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    23
 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
    24
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6432
diff changeset
    25
#include "precompiled.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6432
diff changeset
    26
#include "code/codeBlob.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6432
diff changeset
    27
#include "code/codeCache.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6432
diff changeset
    28
#include "code/relocInfo.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6432
diff changeset
    29
#include "compiler/disassembler.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6432
diff changeset
    30
#include "interpreter/bytecode.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6432
diff changeset
    31
#include "memory/allocation.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6432
diff changeset
    32
#include "memory/heap.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6432
diff changeset
    33
#include "oops/oop.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6432
diff changeset
    34
#include "prims/forte.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6432
diff changeset
    35
#include "runtime/handles.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6432
diff changeset
    36
#include "runtime/interfaceSupport.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6432
diff changeset
    37
#include "runtime/mutexLocker.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6432
diff changeset
    38
#include "runtime/safepoint.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6432
diff changeset
    39
#include "runtime/sharedRuntime.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6432
diff changeset
    40
#include "runtime/vframe.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6432
diff changeset
    41
#include "services/memoryService.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6432
diff changeset
    42
#ifdef TARGET_ARCH_x86
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6432
diff changeset
    43
# include "nativeInst_x86.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6432
diff changeset
    44
#endif
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6432
diff changeset
    45
#ifdef TARGET_ARCH_sparc
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6432
diff changeset
    46
# include "nativeInst_sparc.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6432
diff changeset
    47
#endif
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6432
diff changeset
    48
#ifdef TARGET_ARCH_zero
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6432
diff changeset
    49
# include "nativeInst_zero.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6432
diff changeset
    50
#endif
8107
78e5bd944384 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 7397
diff changeset
    51
#ifdef TARGET_ARCH_arm
78e5bd944384 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 7397
diff changeset
    52
# include "nativeInst_arm.hpp"
78e5bd944384 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 7397
diff changeset
    53
#endif
78e5bd944384 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 7397
diff changeset
    54
#ifdef TARGET_ARCH_ppc
78e5bd944384 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 7397
diff changeset
    55
# include "nativeInst_ppc.hpp"
78e5bd944384 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 7397
diff changeset
    56
#endif
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6432
diff changeset
    57
#ifdef COMPILER1
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6432
diff changeset
    58
#include "c1/c1_Runtime1.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6432
diff changeset
    59
#endif
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    60
489c9b5090e2 Initial load
duke
parents:
diff changeset
    61
unsigned int align_code_offset(int offset) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    62
  // align the size to CodeEntryAlignment
489c9b5090e2 Initial load
duke
parents:
diff changeset
    63
  return
489c9b5090e2 Initial load
duke
parents:
diff changeset
    64
    ((offset + (int)CodeHeap::header_size() + (CodeEntryAlignment-1)) & ~(CodeEntryAlignment-1))
489c9b5090e2 Initial load
duke
parents:
diff changeset
    65
    - (int)CodeHeap::header_size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    66
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    67
489c9b5090e2 Initial load
duke
parents:
diff changeset
    68
489c9b5090e2 Initial load
duke
parents:
diff changeset
    69
// This must be consistent with the CodeBlob constructor's layout actions.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    70
unsigned int CodeBlob::allocation_size(CodeBuffer* cb, int header_size) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    71
  unsigned int size = header_size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    72
  size += round_to(cb->total_relocation_size(), oopSize);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    73
  // align the size to CodeEntryAlignment
489c9b5090e2 Initial load
duke
parents:
diff changeset
    74
  size = align_code_offset(size);
6418
6671edbd230e 6978355: renaming for 6961697
twisti
parents: 6176
diff changeset
    75
  size += round_to(cb->total_content_size(), oopSize);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    76
  size += round_to(cb->total_oop_size(), oopSize);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
    77
  size += round_to(cb->total_metadata_size(), oopSize);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    78
  return size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    79
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    80
489c9b5090e2 Initial load
duke
parents:
diff changeset
    81
489c9b5090e2 Initial load
duke
parents:
diff changeset
    82
// Creates a simple CodeBlob. Sets up the size of the different regions.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    83
CodeBlob::CodeBlob(const char* name, int header_size, int size, int frame_complete, int locs_size) {
6418
6671edbd230e 6978355: renaming for 6961697
twisti
parents: 6176
diff changeset
    84
  assert(size        == round_to(size,        oopSize), "unaligned size");
6671edbd230e 6978355: renaming for 6961697
twisti
parents: 6176
diff changeset
    85
  assert(locs_size   == round_to(locs_size,   oopSize), "unaligned size");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    86
  assert(header_size == round_to(header_size, oopSize), "unaligned size");
489c9b5090e2 Initial load
duke
parents:
diff changeset
    87
  assert(!UseRelocIndex, "no space allocated for reloc index yet");
489c9b5090e2 Initial load
duke
parents:
diff changeset
    88
489c9b5090e2 Initial load
duke
parents:
diff changeset
    89
  // Note: If UseRelocIndex is enabled, there needs to be (at least) one
489c9b5090e2 Initial load
duke
parents:
diff changeset
    90
  //       extra word for the relocation information, containing the reloc
489c9b5090e2 Initial load
duke
parents:
diff changeset
    91
  //       index table length. Unfortunately, the reloc index table imple-
489c9b5090e2 Initial load
duke
parents:
diff changeset
    92
  //       mentation is not easily understandable and thus it is not clear
489c9b5090e2 Initial load
duke
parents:
diff changeset
    93
  //       what exactly the format is supposed to be. For now, we just turn
489c9b5090e2 Initial load
duke
parents:
diff changeset
    94
  //       off the use of this table (gri 7/6/2000).
489c9b5090e2 Initial load
duke
parents:
diff changeset
    95
489c9b5090e2 Initial load
duke
parents:
diff changeset
    96
  _name                  = name;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    97
  _size                  = size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    98
  _frame_complete_offset = frame_complete;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    99
  _header_size           = header_size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   100
  _relocation_size       = locs_size;
6418
6671edbd230e 6978355: renaming for 6961697
twisti
parents: 6176
diff changeset
   101
  _content_offset        = align_code_offset(header_size + _relocation_size);
6671edbd230e 6978355: renaming for 6961697
twisti
parents: 6176
diff changeset
   102
  _code_offset           = _content_offset;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   103
  _data_offset           = size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   104
  _frame_size            =  0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   105
  set_oop_maps(NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   106
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   107
489c9b5090e2 Initial load
duke
parents:
diff changeset
   108
489c9b5090e2 Initial load
duke
parents:
diff changeset
   109
// Creates a CodeBlob from a CodeBuffer. Sets up the size of the different regions,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   110
// and copy code and relocation info.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   111
CodeBlob::CodeBlob(
489c9b5090e2 Initial load
duke
parents:
diff changeset
   112
  const char* name,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   113
  CodeBuffer* cb,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   114
  int         header_size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   115
  int         size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   116
  int         frame_complete,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   117
  int         frame_size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   118
  OopMapSet*  oop_maps
489c9b5090e2 Initial load
duke
parents:
diff changeset
   119
) {
6418
6671edbd230e 6978355: renaming for 6961697
twisti
parents: 6176
diff changeset
   120
  assert(size        == round_to(size,        oopSize), "unaligned size");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   121
  assert(header_size == round_to(header_size, oopSize), "unaligned size");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   122
489c9b5090e2 Initial load
duke
parents:
diff changeset
   123
  _name                  = name;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   124
  _size                  = size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   125
  _frame_complete_offset = frame_complete;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   126
  _header_size           = header_size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   127
  _relocation_size       = round_to(cb->total_relocation_size(), oopSize);
6418
6671edbd230e 6978355: renaming for 6961697
twisti
parents: 6176
diff changeset
   128
  _content_offset        = align_code_offset(header_size + _relocation_size);
6432
d36e09b60939 6961697: move nmethod constants section before instruction section
twisti
parents: 6418
diff changeset
   129
  _code_offset           = _content_offset + cb->total_offset_of(cb->insts());
6418
6671edbd230e 6978355: renaming for 6961697
twisti
parents: 6176
diff changeset
   130
  _data_offset           = _content_offset + round_to(cb->total_content_size(), oopSize);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   131
  assert(_data_offset <= size, "codeBlob is too small");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   132
489c9b5090e2 Initial load
duke
parents:
diff changeset
   133
  cb->copy_code_and_locs_to(this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   134
  set_oop_maps(oop_maps);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   135
  _frame_size = frame_size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   136
#ifdef COMPILER1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   137
  // probably wrong for tiered
489c9b5090e2 Initial load
duke
parents:
diff changeset
   138
  assert(_frame_size >= -1, "must use frame size or -1 for runtime stubs");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   139
#endif // COMPILER1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   140
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   141
489c9b5090e2 Initial load
duke
parents:
diff changeset
   142
489c9b5090e2 Initial load
duke
parents:
diff changeset
   143
void CodeBlob::set_oop_maps(OopMapSet* p) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   144
  // Danger Will Robinson! This method allocates a big
489c9b5090e2 Initial load
duke
parents:
diff changeset
   145
  // chunk of memory, its your job to free it.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   146
  if (p != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   147
    // We need to allocate a chunk big enough to hold the OopMapSet and all of its OopMaps
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 9630
diff changeset
   148
    _oop_maps = (OopMapSet* )NEW_C_HEAP_ARRAY(unsigned char, p->heap_size(), mtCode);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   149
    p->copy_to((address)_oop_maps);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   150
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   151
    _oop_maps = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   152
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   153
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   154
489c9b5090e2 Initial load
duke
parents:
diff changeset
   155
9630
d6419e4395e3 6939861: JVM should handle more conversion operations
never
parents: 8921
diff changeset
   156
void CodeBlob::trace_new_stub(CodeBlob* stub, const char* name1, const char* name2) {
d6419e4395e3 6939861: JVM should handle more conversion operations
never
parents: 8921
diff changeset
   157
  // Do not hold the CodeCache lock during name formatting.
d6419e4395e3 6939861: JVM should handle more conversion operations
never
parents: 8921
diff changeset
   158
  assert(!CodeCache_lock->owned_by_self(), "release CodeCache before registering the stub");
d6419e4395e3 6939861: JVM should handle more conversion operations
never
parents: 8921
diff changeset
   159
d6419e4395e3 6939861: JVM should handle more conversion operations
never
parents: 8921
diff changeset
   160
  if (stub != NULL) {
d6419e4395e3 6939861: JVM should handle more conversion operations
never
parents: 8921
diff changeset
   161
    char stub_id[256];
d6419e4395e3 6939861: JVM should handle more conversion operations
never
parents: 8921
diff changeset
   162
    assert(strlen(name1) + strlen(name2) < sizeof(stub_id), "");
d6419e4395e3 6939861: JVM should handle more conversion operations
never
parents: 8921
diff changeset
   163
    jio_snprintf(stub_id, sizeof(stub_id), "%s%s", name1, name2);
d6419e4395e3 6939861: JVM should handle more conversion operations
never
parents: 8921
diff changeset
   164
    if (PrintStubCode) {
13887
89b873bcc55b 7200163: add CodeComments functionality to assember stubs
kvn
parents: 13728
diff changeset
   165
      ttyLocker ttyl;
9630
d6419e4395e3 6939861: JVM should handle more conversion operations
never
parents: 8921
diff changeset
   166
      tty->print_cr("Decoding %s " INTPTR_FORMAT, stub_id, (intptr_t) stub);
d6419e4395e3 6939861: JVM should handle more conversion operations
never
parents: 8921
diff changeset
   167
      Disassembler::decode(stub->code_begin(), stub->code_end());
13887
89b873bcc55b 7200163: add CodeComments functionality to assember stubs
kvn
parents: 13728
diff changeset
   168
      tty->cr();
9630
d6419e4395e3 6939861: JVM should handle more conversion operations
never
parents: 8921
diff changeset
   169
    }
d6419e4395e3 6939861: JVM should handle more conversion operations
never
parents: 8921
diff changeset
   170
    Forte::register_stub(stub_id, stub->code_begin(), stub->code_end());
d6419e4395e3 6939861: JVM should handle more conversion operations
never
parents: 8921
diff changeset
   171
d6419e4395e3 6939861: JVM should handle more conversion operations
never
parents: 8921
diff changeset
   172
    if (JvmtiExport::should_post_dynamic_code_generated()) {
d6419e4395e3 6939861: JVM should handle more conversion operations
never
parents: 8921
diff changeset
   173
      const char* stub_name = name2;
d6419e4395e3 6939861: JVM should handle more conversion operations
never
parents: 8921
diff changeset
   174
      if (name2[0] == '\0')  stub_name = name1;
d6419e4395e3 6939861: JVM should handle more conversion operations
never
parents: 8921
diff changeset
   175
      JvmtiExport::post_dynamic_code_generated(stub_name, stub->code_begin(), stub->code_end());
d6419e4395e3 6939861: JVM should handle more conversion operations
never
parents: 8921
diff changeset
   176
    }
d6419e4395e3 6939861: JVM should handle more conversion operations
never
parents: 8921
diff changeset
   177
  }
d6419e4395e3 6939861: JVM should handle more conversion operations
never
parents: 8921
diff changeset
   178
d6419e4395e3 6939861: JVM should handle more conversion operations
never
parents: 8921
diff changeset
   179
  // Track memory usage statistic after releasing CodeCache_lock
d6419e4395e3 6939861: JVM should handle more conversion operations
never
parents: 8921
diff changeset
   180
  MemoryService::track_code_cache_memory_usage();
d6419e4395e3 6939861: JVM should handle more conversion operations
never
parents: 8921
diff changeset
   181
}
d6419e4395e3 6939861: JVM should handle more conversion operations
never
parents: 8921
diff changeset
   182
d6419e4395e3 6939861: JVM should handle more conversion operations
never
parents: 8921
diff changeset
   183
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   184
void CodeBlob::flush() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   185
  if (_oop_maps) {
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 9630
diff changeset
   186
    FREE_C_HEAP_ARRAY(unsigned char, _oop_maps, mtCode);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   187
    _oop_maps = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   188
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   189
  _comments.free();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   190
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   191
489c9b5090e2 Initial load
duke
parents:
diff changeset
   192
489c9b5090e2 Initial load
duke
parents:
diff changeset
   193
OopMap* CodeBlob::oop_map_for_return_address(address return_address) {
6418
6671edbd230e 6978355: renaming for 6961697
twisti
parents: 6176
diff changeset
   194
  assert(oop_maps() != NULL, "nope");
6671edbd230e 6978355: renaming for 6961697
twisti
parents: 6176
diff changeset
   195
  return oop_maps()->find_map_at_offset((intptr_t) return_address - (intptr_t) code_begin());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   196
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   197
489c9b5090e2 Initial load
duke
parents:
diff changeset
   198
489c9b5090e2 Initial load
duke
parents:
diff changeset
   199
//----------------------------------------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   200
// Implementation of BufferBlob
489c9b5090e2 Initial load
duke
parents:
diff changeset
   201
489c9b5090e2 Initial load
duke
parents:
diff changeset
   202
489c9b5090e2 Initial load
duke
parents:
diff changeset
   203
BufferBlob::BufferBlob(const char* name, int size)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   204
: CodeBlob(name, sizeof(BufferBlob), size, CodeOffsets::frame_never_safe, /*locs_size:*/ 0)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   205
{}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   206
489c9b5090e2 Initial load
duke
parents:
diff changeset
   207
BufferBlob* BufferBlob::create(const char* name, int buffer_size) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   208
  ThreadInVMfromUnknown __tiv;  // get to VM state in case we block on CodeCache_lock
489c9b5090e2 Initial load
duke
parents:
diff changeset
   209
489c9b5090e2 Initial load
duke
parents:
diff changeset
   210
  BufferBlob* blob = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   211
  unsigned int size = sizeof(BufferBlob);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   212
  // align the size to CodeEntryAlignment
489c9b5090e2 Initial load
duke
parents:
diff changeset
   213
  size = align_code_offset(size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   214
  size += round_to(buffer_size, oopSize);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   215
  assert(name != NULL, "must provide a name");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   216
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   217
    MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   218
    blob = new (size) BufferBlob(name, size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   219
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   220
  // Track memory usage statistic after releasing CodeCache_lock
489c9b5090e2 Initial load
duke
parents:
diff changeset
   221
  MemoryService::track_code_cache_memory_usage();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   222
489c9b5090e2 Initial load
duke
parents:
diff changeset
   223
  return blob;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   224
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   225
489c9b5090e2 Initial load
duke
parents:
diff changeset
   226
489c9b5090e2 Initial load
duke
parents:
diff changeset
   227
BufferBlob::BufferBlob(const char* name, int size, CodeBuffer* cb)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   228
  : CodeBlob(name, cb, sizeof(BufferBlob), size, CodeOffsets::frame_never_safe, 0, NULL)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   229
{}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   230
489c9b5090e2 Initial load
duke
parents:
diff changeset
   231
BufferBlob* BufferBlob::create(const char* name, CodeBuffer* cb) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   232
  ThreadInVMfromUnknown __tiv;  // get to VM state in case we block on CodeCache_lock
489c9b5090e2 Initial load
duke
parents:
diff changeset
   233
489c9b5090e2 Initial load
duke
parents:
diff changeset
   234
  BufferBlob* blob = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   235
  unsigned int size = allocation_size(cb, sizeof(BufferBlob));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   236
  assert(name != NULL, "must provide a name");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   237
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   238
    MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   239
    blob = new (size) BufferBlob(name, size, cb);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   240
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   241
  // Track memory usage statistic after releasing CodeCache_lock
489c9b5090e2 Initial load
duke
parents:
diff changeset
   242
  MemoryService::track_code_cache_memory_usage();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   243
489c9b5090e2 Initial load
duke
parents:
diff changeset
   244
  return blob;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   245
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   246
489c9b5090e2 Initial load
duke
parents:
diff changeset
   247
489c9b5090e2 Initial load
duke
parents:
diff changeset
   248
void* BufferBlob::operator new(size_t s, unsigned size) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   249
  void* p = CodeCache::allocate(size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   250
  return p;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   251
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   252
489c9b5090e2 Initial load
duke
parents:
diff changeset
   253
489c9b5090e2 Initial load
duke
parents:
diff changeset
   254
void BufferBlob::free( BufferBlob *blob ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   255
  ThreadInVMfromUnknown __tiv;  // get to VM state in case we block on CodeCache_lock
489c9b5090e2 Initial load
duke
parents:
diff changeset
   256
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   257
    MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   258
    CodeCache::free((CodeBlob*)blob);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   259
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   260
  // Track memory usage statistic after releasing CodeCache_lock
489c9b5090e2 Initial load
duke
parents:
diff changeset
   261
  MemoryService::track_code_cache_memory_usage();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   262
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   263
5050
47ecd86932ce 6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents: 1
diff changeset
   264
47ecd86932ce 6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents: 1
diff changeset
   265
//----------------------------------------------------------------------------------------------------
47ecd86932ce 6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents: 1
diff changeset
   266
// Implementation of AdapterBlob
47ecd86932ce 6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents: 1
diff changeset
   267
6065
26016b8ed869 6970566: runThese fails with SIGSEGV
never
parents: 5924
diff changeset
   268
AdapterBlob::AdapterBlob(int size, CodeBuffer* cb) :
26016b8ed869 6970566: runThese fails with SIGSEGV
never
parents: 5924
diff changeset
   269
  BufferBlob("I2C/C2I adapters", size, cb) {
26016b8ed869 6970566: runThese fails with SIGSEGV
never
parents: 5924
diff changeset
   270
  CodeCache::commit(this);
26016b8ed869 6970566: runThese fails with SIGSEGV
never
parents: 5924
diff changeset
   271
}
26016b8ed869 6970566: runThese fails with SIGSEGV
never
parents: 5924
diff changeset
   272
5050
47ecd86932ce 6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents: 1
diff changeset
   273
AdapterBlob* AdapterBlob::create(CodeBuffer* cb) {
47ecd86932ce 6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents: 1
diff changeset
   274
  ThreadInVMfromUnknown __tiv;  // get to VM state in case we block on CodeCache_lock
47ecd86932ce 6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents: 1
diff changeset
   275
47ecd86932ce 6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents: 1
diff changeset
   276
  AdapterBlob* blob = NULL;
47ecd86932ce 6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents: 1
diff changeset
   277
  unsigned int size = allocation_size(cb, sizeof(AdapterBlob));
47ecd86932ce 6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents: 1
diff changeset
   278
  {
47ecd86932ce 6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents: 1
diff changeset
   279
    MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
47ecd86932ce 6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents: 1
diff changeset
   280
    blob = new (size) AdapterBlob(size, cb);
47ecd86932ce 6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents: 1
diff changeset
   281
  }
47ecd86932ce 6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents: 1
diff changeset
   282
  // Track memory usage statistic after releasing CodeCache_lock
47ecd86932ce 6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents: 1
diff changeset
   283
  MemoryService::track_code_cache_memory_usage();
47ecd86932ce 6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents: 1
diff changeset
   284
47ecd86932ce 6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents: 1
diff changeset
   285
  return blob;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   286
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   287
5050
47ecd86932ce 6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents: 1
diff changeset
   288
47ecd86932ce 6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents: 1
diff changeset
   289
//----------------------------------------------------------------------------------------------------
47ecd86932ce 6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents: 1
diff changeset
   290
// Implementation of MethodHandlesAdapterBlob
47ecd86932ce 6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents: 1
diff changeset
   291
47ecd86932ce 6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents: 1
diff changeset
   292
MethodHandlesAdapterBlob* MethodHandlesAdapterBlob::create(int buffer_size) {
47ecd86932ce 6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents: 1
diff changeset
   293
  ThreadInVMfromUnknown __tiv;  // get to VM state in case we block on CodeCache_lock
47ecd86932ce 6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents: 1
diff changeset
   294
47ecd86932ce 6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents: 1
diff changeset
   295
  MethodHandlesAdapterBlob* blob = NULL;
47ecd86932ce 6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents: 1
diff changeset
   296
  unsigned int size = sizeof(MethodHandlesAdapterBlob);
47ecd86932ce 6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents: 1
diff changeset
   297
  // align the size to CodeEntryAlignment
47ecd86932ce 6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents: 1
diff changeset
   298
  size = align_code_offset(size);
47ecd86932ce 6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents: 1
diff changeset
   299
  size += round_to(buffer_size, oopSize);
47ecd86932ce 6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents: 1
diff changeset
   300
  {
47ecd86932ce 6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents: 1
diff changeset
   301
    MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
47ecd86932ce 6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents: 1
diff changeset
   302
    blob = new (size) MethodHandlesAdapterBlob(size);
47ecd86932ce 6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents: 1
diff changeset
   303
  }
47ecd86932ce 6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents: 1
diff changeset
   304
  // Track memory usage statistic after releasing CodeCache_lock
47ecd86932ce 6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents: 1
diff changeset
   305
  MemoryService::track_code_cache_memory_usage();
47ecd86932ce 6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents: 1
diff changeset
   306
47ecd86932ce 6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents: 1
diff changeset
   307
  return blob;
47ecd86932ce 6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents: 1
diff changeset
   308
}
47ecd86932ce 6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents: 1
diff changeset
   309
47ecd86932ce 6934494: JSR 292 MethodHandles adapters should be generated into their own CodeBlob
twisti
parents: 1
diff changeset
   310
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   311
//----------------------------------------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   312
// Implementation of RuntimeStub
489c9b5090e2 Initial load
duke
parents:
diff changeset
   313
489c9b5090e2 Initial load
duke
parents:
diff changeset
   314
RuntimeStub::RuntimeStub(
489c9b5090e2 Initial load
duke
parents:
diff changeset
   315
  const char* name,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   316
  CodeBuffer* cb,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   317
  int         size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   318
  int         frame_complete,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   319
  int         frame_size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   320
  OopMapSet*  oop_maps,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   321
  bool        caller_must_gc_arguments
489c9b5090e2 Initial load
duke
parents:
diff changeset
   322
)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   323
: CodeBlob(name, cb, sizeof(RuntimeStub), size, frame_complete, frame_size, oop_maps)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   324
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
   325
  _caller_must_gc_arguments = caller_must_gc_arguments;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   326
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   327
489c9b5090e2 Initial load
duke
parents:
diff changeset
   328
489c9b5090e2 Initial load
duke
parents:
diff changeset
   329
RuntimeStub* RuntimeStub::new_runtime_stub(const char* stub_name,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   330
                                           CodeBuffer* cb,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   331
                                           int frame_complete,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   332
                                           int frame_size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   333
                                           OopMapSet* oop_maps,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   334
                                           bool caller_must_gc_arguments)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   335
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
   336
  RuntimeStub* stub = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   337
  ThreadInVMfromUnknown __tiv;  // get to VM state in case we block on CodeCache_lock
489c9b5090e2 Initial load
duke
parents:
diff changeset
   338
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   339
    MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   340
    unsigned int size = allocation_size(cb, sizeof(RuntimeStub));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   341
    stub = new (size) RuntimeStub(stub_name, cb, size, frame_complete, frame_size, oop_maps, caller_must_gc_arguments);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   342
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   343
9630
d6419e4395e3 6939861: JVM should handle more conversion operations
never
parents: 8921
diff changeset
   344
  trace_new_stub(stub, "RuntimeStub - ", stub_name);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   345
489c9b5090e2 Initial load
duke
parents:
diff changeset
   346
  return stub;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   347
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   348
489c9b5090e2 Initial load
duke
parents:
diff changeset
   349
489c9b5090e2 Initial load
duke
parents:
diff changeset
   350
void* RuntimeStub::operator new(size_t s, unsigned size) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   351
  void* p = CodeCache::allocate(size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   352
  if (!p) fatal("Initial size of CodeCache is too small");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   353
  return p;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   354
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   355
9630
d6419e4395e3 6939861: JVM should handle more conversion operations
never
parents: 8921
diff changeset
   356
// operator new shared by all singletons:
d6419e4395e3 6939861: JVM should handle more conversion operations
never
parents: 8921
diff changeset
   357
void* SingletonBlob::operator new(size_t s, unsigned size) {
d6419e4395e3 6939861: JVM should handle more conversion operations
never
parents: 8921
diff changeset
   358
  void* p = CodeCache::allocate(size);
d6419e4395e3 6939861: JVM should handle more conversion operations
never
parents: 8921
diff changeset
   359
  if (!p) fatal("Initial size of CodeCache is too small");
d6419e4395e3 6939861: JVM should handle more conversion operations
never
parents: 8921
diff changeset
   360
  return p;
d6419e4395e3 6939861: JVM should handle more conversion operations
never
parents: 8921
diff changeset
   361
}
d6419e4395e3 6939861: JVM should handle more conversion operations
never
parents: 8921
diff changeset
   362
d6419e4395e3 6939861: JVM should handle more conversion operations
never
parents: 8921
diff changeset
   363
d6419e4395e3 6939861: JVM should handle more conversion operations
never
parents: 8921
diff changeset
   364
//----------------------------------------------------------------------------------------------------
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   365
// Implementation of DeoptimizationBlob
489c9b5090e2 Initial load
duke
parents:
diff changeset
   366
489c9b5090e2 Initial load
duke
parents:
diff changeset
   367
DeoptimizationBlob::DeoptimizationBlob(
489c9b5090e2 Initial load
duke
parents:
diff changeset
   368
  CodeBuffer* cb,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   369
  int         size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   370
  OopMapSet*  oop_maps,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   371
  int         unpack_offset,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   372
  int         unpack_with_exception_offset,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   373
  int         unpack_with_reexecution_offset,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   374
  int         frame_size
489c9b5090e2 Initial load
duke
parents:
diff changeset
   375
)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   376
: SingletonBlob("DeoptimizationBlob", cb, sizeof(DeoptimizationBlob), size, frame_size, oop_maps)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   377
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
   378
  _unpack_offset           = unpack_offset;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   379
  _unpack_with_exception   = unpack_with_exception_offset;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   380
  _unpack_with_reexecution = unpack_with_reexecution_offset;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   381
#ifdef COMPILER1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   382
  _unpack_with_exception_in_tls   = -1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   383
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   384
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   385
489c9b5090e2 Initial load
duke
parents:
diff changeset
   386
489c9b5090e2 Initial load
duke
parents:
diff changeset
   387
DeoptimizationBlob* DeoptimizationBlob::create(
489c9b5090e2 Initial load
duke
parents:
diff changeset
   388
  CodeBuffer* cb,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   389
  OopMapSet*  oop_maps,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   390
  int        unpack_offset,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   391
  int        unpack_with_exception_offset,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   392
  int        unpack_with_reexecution_offset,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   393
  int        frame_size)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   394
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
   395
  DeoptimizationBlob* blob = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   396
  ThreadInVMfromUnknown __tiv;  // get to VM state in case we block on CodeCache_lock
489c9b5090e2 Initial load
duke
parents:
diff changeset
   397
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   398
    MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   399
    unsigned int size = allocation_size(cb, sizeof(DeoptimizationBlob));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   400
    blob = new (size) DeoptimizationBlob(cb,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   401
                                         size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   402
                                         oop_maps,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   403
                                         unpack_offset,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   404
                                         unpack_with_exception_offset,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   405
                                         unpack_with_reexecution_offset,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   406
                                         frame_size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   407
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   408
9630
d6419e4395e3 6939861: JVM should handle more conversion operations
never
parents: 8921
diff changeset
   409
  trace_new_stub(blob, "DeoptimizationBlob");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   410
489c9b5090e2 Initial load
duke
parents:
diff changeset
   411
  return blob;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   412
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   413
489c9b5090e2 Initial load
duke
parents:
diff changeset
   414
489c9b5090e2 Initial load
duke
parents:
diff changeset
   415
//----------------------------------------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   416
// Implementation of UncommonTrapBlob
489c9b5090e2 Initial load
duke
parents:
diff changeset
   417
489c9b5090e2 Initial load
duke
parents:
diff changeset
   418
#ifdef COMPILER2
489c9b5090e2 Initial load
duke
parents:
diff changeset
   419
UncommonTrapBlob::UncommonTrapBlob(
489c9b5090e2 Initial load
duke
parents:
diff changeset
   420
  CodeBuffer* cb,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   421
  int         size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   422
  OopMapSet*  oop_maps,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   423
  int         frame_size
489c9b5090e2 Initial load
duke
parents:
diff changeset
   424
)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   425
: SingletonBlob("UncommonTrapBlob", cb, sizeof(UncommonTrapBlob), size, frame_size, oop_maps)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   426
{}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   427
489c9b5090e2 Initial load
duke
parents:
diff changeset
   428
489c9b5090e2 Initial load
duke
parents:
diff changeset
   429
UncommonTrapBlob* UncommonTrapBlob::create(
489c9b5090e2 Initial load
duke
parents:
diff changeset
   430
  CodeBuffer* cb,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   431
  OopMapSet*  oop_maps,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   432
  int        frame_size)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   433
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
   434
  UncommonTrapBlob* blob = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   435
  ThreadInVMfromUnknown __tiv;  // get to VM state in case we block on CodeCache_lock
489c9b5090e2 Initial load
duke
parents:
diff changeset
   436
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   437
    MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   438
    unsigned int size = allocation_size(cb, sizeof(UncommonTrapBlob));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   439
    blob = new (size) UncommonTrapBlob(cb, size, oop_maps, frame_size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   440
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   441
9630
d6419e4395e3 6939861: JVM should handle more conversion operations
never
parents: 8921
diff changeset
   442
  trace_new_stub(blob, "UncommonTrapBlob");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   443
489c9b5090e2 Initial load
duke
parents:
diff changeset
   444
  return blob;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   445
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   446
489c9b5090e2 Initial load
duke
parents:
diff changeset
   447
489c9b5090e2 Initial load
duke
parents:
diff changeset
   448
#endif // COMPILER2
489c9b5090e2 Initial load
duke
parents:
diff changeset
   449
489c9b5090e2 Initial load
duke
parents:
diff changeset
   450
489c9b5090e2 Initial load
duke
parents:
diff changeset
   451
//----------------------------------------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   452
// Implementation of ExceptionBlob
489c9b5090e2 Initial load
duke
parents:
diff changeset
   453
489c9b5090e2 Initial load
duke
parents:
diff changeset
   454
#ifdef COMPILER2
489c9b5090e2 Initial load
duke
parents:
diff changeset
   455
ExceptionBlob::ExceptionBlob(
489c9b5090e2 Initial load
duke
parents:
diff changeset
   456
  CodeBuffer* cb,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   457
  int         size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   458
  OopMapSet*  oop_maps,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   459
  int         frame_size
489c9b5090e2 Initial load
duke
parents:
diff changeset
   460
)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   461
: SingletonBlob("ExceptionBlob", cb, sizeof(ExceptionBlob), size, frame_size, oop_maps)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   462
{}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   463
489c9b5090e2 Initial load
duke
parents:
diff changeset
   464
489c9b5090e2 Initial load
duke
parents:
diff changeset
   465
ExceptionBlob* ExceptionBlob::create(
489c9b5090e2 Initial load
duke
parents:
diff changeset
   466
  CodeBuffer* cb,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   467
  OopMapSet*  oop_maps,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   468
  int         frame_size)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   469
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
   470
  ExceptionBlob* blob = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   471
  ThreadInVMfromUnknown __tiv;  // get to VM state in case we block on CodeCache_lock
489c9b5090e2 Initial load
duke
parents:
diff changeset
   472
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   473
    MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   474
    unsigned int size = allocation_size(cb, sizeof(ExceptionBlob));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   475
    blob = new (size) ExceptionBlob(cb, size, oop_maps, frame_size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   476
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   477
9630
d6419e4395e3 6939861: JVM should handle more conversion operations
never
parents: 8921
diff changeset
   478
  trace_new_stub(blob, "ExceptionBlob");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   479
489c9b5090e2 Initial load
duke
parents:
diff changeset
   480
  return blob;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   481
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   482
489c9b5090e2 Initial load
duke
parents:
diff changeset
   483
489c9b5090e2 Initial load
duke
parents:
diff changeset
   484
#endif // COMPILER2
489c9b5090e2 Initial load
duke
parents:
diff changeset
   485
489c9b5090e2 Initial load
duke
parents:
diff changeset
   486
489c9b5090e2 Initial load
duke
parents:
diff changeset
   487
//----------------------------------------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   488
// Implementation of SafepointBlob
489c9b5090e2 Initial load
duke
parents:
diff changeset
   489
489c9b5090e2 Initial load
duke
parents:
diff changeset
   490
SafepointBlob::SafepointBlob(
489c9b5090e2 Initial load
duke
parents:
diff changeset
   491
  CodeBuffer* cb,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   492
  int         size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   493
  OopMapSet*  oop_maps,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   494
  int         frame_size
489c9b5090e2 Initial load
duke
parents:
diff changeset
   495
)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   496
: SingletonBlob("SafepointBlob", cb, sizeof(SafepointBlob), size, frame_size, oop_maps)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   497
{}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   498
489c9b5090e2 Initial load
duke
parents:
diff changeset
   499
489c9b5090e2 Initial load
duke
parents:
diff changeset
   500
SafepointBlob* SafepointBlob::create(
489c9b5090e2 Initial load
duke
parents:
diff changeset
   501
  CodeBuffer* cb,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   502
  OopMapSet*  oop_maps,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   503
  int         frame_size)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   504
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
   505
  SafepointBlob* blob = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   506
  ThreadInVMfromUnknown __tiv;  // get to VM state in case we block on CodeCache_lock
489c9b5090e2 Initial load
duke
parents:
diff changeset
   507
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   508
    MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   509
    unsigned int size = allocation_size(cb, sizeof(SafepointBlob));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   510
    blob = new (size) SafepointBlob(cb, size, oop_maps, frame_size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   511
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   512
9630
d6419e4395e3 6939861: JVM should handle more conversion operations
never
parents: 8921
diff changeset
   513
  trace_new_stub(blob, "SafepointBlob");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   514
489c9b5090e2 Initial load
duke
parents:
diff changeset
   515
  return blob;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   516
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   517
489c9b5090e2 Initial load
duke
parents:
diff changeset
   518
489c9b5090e2 Initial load
duke
parents:
diff changeset
   519
//----------------------------------------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   520
// Verification and printing
489c9b5090e2 Initial load
duke
parents:
diff changeset
   521
489c9b5090e2 Initial load
duke
parents:
diff changeset
   522
void CodeBlob::verify() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   523
  ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   524
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   525
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 6065
diff changeset
   526
void CodeBlob::print_on(outputStream* st) const {
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 6065
diff changeset
   527
  st->print_cr("[CodeBlob (" INTPTR_FORMAT ")]", this);
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 6065
diff changeset
   528
  st->print_cr("Framesize: %d", _frame_size);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   529
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   530
489c9b5090e2 Initial load
duke
parents:
diff changeset
   531
void CodeBlob::print_value_on(outputStream* st) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   532
  st->print_cr("[CodeBlob]");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   533
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   534
489c9b5090e2 Initial load
duke
parents:
diff changeset
   535
void BufferBlob::verify() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   536
  // unimplemented
489c9b5090e2 Initial load
duke
parents:
diff changeset
   537
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   538
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 6065
diff changeset
   539
void BufferBlob::print_on(outputStream* st) const {
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 6065
diff changeset
   540
  CodeBlob::print_on(st);
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 6065
diff changeset
   541
  print_value_on(st);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   542
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   543
489c9b5090e2 Initial load
duke
parents:
diff changeset
   544
void BufferBlob::print_value_on(outputStream* st) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   545
  st->print_cr("BufferBlob (" INTPTR_FORMAT  ") used for %s", this, name());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   546
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   547
489c9b5090e2 Initial load
duke
parents:
diff changeset
   548
void RuntimeStub::verify() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   549
  // unimplemented
489c9b5090e2 Initial load
duke
parents:
diff changeset
   550
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   551
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 6065
diff changeset
   552
void RuntimeStub::print_on(outputStream* st) const {
13887
89b873bcc55b 7200163: add CodeComments functionality to assember stubs
kvn
parents: 13728
diff changeset
   553
  ttyLocker ttyl;
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 6065
diff changeset
   554
  CodeBlob::print_on(st);
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 6065
diff changeset
   555
  st->print("Runtime Stub (" INTPTR_FORMAT "): ", this);
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 6065
diff changeset
   556
  st->print_cr(name());
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 6065
diff changeset
   557
  Disassembler::decode((CodeBlob*)this, st);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   558
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   559
489c9b5090e2 Initial load
duke
parents:
diff changeset
   560
void RuntimeStub::print_value_on(outputStream* st) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   561
  st->print("RuntimeStub (" INTPTR_FORMAT "): ", this); st->print(name());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   562
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   563
489c9b5090e2 Initial load
duke
parents:
diff changeset
   564
void SingletonBlob::verify() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   565
  // unimplemented
489c9b5090e2 Initial load
duke
parents:
diff changeset
   566
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   567
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 6065
diff changeset
   568
void SingletonBlob::print_on(outputStream* st) const {
13887
89b873bcc55b 7200163: add CodeComments functionality to assember stubs
kvn
parents: 13728
diff changeset
   569
  ttyLocker ttyl;
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 6065
diff changeset
   570
  CodeBlob::print_on(st);
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 6065
diff changeset
   571
  st->print_cr(name());
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 6065
diff changeset
   572
  Disassembler::decode((CodeBlob*)this, st);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   573
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   574
489c9b5090e2 Initial load
duke
parents:
diff changeset
   575
void SingletonBlob::print_value_on(outputStream* st) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   576
  st->print_cr(name());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   577
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   578
489c9b5090e2 Initial load
duke
parents:
diff changeset
   579
void DeoptimizationBlob::print_value_on(outputStream* st) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   580
  st->print_cr("Deoptimization (frame not available)");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   581
}