Mercurial > hg > truffle
annotate src/share/vm/runtime/javaCalls.hpp @ 9126:bc26f978b0ce
HotSpotResolvedObjectType: implement hasFinalizeSubclass() correctly
don't use the (wrong) cached value, but ask the runtime on each request.
Fixes regression on xml.* benchmarks @ specjvm2008. The problem was:
After the constructor of Object was deoptimized due to an assumption violation,
it was recompiled again after some time. However, on recompilation, the value
of hasFinalizeSubclass for the class was not updated and it was compiled again
with a, now wrong, assumption, which then triggers deoptimization again.
This was repeated until it hit the recompilation limit (defined by
PerMethodRecompilationCutoff), and therefore only executed by the interpreter
from now on, causing the performance regression.
author | Bernhard Urban <bernhard.urban@jku.at> |
---|---|
date | Mon, 15 Apr 2013 19:54:58 +0200 |
parents | 2156359ee519 |
children | 6b0fd0964b87 |
rev | line source |
---|---|
0 | 1 /* |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
3960
diff
changeset
|
2 * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. |
0 | 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * | |
5 * This code is free software; you can redistribute it and/or modify it | |
6 * under the terms of the GNU General Public License version 2 only, as | |
7 * published by the Free Software Foundation. | |
8 * | |
9 * This code is distributed in the hope that it will be useful, but WITHOUT | |
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
12 * version 2 for more details (a copy is included in the LICENSE file that | |
13 * accompanied this code). | |
14 * | |
15 * You should have received a copy of the GNU General Public License version | |
16 * 2 along with this work; if not, write to the Free Software Foundation, | |
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
18 * | |
1552
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
1506
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
1506
diff
changeset
|
20 * or visit www.oracle.com if you need additional information or have any |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
1506
diff
changeset
|
21 * questions. |
0 | 22 * |
23 */ | |
24 | |
1972 | 25 #ifndef SHARE_VM_RUNTIME_JAVACALLS_HPP |
26 #define SHARE_VM_RUNTIME_JAVACALLS_HPP | |
27 | |
28 #include "memory/allocation.hpp" | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
3960
diff
changeset
|
29 #include "oops/method.hpp" |
1972 | 30 #include "runtime/handles.hpp" |
31 #include "runtime/javaFrameAnchor.hpp" | |
7180
f34d701e952e
8003935: Simplify the needed includes for using Thread::current()
stefank
parents:
6725
diff
changeset
|
32 #include "runtime/thread.inline.hpp" |
1972 | 33 #include "runtime/vmThread.hpp" |
34 #ifdef TARGET_ARCH_x86 | |
35 # include "jniTypes_x86.hpp" | |
36 #endif | |
37 #ifdef TARGET_ARCH_sparc | |
38 # include "jniTypes_sparc.hpp" | |
39 #endif | |
40 #ifdef TARGET_ARCH_zero | |
41 # include "jniTypes_zero.hpp" | |
42 #endif | |
2192
b92c45f2bc75
7016023: Enable building ARM and PPC from src/closed repository
bobv
parents:
2177
diff
changeset
|
43 #ifdef TARGET_ARCH_arm |
b92c45f2bc75
7016023: Enable building ARM and PPC from src/closed repository
bobv
parents:
2177
diff
changeset
|
44 # include "jniTypes_arm.hpp" |
b92c45f2bc75
7016023: Enable building ARM and PPC from src/closed repository
bobv
parents:
2177
diff
changeset
|
45 #endif |
b92c45f2bc75
7016023: Enable building ARM and PPC from src/closed repository
bobv
parents:
2177
diff
changeset
|
46 #ifdef TARGET_ARCH_ppc |
b92c45f2bc75
7016023: Enable building ARM and PPC from src/closed repository
bobv
parents:
2177
diff
changeset
|
47 # include "jniTypes_ppc.hpp" |
b92c45f2bc75
7016023: Enable building ARM and PPC from src/closed repository
bobv
parents:
2177
diff
changeset
|
48 #endif |
1972 | 49 |
0 | 50 // A JavaCallWrapper is constructed before each JavaCall and destructed after the call. |
51 // Its purpose is to allocate/deallocate a new handle block and to save/restore the last | |
52 // Java fp/sp. A pointer to the JavaCallWrapper is stored on the stack. | |
53 | |
54 class JavaCallWrapper: StackObj { | |
55 friend class VMStructs; | |
56 private: | |
57 JavaThread* _thread; // the thread to which this call belongs | |
58 JNIHandleBlock* _handles; // the saved handle block | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
3960
diff
changeset
|
59 Method* _callee_method; // to be able to collect arguments if entry frame is top frame |
0 | 60 oop _receiver; // the receiver of the call (if a non-static call) |
61 | |
62 JavaFrameAnchor _anchor; // last thread anchor state that we must restore | |
63 | |
64 JavaValue* _result; // result value | |
65 | |
66 public: | |
67 // Construction/destruction | |
68 JavaCallWrapper(methodHandle callee_method, Handle receiver, JavaValue* result, TRAPS); | |
69 ~JavaCallWrapper(); | |
70 | |
71 // Accessors | |
72 JavaThread* thread() const { return _thread; } | |
73 JNIHandleBlock* handles() const { return _handles; } | |
74 | |
75 JavaFrameAnchor* anchor(void) { return &_anchor; } | |
76 | |
77 JavaValue* result() const { return _result; } | |
78 // GC support | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
3960
diff
changeset
|
79 Method* callee_method() { return _callee_method; } |
0 | 80 oop receiver() { return _receiver; } |
81 void oops_do(OopClosure* f); | |
82 | |
83 }; | |
84 | |
85 | |
86 // Encapsulates arguments to a JavaCall (faster, safer, and more convenient than using var-args) | |
87 class JavaCallArguments : public StackObj { | |
88 private: | |
89 enum Constants { | |
90 _default_size = 8 // Must be at least # of arguments in JavaCalls methods | |
91 }; | |
92 | |
93 intptr_t _value_buffer [_default_size + 1]; | |
94 bool _is_oop_buffer[_default_size + 1]; | |
95 | |
96 intptr_t* _value; | |
97 bool* _is_oop; | |
98 int _size; | |
99 int _max_size; | |
100 bool _start_at_zero; // Support late setting of receiver | |
8151
b8f261ba79c6
Minimize diff to plain HotSpot version.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
7212
diff
changeset
|
101 #ifdef GRAAL |
b8f261ba79c6
Minimize diff to plain HotSpot version.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
7212
diff
changeset
|
102 nmethod* _alternative_target; // Nmethod that should be called instead of normal target |
b8f261ba79c6
Minimize diff to plain HotSpot version.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
7212
diff
changeset
|
103 #endif |
0 | 104 |
105 void initialize() { | |
106 // Starts at first element to support set_receiver. | |
107 _value = &_value_buffer[1]; | |
108 _is_oop = &_is_oop_buffer[1]; | |
109 | |
110 _max_size = _default_size; | |
111 _size = 0; | |
112 _start_at_zero = false; | |
8151
b8f261ba79c6
Minimize diff to plain HotSpot version.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
7212
diff
changeset
|
113 GRAAL_ONLY(_alternative_target = NULL;) |
0 | 114 } |
115 | |
116 public: | |
117 JavaCallArguments() { initialize(); } | |
118 | |
119 JavaCallArguments(Handle receiver) { | |
120 initialize(); | |
121 push_oop(receiver); | |
122 } | |
123 | |
124 JavaCallArguments(int max_size) { | |
125 if (max_size > _default_size) { | |
126 _value = NEW_RESOURCE_ARRAY(intptr_t, max_size + 1); | |
127 _is_oop = NEW_RESOURCE_ARRAY(bool, max_size + 1); | |
1506 | 128 |
0 | 129 // Reserve room for potential receiver in value and is_oop |
130 _value++; _is_oop++; | |
1506 | 131 |
0 | 132 _max_size = max_size; |
133 _size = 0; | |
134 _start_at_zero = false; | |
8157
2156359ee519
Fix JavaCallArguments initialization.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
8151
diff
changeset
|
135 GRAAL_ONLY(_alternative_target = NULL;) |
0 | 136 } else { |
137 initialize(); | |
138 } | |
139 } | |
140 | |
8151
b8f261ba79c6
Minimize diff to plain HotSpot version.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
7212
diff
changeset
|
141 #ifdef GRAAL |
b8f261ba79c6
Minimize diff to plain HotSpot version.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
7212
diff
changeset
|
142 void set_alternative_target(nmethod* target) { |
b8f261ba79c6
Minimize diff to plain HotSpot version.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
7212
diff
changeset
|
143 _alternative_target = target; |
b8f261ba79c6
Minimize diff to plain HotSpot version.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
7212
diff
changeset
|
144 } |
b8f261ba79c6
Minimize diff to plain HotSpot version.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
7212
diff
changeset
|
145 |
b8f261ba79c6
Minimize diff to plain HotSpot version.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
7212
diff
changeset
|
146 nmethod* alternative_target() { |
b8f261ba79c6
Minimize diff to plain HotSpot version.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
7212
diff
changeset
|
147 return _alternative_target; |
b8f261ba79c6
Minimize diff to plain HotSpot version.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
7212
diff
changeset
|
148 } |
b8f261ba79c6
Minimize diff to plain HotSpot version.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
7212
diff
changeset
|
149 #endif |
b8f261ba79c6
Minimize diff to plain HotSpot version.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
7212
diff
changeset
|
150 |
0 | 151 inline void push_oop(Handle h) { _is_oop[_size] = true; |
152 JNITypes::put_obj((oop)h.raw_value(), _value, _size); } | |
153 | |
154 inline void push_int(int i) { _is_oop[_size] = false; | |
155 JNITypes::put_int(i, _value, _size); } | |
156 | |
157 inline void push_double(double d) { _is_oop[_size] = false; _is_oop[_size + 1] = false; | |
158 JNITypes::put_double(d, _value, _size); } | |
159 | |
160 inline void push_long(jlong l) { _is_oop[_size] = false; _is_oop[_size + 1] = false; | |
161 JNITypes::put_long(l, _value, _size); } | |
162 | |
163 inline void push_float(float f) { _is_oop[_size] = false; | |
164 JNITypes::put_float(f, _value, _size); } | |
165 | |
166 // receiver | |
167 Handle receiver() { | |
168 assert(_size > 0, "must at least be one argument"); | |
169 assert(_is_oop[0], "first argument must be an oop"); | |
170 assert(_value[0] != 0, "receiver must be not-null"); | |
171 return Handle((oop*)_value[0], false); | |
172 } | |
173 | |
174 void set_receiver(Handle h) { | |
175 assert(_start_at_zero == false, "can only be called once"); | |
176 _start_at_zero = true; | |
177 _is_oop--; | |
178 _value--; | |
179 _size++; | |
180 _is_oop[0] = true; | |
181 _value[0] = (intptr_t)h.raw_value(); | |
182 } | |
183 | |
184 // Converts all Handles to oops, and returns a reference to parameter vector | |
185 intptr_t* parameters() ; | |
186 int size_of_parameters() const { return _size; } | |
187 | |
188 // Verify that pushed arguments fits a given method | |
465
dc16daa0329d
6739363: Xcheck jni doesn't check native function arguments
poonam
parents:
0
diff
changeset
|
189 void verify(methodHandle method, BasicType return_type, Thread *thread); |
0 | 190 }; |
191 | |
192 // All calls to Java have to go via JavaCalls. Sets up the stack frame | |
193 // and makes sure that the last_Java_frame pointers are chained correctly. | |
194 // | |
195 | |
196 class JavaCalls: AllStatic { | |
8151
b8f261ba79c6
Minimize diff to plain HotSpot version.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
7212
diff
changeset
|
197 static void call_helper(JavaValue* result, methodHandle* method, JavaCallArguments* args, TRAPS); |
b8f261ba79c6
Minimize diff to plain HotSpot version.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
7212
diff
changeset
|
198 public: |
0 | 199 // Optimized Constuctor call |
200 static void call_default_constructor(JavaThread* thread, methodHandle method, Handle receiver, TRAPS); | |
201 | |
202 // call_special | |
203 // ------------ | |
204 // The receiver must be first oop in argument list | |
2177
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
1972
diff
changeset
|
205 static void call_special(JavaValue* result, KlassHandle klass, Symbol* name, Symbol* signature, JavaCallArguments* args, TRAPS); |
0 | 206 |
2177
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
1972
diff
changeset
|
207 static void call_special(JavaValue* result, Handle receiver, KlassHandle klass, Symbol* name, Symbol* signature, TRAPS); // No args |
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
1972
diff
changeset
|
208 static void call_special(JavaValue* result, Handle receiver, KlassHandle klass, Symbol* name, Symbol* signature, Handle arg1, TRAPS); |
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
1972
diff
changeset
|
209 static void call_special(JavaValue* result, Handle receiver, KlassHandle klass, Symbol* name, Symbol* signature, Handle arg1, Handle arg2, TRAPS); |
0 | 210 |
1421
6223633ce7dd
changed VMExit/VMEntries to non-static, added eclipse c++ project, CIR interface changes
Lukas Stadler <lukas.stadler@oracle.com>
parents:
470
diff
changeset
|
211 // interface call |
6223633ce7dd
changed VMExit/VMEntries to non-static, added eclipse c++ project, CIR interface changes
Lukas Stadler <lukas.stadler@oracle.com>
parents:
470
diff
changeset
|
212 // ------------ |
6223633ce7dd
changed VMExit/VMEntries to non-static, added eclipse c++ project, CIR interface changes
Lukas Stadler <lukas.stadler@oracle.com>
parents:
470
diff
changeset
|
213 |
6223633ce7dd
changed VMExit/VMEntries to non-static, added eclipse c++ project, CIR interface changes
Lukas Stadler <lukas.stadler@oracle.com>
parents:
470
diff
changeset
|
214 // The receiver must be first oop in argument list |
2182
9569fdf936ff
Made merge compile.
Thomas Wuerthinger <wuerthinger@ssw.jku.at>
parents:
2181
diff
changeset
|
215 static void call_interface(JavaValue* result, KlassHandle spec_klass, Symbol* name, Symbol* signature, JavaCallArguments* args, TRAPS); |
1421
6223633ce7dd
changed VMExit/VMEntries to non-static, added eclipse c++ project, CIR interface changes
Lukas Stadler <lukas.stadler@oracle.com>
parents:
470
diff
changeset
|
216 |
0 | 217 // virtual call |
218 // ------------ | |
219 | |
220 // The receiver must be first oop in argument list | |
2177
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
1972
diff
changeset
|
221 static void call_virtual(JavaValue* result, KlassHandle spec_klass, Symbol* name, Symbol* signature, JavaCallArguments* args, TRAPS); |
0 | 222 |
2177
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
1972
diff
changeset
|
223 static void call_virtual(JavaValue* result, Handle receiver, KlassHandle spec_klass, Symbol* name, Symbol* signature, TRAPS); // No args |
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
1972
diff
changeset
|
224 static void call_virtual(JavaValue* result, Handle receiver, KlassHandle spec_klass, Symbol* name, Symbol* signature, Handle arg1, TRAPS); |
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
1972
diff
changeset
|
225 static void call_virtual(JavaValue* result, Handle receiver, KlassHandle spec_klass, Symbol* name, Symbol* signature, Handle arg1, Handle arg2, TRAPS); |
0 | 226 |
227 // Static call | |
228 // ----------- | |
2177
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
1972
diff
changeset
|
229 static void call_static(JavaValue* result, KlassHandle klass, Symbol* name, Symbol* signature, JavaCallArguments* args, TRAPS); |
0 | 230 |
2177
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
1972
diff
changeset
|
231 static void call_static(JavaValue* result, KlassHandle klass, Symbol* name, Symbol* signature, TRAPS); |
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
1972
diff
changeset
|
232 static void call_static(JavaValue* result, KlassHandle klass, Symbol* name, Symbol* signature, Handle arg1, TRAPS); |
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
1972
diff
changeset
|
233 static void call_static(JavaValue* result, KlassHandle klass, Symbol* name, Symbol* signature, Handle arg1, Handle arg2, TRAPS); |
0 | 234 |
235 // Low-level interface | |
236 static void call(JavaValue* result, methodHandle method, JavaCallArguments* args, TRAPS); | |
237 }; | |
1972 | 238 |
239 #endif // SHARE_VM_RUNTIME_JAVACALLS_HPP |