annotate src/share/vm/shark/sharkRuntime.cpp @ 3762:5c0a3c1858b1

7048782: CMS: assert(last_chunk_index_to_check<= last_chunk_index) failed: parCardTableModRefBS.cpp:359 Summary: The LNC array is sized before the start of a scavenge, while the heap may expand during a scavenge. With CMS, the last block of an arbitrary suffice of the LNC array may expand due to coalition with the expansion delta. We now take care not to attempt access past the end of the LNC array. LNC array code will be cleaned up and suitably encapsulated as part of the forthcoming performance RFE 7043675. Reviewed-by: brutisso
author ysr
date Thu, 02 Jun 2011 10:23:36 -0700
parents f95d63e2154a
children da91efe96a93
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1692
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1 /*
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1692
diff changeset
2 * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
1692
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
3 * Copyright 2008, 2009, 2010 Red Hat, Inc.
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
4 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
5 *
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
6 * This code is free software; you can redistribute it and/or modify it
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
7 * under the terms of the GNU General Public License version 2 only, as
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
8 * published by the Free Software Foundation.
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
9 *
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
10 * This code is distributed in the hope that it will be useful, but WITHOUT
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
12 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
13 * version 2 for more details (a copy is included in the LICENSE file that
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
14 * accompanied this code).
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
15 *
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
16 * You should have received a copy of the GNU General Public License version
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
17 * 2 along with this work; if not, write to the Free Software Foundation,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
18 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
19 *
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
20 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
21 * or visit www.oracle.com if you need additional information or have any
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
22 * questions.
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
23 *
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
24 */
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
25
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1692
diff changeset
26 #include "precompiled.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1692
diff changeset
27 #include "oops/klassOop.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1692
diff changeset
28 #include "runtime/biasedLocking.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1692
diff changeset
29 #include "runtime/deoptimization.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1692
diff changeset
30 #include "runtime/thread.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1692
diff changeset
31 #include "shark/llvmHeaders.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1692
diff changeset
32 #include "shark/sharkRuntime.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1692
diff changeset
33 #ifdef TARGET_ARCH_zero
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1692
diff changeset
34 # include "stack_zero.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1692
diff changeset
35 #endif
1692
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
36
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
37 using namespace llvm;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
38
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
39 JRT_ENTRY(int, SharkRuntime::find_exception_handler(JavaThread* thread,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
40 int* indexes,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
41 int num_indexes))
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
42 constantPoolHandle pool(thread, method(thread)->constants());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
43 KlassHandle exc_klass(thread, ((oop) tos_at(thread, 0))->klass());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
44
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
45 for (int i = 0; i < num_indexes; i++) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
46 klassOop tmp = pool->klass_at(indexes[i], CHECK_0);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
47 KlassHandle chk_klass(thread, tmp);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
48
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
49 if (exc_klass() == chk_klass())
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
50 return i;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
51
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
52 if (exc_klass()->klass_part()->is_subtype_of(chk_klass()))
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
53 return i;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
54 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
55
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
56 return -1;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
57 JRT_END
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
58
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
59 JRT_ENTRY(void, SharkRuntime::monitorenter(JavaThread* thread,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
60 BasicObjectLock* lock))
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
61 if (PrintBiasedLockingStatistics)
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
62 Atomic::inc(BiasedLocking::slow_path_entry_count_addr());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
63
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
64 Handle object(thread, lock->obj());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
65 assert(Universe::heap()->is_in_reserved_or_null(object()), "should be");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
66 if (UseBiasedLocking) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
67 // Retry fast entry if bias is revoked to avoid unnecessary inflation
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
68 ObjectSynchronizer::fast_enter(object, lock->lock(), true, CHECK);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
69 } else {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
70 ObjectSynchronizer::slow_enter(object, lock->lock(), CHECK);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
71 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
72 assert(Universe::heap()->is_in_reserved_or_null(lock->obj()), "should be");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
73 JRT_END
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
74
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
75 JRT_ENTRY(void, SharkRuntime::monitorexit(JavaThread* thread,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
76 BasicObjectLock* lock))
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
77 Handle object(thread, lock->obj());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
78 assert(Universe::heap()->is_in_reserved_or_null(object()), "should be");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
79 if (lock == NULL || object()->is_unlocked()) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
80 THROW(vmSymbols::java_lang_IllegalMonitorStateException());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
81 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
82 ObjectSynchronizer::slow_exit(object(), lock->lock(), thread);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
83 JRT_END
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
84
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
85 JRT_ENTRY(void, SharkRuntime::new_instance(JavaThread* thread, int index))
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
86 klassOop k_oop = method(thread)->constants()->klass_at(index, CHECK);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
87 instanceKlassHandle klass(THREAD, k_oop);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
88
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
89 // Make sure we are not instantiating an abstract klass
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
90 klass->check_valid_for_instantiation(true, CHECK);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
91
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
92 // Make sure klass is initialized
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
93 klass->initialize(CHECK);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
94
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
95 // At this point the class may not be fully initialized
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
96 // because of recursive initialization. If it is fully
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
97 // initialized & has_finalized is not set, we rewrite
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
98 // it into its fast version (Note: no locking is needed
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
99 // here since this is an atomic byte write and can be
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
100 // done more than once).
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
101 //
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
102 // Note: In case of classes with has_finalized we don't
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
103 // rewrite since that saves us an extra check in
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
104 // the fast version which then would call the
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
105 // slow version anyway (and do a call back into
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
106 // Java).
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
107 // If we have a breakpoint, then we don't rewrite
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
108 // because the _breakpoint bytecode would be lost.
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
109 oop obj = klass->allocate_instance(CHECK);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
110 thread->set_vm_result(obj);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
111 JRT_END
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
112
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
113 JRT_ENTRY(void, SharkRuntime::newarray(JavaThread* thread,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
114 BasicType type,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
115 int size))
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
116 oop obj = oopFactory::new_typeArray(type, size, CHECK);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
117 thread->set_vm_result(obj);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
118 JRT_END
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
119
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
120 JRT_ENTRY(void, SharkRuntime::anewarray(JavaThread* thread,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
121 int index,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
122 int size))
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
123 klassOop klass = method(thread)->constants()->klass_at(index, CHECK);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
124 objArrayOop obj = oopFactory::new_objArray(klass, size, CHECK);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
125 thread->set_vm_result(obj);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
126 JRT_END
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
127
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
128 JRT_ENTRY(void, SharkRuntime::multianewarray(JavaThread* thread,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
129 int index,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
130 int ndims,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
131 int* dims))
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
132 klassOop klass = method(thread)->constants()->klass_at(index, CHECK);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
133 oop obj = arrayKlass::cast(klass)->multi_allocate(ndims, dims, CHECK);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
134 thread->set_vm_result(obj);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
135 JRT_END
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
136
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
137 JRT_ENTRY(void, SharkRuntime::register_finalizer(JavaThread* thread,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
138 oop object))
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
139 assert(object->is_oop(), "should be");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
140 assert(object->klass()->klass_part()->has_finalizer(), "should have");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
141 instanceKlass::register_finalizer(instanceOop(object), CHECK);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
142 JRT_END
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
143
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
144 JRT_ENTRY(void, SharkRuntime::throw_ArithmeticException(JavaThread* thread,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
145 const char* file,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
146 int line))
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
147 Exceptions::_throw_msg(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
148 thread, file, line,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
149 vmSymbols::java_lang_ArithmeticException(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
150 "");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
151 JRT_END
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
152
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
153 JRT_ENTRY(void, SharkRuntime::throw_ArrayIndexOutOfBoundsException(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
154 JavaThread* thread,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
155 const char* file,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
156 int line,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
157 int index))
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
158 char msg[jintAsStringSize];
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
159 snprintf(msg, sizeof(msg), "%d", index);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
160 Exceptions::_throw_msg(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
161 thread, file, line,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
162 vmSymbols::java_lang_ArrayIndexOutOfBoundsException(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
163 msg);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
164 JRT_END
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
165
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
166 JRT_ENTRY(void, SharkRuntime::throw_ClassCastException(JavaThread* thread,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
167 const char* file,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
168 int line))
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
169 Exceptions::_throw_msg(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
170 thread, file, line,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
171 vmSymbols::java_lang_ClassCastException(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
172 "");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
173 JRT_END
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
174
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
175 JRT_ENTRY(void, SharkRuntime::throw_NullPointerException(JavaThread* thread,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
176 const char* file,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
177 int line))
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
178 Exceptions::_throw_msg(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
179 thread, file, line,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
180 vmSymbols::java_lang_NullPointerException(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
181 "");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
182 JRT_END
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
183
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
184 // Non-VM calls
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
185 // Nothing in these must ever GC!
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
186
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
187 void SharkRuntime::dump(const char *name, intptr_t value) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
188 oop valueOop = (oop) value;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
189 tty->print("%s = ", name);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
190 if (valueOop->is_oop(true))
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
191 valueOop->print_on(tty);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
192 else if (value >= ' ' && value <= '~')
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
193 tty->print("'%c' (%d)", value, value);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
194 else
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
195 tty->print("%p", value);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
196 tty->print_cr("");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
197 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
198
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
199 bool SharkRuntime::is_subtype_of(klassOop check_klass, klassOop object_klass) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
200 return object_klass->klass_part()->is_subtype_of(check_klass);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
201 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
202
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
203 int SharkRuntime::uncommon_trap(JavaThread* thread, int trap_request) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
204 Thread *THREAD = thread;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
205
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
206 // In C2, uncommon_trap_blob creates a frame, so all the various
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
207 // deoptimization functions expect to find the frame of the method
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
208 // being deopted one frame down on the stack. We create a dummy
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
209 // frame to mirror this.
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
210 FakeStubFrame *stubframe = FakeStubFrame::build(CHECK_0);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
211 thread->push_zero_frame(stubframe);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
212
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
213 // Initiate the trap
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
214 thread->set_last_Java_frame();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
215 Deoptimization::UnrollBlock *urb =
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
216 Deoptimization::uncommon_trap(thread, trap_request);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
217 thread->reset_last_Java_frame();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
218
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
219 // Pop our dummy frame and the frame being deoptimized
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
220 thread->pop_zero_frame();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
221 thread->pop_zero_frame();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
222
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
223 // Push skeleton frames
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
224 int number_of_frames = urb->number_of_frames();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
225 for (int i = 0; i < number_of_frames; i++) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
226 intptr_t size = urb->frame_sizes()[i];
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
227 InterpreterFrame *frame = InterpreterFrame::build(size, CHECK_0);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
228 thread->push_zero_frame(frame);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
229 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
230
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
231 // Push another dummy frame
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
232 stubframe = FakeStubFrame::build(CHECK_0);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
233 thread->push_zero_frame(stubframe);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
234
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
235 // Fill in the skeleton frames
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
236 thread->set_last_Java_frame();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
237 Deoptimization::unpack_frames(thread, Deoptimization::Unpack_uncommon_trap);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
238 thread->reset_last_Java_frame();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
239
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
240 // Pop our dummy frame
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
241 thread->pop_zero_frame();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
242
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
243 // Fall back into the interpreter
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
244 return number_of_frames;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
245 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
246
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
247 FakeStubFrame* FakeStubFrame::build(TRAPS) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
248 ZeroStack *stack = ((JavaThread *) THREAD)->zero_stack();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
249 stack->overflow_check(header_words, CHECK_NULL);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
250
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
251 stack->push(0); // next_frame, filled in later
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
252 intptr_t *fp = stack->sp();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
253 assert(fp - stack->sp() == next_frame_off, "should be");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
254
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
255 stack->push(FAKE_STUB_FRAME);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
256 assert(fp - stack->sp() == frame_type_off, "should be");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
257
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
258 return (FakeStubFrame *) fp;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
259 }