annotate src/share/vm/graal/graalRuntime.cpp @ 13212:eb03a7335eb0

Use fixed instead of virtual register for target in far foreign call, since the register allocator does not support virtual registers to be used at call sites.
author Christian Wimmer <christian.wimmer@oracle.com>
date Mon, 02 Dec 2013 14:20:32 -0800
parents e27f3169460e
children d8143c431d63
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
7221
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
1 /*
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
2 * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
4 *
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
7 * published by the Free Software Foundation.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
8 *
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
13 * accompanied this code).
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
14 *
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
15 * You should have received a copy of the GNU General Public License version
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
18 *
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
21 * questions.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
22 */
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
23
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
24 #include "precompiled.hpp"
7735
a7a93887b4c4 fix Solaris build and initial SPARC support
twisti
parents: 7386
diff changeset
25 #include "asm/codeBuffer.hpp"
7221
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
26 #include "graal/graalRuntime.hpp"
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
27 #include "graal/graalVMToCompiler.hpp"
7735
a7a93887b4c4 fix Solaris build and initial SPARC support
twisti
parents: 7386
diff changeset
28 #include "memory/oopFactory.hpp"
a7a93887b4c4 fix Solaris build and initial SPARC support
twisti
parents: 7386
diff changeset
29 #include "prims/jvm.h"
7221
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
30 #include "runtime/biasedLocking.hpp"
7735
a7a93887b4c4 fix Solaris build and initial SPARC support
twisti
parents: 7386
diff changeset
31 #include "runtime/interfaceSupport.hpp"
10542
554f67e4ff3f Use slow-path stub call instead of deopt in lowering of DynamicNewArrayNode.
Roland Schatz <roland.schatz@oracle.com>
parents: 10475
diff changeset
32 #include "runtime/reflection.hpp"
8499
96a337d307bd -More progress in G1 WBs
Christos Kotselidis <christos.kotselidis@oracle.com>
parents: 8496
diff changeset
33 #include "utilities/debug.hpp"
7221
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
34
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
35 // Simple helper to see if the caller of a runtime stub which
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
36 // entered the VM has been deoptimized
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
37
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
38 static bool caller_is_deopted() {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
39 JavaThread* thread = JavaThread::current();
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
40 RegisterMap reg_map(thread, false);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
41 frame runtime_frame = thread->last_frame();
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
42 frame caller_frame = runtime_frame.sender(&reg_map);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
43 assert(caller_frame.is_compiled_frame(), "must be compiled");
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
44 return caller_frame.is_deoptimized_frame();
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
45 }
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
46
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
47 // Stress deoptimization
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
48 static void deopt_caller() {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
49 if ( !caller_is_deopted()) {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
50 JavaThread* thread = JavaThread::current();
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
51 RegisterMap reg_map(thread, false);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
52 frame runtime_frame = thread->last_frame();
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
53 frame caller_frame = runtime_frame.sender(&reg_map);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
54 Deoptimization::deoptimize_frame(thread, caller_frame.id(), Deoptimization::Reason_constraint);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
55 assert(caller_is_deopted(), "Must be deoptimized");
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
56 }
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
57 }
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
58
12433
808348377021 Fix inconsistent oops in slow path allocation
Christos Kotselidis <christos.kotselidis@oracle.com>
parents: 12372
diff changeset
59 JRT_BLOCK_ENTRY(void, GraalRuntime::new_instance(JavaThread* thread, Klass* klass))
808348377021 Fix inconsistent oops in slow path allocation
Christos Kotselidis <christos.kotselidis@oracle.com>
parents: 12372
diff changeset
60 JRT_BLOCK;
7221
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
61 assert(klass->is_klass(), "not a class");
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
62 instanceKlassHandle h(thread, klass);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
63 h->check_valid_for_instantiation(true, CHECK);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
64 // make sure klass is initialized
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
65 h->initialize(CHECK);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
66 // allocate instance and return via TLS
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
67 oop obj = h->allocate_instance(CHECK);
12433
808348377021 Fix inconsistent oops in slow path allocation
Christos Kotselidis <christos.kotselidis@oracle.com>
parents: 12372
diff changeset
68 thread->set_vm_result(obj);
808348377021 Fix inconsistent oops in slow path allocation
Christos Kotselidis <christos.kotselidis@oracle.com>
parents: 12372
diff changeset
69 JRT_BLOCK_END;
808348377021 Fix inconsistent oops in slow path allocation
Christos Kotselidis <christos.kotselidis@oracle.com>
parents: 12372
diff changeset
70
12366
0991c12c4186 Defer barriers upon slow-path allocation
Christos Kotselidis <christos.kotselidis@oracle.com>
parents: 10953
diff changeset
71 if (GraalDeferredInitBarriers) {
12433
808348377021 Fix inconsistent oops in slow path allocation
Christos Kotselidis <christos.kotselidis@oracle.com>
parents: 12372
diff changeset
72 new_store_pre_barrier(thread);
12366
0991c12c4186 Defer barriers upon slow-path allocation
Christos Kotselidis <christos.kotselidis@oracle.com>
parents: 10953
diff changeset
73 }
7221
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
74 JRT_END
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
75
12433
808348377021 Fix inconsistent oops in slow path allocation
Christos Kotselidis <christos.kotselidis@oracle.com>
parents: 12372
diff changeset
76 JRT_BLOCK_ENTRY(void, GraalRuntime::new_array(JavaThread* thread, Klass* array_klass, jint length))
808348377021 Fix inconsistent oops in slow path allocation
Christos Kotselidis <christos.kotselidis@oracle.com>
parents: 12372
diff changeset
77 JRT_BLOCK;
7221
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
78 // Note: no handle for klass needed since they are not used
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
79 // anymore after new_objArray() and no GC can happen before.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
80 // (This may have to change if this code changes!)
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
81 assert(array_klass->is_klass(), "not a class");
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
82 oop obj;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
83 if (array_klass->oop_is_typeArray()) {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
84 BasicType elt_type = TypeArrayKlass::cast(array_klass)->element_type();
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
85 obj = oopFactory::new_typeArray(elt_type, length, CHECK);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
86 } else {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
87 Klass* elem_klass = ObjArrayKlass::cast(array_klass)->element_klass();
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
88 obj = oopFactory::new_objArray(elem_klass, length, CHECK);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
89 }
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
90 thread->set_vm_result(obj);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
91 // This is pretty rare but this runtime patch is stressful to deoptimization
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
92 // if we deoptimize here so force a deopt to stress the path.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
93 if (DeoptimizeALot) {
9338
0266549ff6e0 added support from compiled stubs to be installed as RuntimeStubs and to be able to directly call C/C++ runtime functions (GRAAL-81)
Doug Simon <doug.simon@oracle.com>
parents: 9232
diff changeset
94 static int deopts = 0;
0266549ff6e0 added support from compiled stubs to be installed as RuntimeStubs and to be able to directly call C/C++ runtime functions (GRAAL-81)
Doug Simon <doug.simon@oracle.com>
parents: 9232
diff changeset
95 // Alternate between deoptimizing and raising an error (which will also cause a deopt)
0266549ff6e0 added support from compiled stubs to be installed as RuntimeStubs and to be able to directly call C/C++ runtime functions (GRAAL-81)
Doug Simon <doug.simon@oracle.com>
parents: 9232
diff changeset
96 if (deopts++ % 2 == 0) {
0266549ff6e0 added support from compiled stubs to be installed as RuntimeStubs and to be able to directly call C/C++ runtime functions (GRAAL-81)
Doug Simon <doug.simon@oracle.com>
parents: 9232
diff changeset
97 ResourceMark rm(THREAD);
0266549ff6e0 added support from compiled stubs to be installed as RuntimeStubs and to be able to directly call C/C++ runtime functions (GRAAL-81)
Doug Simon <doug.simon@oracle.com>
parents: 9232
diff changeset
98 THROW(vmSymbols::java_lang_OutOfMemoryError());
0266549ff6e0 added support from compiled stubs to be installed as RuntimeStubs and to be able to directly call C/C++ runtime functions (GRAAL-81)
Doug Simon <doug.simon@oracle.com>
parents: 9232
diff changeset
99 } else {
0266549ff6e0 added support from compiled stubs to be installed as RuntimeStubs and to be able to directly call C/C++ runtime functions (GRAAL-81)
Doug Simon <doug.simon@oracle.com>
parents: 9232
diff changeset
100 deopt_caller();
0266549ff6e0 added support from compiled stubs to be installed as RuntimeStubs and to be able to directly call C/C++ runtime functions (GRAAL-81)
Doug Simon <doug.simon@oracle.com>
parents: 9232
diff changeset
101 }
7221
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
102 }
12433
808348377021 Fix inconsistent oops in slow path allocation
Christos Kotselidis <christos.kotselidis@oracle.com>
parents: 12372
diff changeset
103 JRT_BLOCK_END;
808348377021 Fix inconsistent oops in slow path allocation
Christos Kotselidis <christos.kotselidis@oracle.com>
parents: 12372
diff changeset
104
808348377021 Fix inconsistent oops in slow path allocation
Christos Kotselidis <christos.kotselidis@oracle.com>
parents: 12372
diff changeset
105 if (GraalDeferredInitBarriers) {
808348377021 Fix inconsistent oops in slow path allocation
Christos Kotselidis <christos.kotselidis@oracle.com>
parents: 12372
diff changeset
106 new_store_pre_barrier(thread);
808348377021 Fix inconsistent oops in slow path allocation
Christos Kotselidis <christos.kotselidis@oracle.com>
parents: 12372
diff changeset
107 }
9338
0266549ff6e0 added support from compiled stubs to be installed as RuntimeStubs and to be able to directly call C/C++ runtime functions (GRAAL-81)
Doug Simon <doug.simon@oracle.com>
parents: 9232
diff changeset
108 JRT_END
7221
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
109
12433
808348377021 Fix inconsistent oops in slow path allocation
Christos Kotselidis <christos.kotselidis@oracle.com>
parents: 12372
diff changeset
110 void GraalRuntime::new_store_pre_barrier(JavaThread* thread) {
808348377021 Fix inconsistent oops in slow path allocation
Christos Kotselidis <christos.kotselidis@oracle.com>
parents: 12372
diff changeset
111 // After any safepoint, just before going back to compiled code,
808348377021 Fix inconsistent oops in slow path allocation
Christos Kotselidis <christos.kotselidis@oracle.com>
parents: 12372
diff changeset
112 // we inform the GC that we will be doing initializing writes to
808348377021 Fix inconsistent oops in slow path allocation
Christos Kotselidis <christos.kotselidis@oracle.com>
parents: 12372
diff changeset
113 // this object in the future without emitting card-marks, so
808348377021 Fix inconsistent oops in slow path allocation
Christos Kotselidis <christos.kotselidis@oracle.com>
parents: 12372
diff changeset
114 // GC may take any compensating steps.
808348377021 Fix inconsistent oops in slow path allocation
Christos Kotselidis <christos.kotselidis@oracle.com>
parents: 12372
diff changeset
115 // NOTE: Keep this code consistent with GraphKit::store_barrier.
808348377021 Fix inconsistent oops in slow path allocation
Christos Kotselidis <christos.kotselidis@oracle.com>
parents: 12372
diff changeset
116
808348377021 Fix inconsistent oops in slow path allocation
Christos Kotselidis <christos.kotselidis@oracle.com>
parents: 12372
diff changeset
117 oop new_obj = thread->vm_result();
808348377021 Fix inconsistent oops in slow path allocation
Christos Kotselidis <christos.kotselidis@oracle.com>
parents: 12372
diff changeset
118 if (new_obj == NULL) return;
808348377021 Fix inconsistent oops in slow path allocation
Christos Kotselidis <christos.kotselidis@oracle.com>
parents: 12372
diff changeset
119
808348377021 Fix inconsistent oops in slow path allocation
Christos Kotselidis <christos.kotselidis@oracle.com>
parents: 12372
diff changeset
120 assert(Universe::heap()->can_elide_tlab_store_barriers(),
808348377021 Fix inconsistent oops in slow path allocation
Christos Kotselidis <christos.kotselidis@oracle.com>
parents: 12372
diff changeset
121 "compiler must check this first");
808348377021 Fix inconsistent oops in slow path allocation
Christos Kotselidis <christos.kotselidis@oracle.com>
parents: 12372
diff changeset
122 // GC may decide to give back a safer copy of new_obj.
808348377021 Fix inconsistent oops in slow path allocation
Christos Kotselidis <christos.kotselidis@oracle.com>
parents: 12372
diff changeset
123 new_obj = Universe::heap()->new_store_pre_barrier(thread, new_obj);
808348377021 Fix inconsistent oops in slow path allocation
Christos Kotselidis <christos.kotselidis@oracle.com>
parents: 12372
diff changeset
124 thread->set_vm_result(new_obj);
808348377021 Fix inconsistent oops in slow path allocation
Christos Kotselidis <christos.kotselidis@oracle.com>
parents: 12372
diff changeset
125 }
808348377021 Fix inconsistent oops in slow path allocation
Christos Kotselidis <christos.kotselidis@oracle.com>
parents: 12372
diff changeset
126
7221
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
127 JRT_ENTRY(void, GraalRuntime::new_multi_array(JavaThread* thread, Klass* klass, int rank, jint* dims))
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
128 assert(klass->is_klass(), "not a class");
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
129 assert(rank >= 1, "rank must be nonzero");
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
130 oop obj = ArrayKlass::cast(klass)->multi_allocate(rank, dims, CHECK);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
131 thread->set_vm_result(obj);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
132 JRT_END
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
133
12423
370b5f07f9e2 The runtime entries need to use oopDesc* rather than oop in their signature
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 12372
diff changeset
134 JRT_ENTRY(void, GraalRuntime::dynamic_new_array(JavaThread* thread, oopDesc* element_mirror, jint length))
10542
554f67e4ff3f Use slow-path stub call instead of deopt in lowering of DynamicNewArrayNode.
Roland Schatz <roland.schatz@oracle.com>
parents: 10475
diff changeset
135 oop obj = Reflection::reflect_new_array(element_mirror, length, CHECK);
554f67e4ff3f Use slow-path stub call instead of deopt in lowering of DynamicNewArrayNode.
Roland Schatz <roland.schatz@oracle.com>
parents: 10475
diff changeset
136 thread->set_vm_result(obj);
554f67e4ff3f Use slow-path stub call instead of deopt in lowering of DynamicNewArrayNode.
Roland Schatz <roland.schatz@oracle.com>
parents: 10475
diff changeset
137 JRT_END
554f67e4ff3f Use slow-path stub call instead of deopt in lowering of DynamicNewArrayNode.
Roland Schatz <roland.schatz@oracle.com>
parents: 10475
diff changeset
138
7221
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
139 extern void vm_exit(int code);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
140
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
141 // Enter this method from compiled code handler below. This is where we transition
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
142 // to VM mode. This is done as a helper routine so that the method called directly
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
143 // from compiled code does not have to transition to VM. This allows the entry
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
144 // method to see if the nmethod that we have just looked up a handler for has
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
145 // been deoptimized while we were in the vm. This simplifies the assembly code
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
146 // cpu directories.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
147 //
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
148 // We are entering here from exception stub (via the entry method below)
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
149 // If there is a compiled exception handler in this method, we will continue there;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
150 // otherwise we will unwind the stack and continue at the caller of top frame method
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
151 // Note: we enter in Java using a special JRT wrapper. This wrapper allows us to
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
152 // control the area where we can allow a safepoint. After we exit the safepoint area we can
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
153 // check to see if the handler we are going to return is now in a nmethod that has
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
154 // been deoptimized. If that is the case we return the deopt blob
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
155 // unpack_with_exception entry instead. This makes life for the exception blob easier
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
156 // because making that same check and diverting is painful from assembly language.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
157 JRT_ENTRY_NO_ASYNC(static address, exception_handler_for_pc_helper(JavaThread* thread, oopDesc* ex, address pc, nmethod*& nm))
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
158 // Reset method handle flag.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
159 thread->set_is_method_handle_return(false);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
160
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
161 Handle exception(thread, ex);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
162 nm = CodeCache::find_nmethod(pc);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
163 assert(nm != NULL, "this is not an nmethod");
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
164 // Adjust the pc as needed/
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
165 if (nm->is_deopt_pc(pc)) {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
166 RegisterMap map(thread, false);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
167 frame exception_frame = thread->last_frame().sender(&map);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
168 // if the frame isn't deopted then pc must not correspond to the caller of last_frame
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
169 assert(exception_frame.is_deoptimized_frame(), "must be deopted");
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
170 pc = exception_frame.pc();
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
171 }
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
172 #ifdef ASSERT
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
173 assert(exception.not_null(), "NULL exceptions should be handled by throw_exception");
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
174 assert(exception->is_oop(), "just checking");
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
175 // Check that exception is a subclass of Throwable, otherwise we have a VerifyError
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
176 if (!(exception->is_a(SystemDictionary::Throwable_klass()))) {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
177 if (ExitVMOnVerifyError) vm_exit(-1);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
178 ShouldNotReachHere();
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
179 }
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
180 #endif
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
181
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
182 // Check the stack guard pages and reenable them if necessary and there is
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
183 // enough space on the stack to do so. Use fast exceptions only if the guard
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
184 // pages are enabled.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
185 bool guard_pages_enabled = thread->stack_yellow_zone_enabled();
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
186 if (!guard_pages_enabled) guard_pages_enabled = thread->reguard_stack();
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
187
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
188 if (JvmtiExport::can_post_on_exceptions()) {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
189 // To ensure correct notification of exception catches and throws
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
190 // we have to deoptimize here. If we attempted to notify the
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
191 // catches and throws during this exception lookup it's possible
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
192 // we could deoptimize on the way out of the VM and end back in
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
193 // the interpreter at the throw site. This would result in double
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
194 // notifications since the interpreter would also notify about
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
195 // these same catches and throws as it unwound the frame.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
196
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
197 RegisterMap reg_map(thread);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
198 frame stub_frame = thread->last_frame();
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
199 frame caller_frame = stub_frame.sender(&reg_map);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
200
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
201 // We don't really want to deoptimize the nmethod itself since we
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
202 // can actually continue in the exception handler ourselves but I
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
203 // don't see an easy way to have the desired effect.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
204 Deoptimization::deoptimize_frame(thread, caller_frame.id(), Deoptimization::Reason_constraint);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
205 assert(caller_is_deopted(), "Must be deoptimized");
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
206
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
207 return SharedRuntime::deopt_blob()->unpack_with_exception_in_tls();
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
208 }
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
209
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
210 // ExceptionCache is used only for exceptions at call sites and not for implicit exceptions
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
211 if (guard_pages_enabled) {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
212 address fast_continuation = nm->handler_for_exception_and_pc(exception, pc);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
213 if (fast_continuation != NULL) {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
214 // Set flag if return address is a method handle call site.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
215 thread->set_is_method_handle_return(nm->is_method_handle_return(pc));
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
216 return fast_continuation;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
217 }
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
218 }
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
219
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
220 // If the stack guard pages are enabled, check whether there is a handler in
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
221 // the current method. Otherwise (guard pages disabled), force an unwind and
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
222 // skip the exception cache update (i.e., just leave continuation==NULL).
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
223 address continuation = NULL;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
224 if (guard_pages_enabled) {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
225
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
226 // New exception handling mechanism can support inlined methods
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
227 // with exception handlers since the mappings are from PC to PC
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
228
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
229 // debugging support
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
230 // tracing
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
231 if (TraceExceptions) {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
232 ttyLocker ttyl;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
233 ResourceMark rm;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
234 int offset = pc - nm->code_begin();
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
235 tty->print_cr("Exception <%s> (0x%x) thrown in compiled method <%s> at PC " PTR_FORMAT " [" PTR_FORMAT "+%d] for thread 0x%x",
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
236 exception->print_value_string(), (address)exception(), nm->method()->print_value_string(), pc, nm->code_begin(), offset, thread);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
237 }
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
238 // for AbortVMOnException flag
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
239 NOT_PRODUCT(Exceptions::debug_check_abort(exception));
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
240
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
241 // Clear out the exception oop and pc since looking up an
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
242 // exception handler can cause class loading, which might throw an
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
243 // exception and those fields are expected to be clear during
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
244 // normal bytecode execution.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
245 thread->set_exception_oop(NULL);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
246 thread->set_exception_pc(NULL);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
247
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
248 continuation = SharedRuntime::compute_compiled_exc_handler(nm, pc, exception, false, false);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
249 // If an exception was thrown during exception dispatch, the exception oop may have changed
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
250 thread->set_exception_oop(exception());
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
251 thread->set_exception_pc(pc);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
252
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
253 // the exception cache is used only by non-implicit exceptions
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
254 if (continuation != NULL && !SharedRuntime::deopt_blob()->contains(continuation)) {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
255 nm->add_handler_for_exception_and_pc(exception, pc, continuation);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
256 }
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
257 }
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
258
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
259 // Set flag if return address is a method handle call site.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
260 thread->set_is_method_handle_return(nm->is_method_handle_return(pc));
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
261
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
262 if (TraceExceptions) {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
263 ttyLocker ttyl;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
264 ResourceMark rm;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
265 tty->print_cr("Thread " PTR_FORMAT " continuing at PC " PTR_FORMAT " for exception thrown at PC " PTR_FORMAT,
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
266 thread, continuation, pc);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
267 }
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
268
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
269 return continuation;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
270 JRT_END
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
271
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
272 // Enter this method from compiled code only if there is a Java exception handler
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
273 // in the method handling the exception.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
274 // We are entering here from exception stub. We don't do a normal VM transition here.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
275 // We do it in a helper. This is so we can check to see if the nmethod we have just
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
276 // searched for an exception handler has been deoptimized in the meantime.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
277 address GraalRuntime::exception_handler_for_pc(JavaThread* thread) {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
278 oop exception = thread->exception_oop();
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
279 address pc = thread->exception_pc();
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
280 // Still in Java mode
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
281 DEBUG_ONLY(ResetNoHandleMark rnhm);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
282 nmethod* nm = NULL;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
283 address continuation = NULL;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
284 {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
285 // Enter VM mode by calling the helper
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
286 ResetNoHandleMark rnhm;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
287 continuation = exception_handler_for_pc_helper(thread, exception, pc, nm);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
288 }
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
289 // Back in JAVA, use no oops DON'T safepoint
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
290
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
291 // Now check to see if the nmethod we were called from is now deoptimized.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
292 // If so we must return to the deopt blob and deoptimize the nmethod
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
293 if (nm != NULL && caller_is_deopted()) {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
294 continuation = SharedRuntime::deopt_blob()->unpack_with_exception_in_tls();
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
295 }
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
296
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
297 assert(continuation != NULL, "no handler found");
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
298 return continuation;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
299 }
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
300
7911
983f7bdb85ff removed redundant graal_ prefix from Graal specific functions and variable in native code
Doug Simon <doug.simon@oracle.com>
parents: 7735
diff changeset
301 JRT_ENTRY(void, GraalRuntime::create_null_exception(JavaThread* thread))
12668
e27f3169460e notify JVMTI about exception throws from runtime
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 12435
diff changeset
302 SharedRuntime::throw_and_post_jvmti_exception(thread, vmSymbols::java_lang_NullPointerException());
e27f3169460e notify JVMTI about exception throws from runtime
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 12435
diff changeset
303 thread->set_vm_result(PENDING_EXCEPTION);
e27f3169460e notify JVMTI about exception throws from runtime
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 12435
diff changeset
304 CLEAR_PENDING_EXCEPTION;
7221
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
305 JRT_END
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
306
7911
983f7bdb85ff removed redundant graal_ prefix from Graal specific functions and variable in native code
Doug Simon <doug.simon@oracle.com>
parents: 7735
diff changeset
307 JRT_ENTRY(void, GraalRuntime::create_out_of_bounds_exception(JavaThread* thread, jint index))
7221
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
308 char message[jintAsStringSize];
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
309 sprintf(message, "%d", index);
12668
e27f3169460e notify JVMTI about exception throws from runtime
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 12435
diff changeset
310 SharedRuntime::throw_and_post_jvmti_exception(thread, vmSymbols::java_lang_ArrayIndexOutOfBoundsException(), message);
e27f3169460e notify JVMTI about exception throws from runtime
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 12435
diff changeset
311 thread->set_vm_result(PENDING_EXCEPTION);
e27f3169460e notify JVMTI about exception throws from runtime
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 12435
diff changeset
312 CLEAR_PENDING_EXCEPTION;
7221
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
313 JRT_END
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
314
7911
983f7bdb85ff removed redundant graal_ prefix from Graal specific functions and variable in native code
Doug Simon <doug.simon@oracle.com>
parents: 7735
diff changeset
315 JRT_ENTRY_NO_ASYNC(void, GraalRuntime::monitorenter(JavaThread* thread, oopDesc* obj, BasicLock* lock))
7221
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
316 if (TraceGraal >= 3) {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
317 char type[O_BUFLEN];
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
318 obj->klass()->name()->as_C_string(type, O_BUFLEN);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
319 markOop mark = obj->mark();
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
320 tty->print_cr("%s: entered locking slow case with obj=" INTPTR_FORMAT ", type=%s, mark=" INTPTR_FORMAT ", lock=" INTPTR_FORMAT, thread->name(), obj, type, mark, lock);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
321 tty->flush();
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
322 }
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
323 #ifdef ASSERT
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
324 if (PrintBiasedLockingStatistics) {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
325 Atomic::inc(BiasedLocking::slow_path_entry_count_addr());
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
326 }
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
327 #endif
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
328 Handle h_obj(thread, obj);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
329 assert(h_obj()->is_oop(), "must be NULL or an object");
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
330 if (UseBiasedLocking) {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
331 // Retry fast entry if bias is revoked to avoid unnecessary inflation
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
332 ObjectSynchronizer::fast_enter(h_obj, lock, true, CHECK);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
333 } else {
7226
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7222 7154
diff changeset
334 if (GraalUseFastLocking) {
7221
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
335 // When using fast locking, the compiled code has already tried the fast case
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
336 ObjectSynchronizer::slow_enter(h_obj, lock, THREAD);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
337 } else {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
338 ObjectSynchronizer::fast_enter(h_obj, lock, false, THREAD);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
339 }
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
340 }
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
341 if (TraceGraal >= 3) {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
342 tty->print_cr("%s: exiting locking slow with obj=" INTPTR_FORMAT, thread->name(), obj);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
343 }
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
344 JRT_END
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
345
7911
983f7bdb85ff removed redundant graal_ prefix from Graal specific functions and variable in native code
Doug Simon <doug.simon@oracle.com>
parents: 7735
diff changeset
346 JRT_LEAF(void, GraalRuntime::monitorexit(JavaThread* thread, oopDesc* obj, BasicLock* lock))
7221
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
347 assert(thread == JavaThread::current(), "threads must correspond");
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
348 assert(thread->last_Java_sp(), "last_Java_sp must be set");
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
349 // monitorexit is non-blocking (leaf routine) => no exceptions can be thrown
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
350 EXCEPTION_MARK;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
351
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
352 #ifdef DEBUG
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
353 if (!obj->is_oop()) {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
354 ResetNoHandleMark rhm;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
355 nmethod* method = thread->last_frame().cb()->as_nmethod_or_null();
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
356 if (method != NULL) {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
357 tty->print_cr("ERROR in monitorexit in method %s wrong obj " INTPTR_FORMAT, method->name(), obj);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
358 }
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
359 thread->print_stack_on(tty);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
360 assert(false, "invalid lock object pointer dected");
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
361 }
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
362 #endif
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
363
7226
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7222 7154
diff changeset
364 if (GraalUseFastLocking) {
7221
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
365 // When using fast locking, the compiled code has already tried the fast case
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
366 ObjectSynchronizer::slow_exit(obj, lock, THREAD);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
367 } else {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
368 ObjectSynchronizer::fast_exit(obj, lock, THREAD);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
369 }
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
370 if (TraceGraal >= 3) {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
371 char type[O_BUFLEN];
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
372 obj->klass()->name()->as_C_string(type, O_BUFLEN);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
373 tty->print_cr("%s: exited locking slow case with obj=" INTPTR_FORMAT ", type=%s, mark=" INTPTR_FORMAT ", lock=" INTPTR_FORMAT, thread->name(), obj, type, obj->mark(), lock);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
374 tty->flush();
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
375 }
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
376 JRT_END
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
377
12423
370b5f07f9e2 The runtime entries need to use oopDesc* rather than oop in their signature
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 12372
diff changeset
378 JRT_ENTRY(void, GraalRuntime::log_object(JavaThread* thread, oopDesc* obj, jint flags))
7221
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
379 bool string = mask_bits_are_true(flags, LOG_OBJECT_STRING);
12356
359f7e70ae7f Reduce HotSpot diff and fix previous merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 10953
diff changeset
380 bool addr = mask_bits_are_true(flags, LOG_OBJECT_ADDRESS);
7221
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
381 bool newline = mask_bits_are_true(flags, LOG_OBJECT_NEWLINE);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
382 if (!string) {
12356
359f7e70ae7f Reduce HotSpot diff and fix previous merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 10953
diff changeset
383 if (!addr && obj->is_oop_or_null(true)) {
7221
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
384 char buf[O_BUFLEN];
12356
359f7e70ae7f Reduce HotSpot diff and fix previous merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 10953
diff changeset
385 tty->print("%s@%p", obj->klass()->name()->as_C_string(buf, O_BUFLEN), (address)obj);
7221
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
386 } else {
12356
359f7e70ae7f Reduce HotSpot diff and fix previous merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 10953
diff changeset
387 tty->print("%p", (address)obj);
7221
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
388 }
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
389 } else {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
390 ResourceMark rm;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
391 assert(obj != NULL && java_lang_String::is_instance(obj), "must be");
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
392 char *buf = java_lang_String::as_utf8_string(obj);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
393 tty->print(buf);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
394 }
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
395 if (newline) {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
396 tty->cr();
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
397 }
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
398 JRT_END
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
399
10434
8b22524df53b Add G1 Barriers' foreign calls
Christos Kotselidis <christos.kotselidis@oracle.com>
parents: 10072
diff changeset
400 JRT_LEAF(void, GraalRuntime::write_barrier_pre(JavaThread* thread, oopDesc* obj))
8b22524df53b Add G1 Barriers' foreign calls
Christos Kotselidis <christos.kotselidis@oracle.com>
parents: 10072
diff changeset
401 thread->satb_mark_queue().enqueue(obj);
8b22524df53b Add G1 Barriers' foreign calls
Christos Kotselidis <christos.kotselidis@oracle.com>
parents: 10072
diff changeset
402 JRT_END
8b22524df53b Add G1 Barriers' foreign calls
Christos Kotselidis <christos.kotselidis@oracle.com>
parents: 10072
diff changeset
403
8b22524df53b Add G1 Barriers' foreign calls
Christos Kotselidis <christos.kotselidis@oracle.com>
parents: 10072
diff changeset
404 JRT_LEAF(void, GraalRuntime::write_barrier_post(JavaThread* thread, void* card_addr))
8b22524df53b Add G1 Barriers' foreign calls
Christos Kotselidis <christos.kotselidis@oracle.com>
parents: 10072
diff changeset
405 thread->dirty_card_queue().enqueue(card_addr);
8b22524df53b Add G1 Barriers' foreign calls
Christos Kotselidis <christos.kotselidis@oracle.com>
parents: 10072
diff changeset
406 JRT_END
8b22524df53b Add G1 Barriers' foreign calls
Christos Kotselidis <christos.kotselidis@oracle.com>
parents: 10072
diff changeset
407
12356
359f7e70ae7f Reduce HotSpot diff and fix previous merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 10953
diff changeset
408 JRT_LEAF(jboolean, GraalRuntime::validate_object(JavaThread* thread, oopDesc* parent, oopDesc* child))
10953
97e282186b5b Add heap sanity checker with premature hard crash for debugging write barriers
Christos Kotselidis <christos.kotselidis@oracle.com>
parents: 10542
diff changeset
409 bool ret = true;
97e282186b5b Add heap sanity checker with premature hard crash for debugging write barriers
Christos Kotselidis <christos.kotselidis@oracle.com>
parents: 10542
diff changeset
410 if(!Universe::heap()->is_in_closed_subset(parent)) {
97e282186b5b Add heap sanity checker with premature hard crash for debugging write barriers
Christos Kotselidis <christos.kotselidis@oracle.com>
parents: 10542
diff changeset
411 tty->print_cr("Parent Object "INTPTR_FORMAT" not in heap", parent);
97e282186b5b Add heap sanity checker with premature hard crash for debugging write barriers
Christos Kotselidis <christos.kotselidis@oracle.com>
parents: 10542
diff changeset
412 parent->print();
97e282186b5b Add heap sanity checker with premature hard crash for debugging write barriers
Christos Kotselidis <christos.kotselidis@oracle.com>
parents: 10542
diff changeset
413 ret=false;
97e282186b5b Add heap sanity checker with premature hard crash for debugging write barriers
Christos Kotselidis <christos.kotselidis@oracle.com>
parents: 10542
diff changeset
414 }
97e282186b5b Add heap sanity checker with premature hard crash for debugging write barriers
Christos Kotselidis <christos.kotselidis@oracle.com>
parents: 10542
diff changeset
415 if(!Universe::heap()->is_in_closed_subset(child)) {
97e282186b5b Add heap sanity checker with premature hard crash for debugging write barriers
Christos Kotselidis <christos.kotselidis@oracle.com>
parents: 10542
diff changeset
416 tty->print_cr("Child Object "INTPTR_FORMAT" not in heap", child);
97e282186b5b Add heap sanity checker with premature hard crash for debugging write barriers
Christos Kotselidis <christos.kotselidis@oracle.com>
parents: 10542
diff changeset
417 child->print();
97e282186b5b Add heap sanity checker with premature hard crash for debugging write barriers
Christos Kotselidis <christos.kotselidis@oracle.com>
parents: 10542
diff changeset
418 ret=false;
97e282186b5b Add heap sanity checker with premature hard crash for debugging write barriers
Christos Kotselidis <christos.kotselidis@oracle.com>
parents: 10542
diff changeset
419 }
97e282186b5b Add heap sanity checker with premature hard crash for debugging write barriers
Christos Kotselidis <christos.kotselidis@oracle.com>
parents: 10542
diff changeset
420 return (jint)ret;
97e282186b5b Add heap sanity checker with premature hard crash for debugging write barriers
Christos Kotselidis <christos.kotselidis@oracle.com>
parents: 10542
diff changeset
421 JRT_END
97e282186b5b Add heap sanity checker with premature hard crash for debugging write barriers
Christos Kotselidis <christos.kotselidis@oracle.com>
parents: 10542
diff changeset
422
12423
370b5f07f9e2 The runtime entries need to use oopDesc* rather than oop in their signature
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 12372
diff changeset
423 JRT_ENTRY(void, GraalRuntime::vm_error(JavaThread* thread, oopDesc* where, oopDesc* format, jlong value))
7221
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
424 ResourceMark rm;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
425 assert(where == NULL || java_lang_String::is_instance(where), "must be");
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
426 const char *error_msg = where == NULL ? "<internal Graal error>" : java_lang_String::as_utf8_string(where);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
427 char *detail_msg = NULL;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
428 if (format != NULL) {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
429 const char* buf = java_lang_String::as_utf8_string(format);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
430 size_t detail_msg_length = strlen(buf) * 2;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
431 detail_msg = (char *) NEW_RESOURCE_ARRAY(u_char, detail_msg_length);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
432 jio_snprintf(detail_msg, detail_msg_length, buf, value);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
433 }
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
434 report_vm_error(__FILE__, __LINE__, error_msg, detail_msg);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
435 JRT_END
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
436
12423
370b5f07f9e2 The runtime entries need to use oopDesc* rather than oop in their signature
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 12372
diff changeset
437 JRT_LEAF(oopDesc*, GraalRuntime::load_and_clear_exception(JavaThread* thread))
9820
1b60f639ac4b implemented alternative implementation for loading the exception object from the thread at the start of an exception dispatcher
Doug Simon <doug.simon@oracle.com>
parents: 9596
diff changeset
438 oop exception = thread->exception_oop();
1b60f639ac4b implemented alternative implementation for loading the exception object from the thread at the start of an exception dispatcher
Doug Simon <doug.simon@oracle.com>
parents: 9596
diff changeset
439 assert(exception != NULL, "npe");
1b60f639ac4b implemented alternative implementation for loading the exception object from the thread at the start of an exception dispatcher
Doug Simon <doug.simon@oracle.com>
parents: 9596
diff changeset
440 thread->set_exception_oop(NULL);
1b60f639ac4b implemented alternative implementation for loading the exception object from the thread at the start of an exception dispatcher
Doug Simon <doug.simon@oracle.com>
parents: 9596
diff changeset
441 thread->set_exception_pc(0);
1b60f639ac4b implemented alternative implementation for loading the exception object from the thread at the start of an exception dispatcher
Doug Simon <doug.simon@oracle.com>
parents: 9596
diff changeset
442 return exception;
1b60f639ac4b implemented alternative implementation for loading the exception object from the thread at the start of an exception dispatcher
Doug Simon <doug.simon@oracle.com>
parents: 9596
diff changeset
443 JRT_END
8506
c3657d00e343 -Merge with tip
Christos Kotselidis <christos.kotselidis@oracle.com>
parents: 8504 8127
diff changeset
444
12423
370b5f07f9e2 The runtime entries need to use oopDesc* rather than oop in their signature
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 12372
diff changeset
445 JRT_LEAF(void, GraalRuntime::log_printf(JavaThread* thread, oopDesc* format, jlong v1, jlong v2, jlong v3))
7221
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
446 ResourceMark rm;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
447 assert(format != NULL && java_lang_String::is_instance(format), "must be");
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
448 char *buf = java_lang_String::as_utf8_string(format);
7235
a6bd253a770f expanded LOG_PRINTF stub to handle up to 3 arguments in addition to the format string
Doug Simon <doug.simon@oracle.com>
parents: 7226
diff changeset
449 tty->print(buf, v1, v2, v3);
7221
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
450 JRT_END
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
451
9573
a79e8020ad4b added Stub.decipher() to print information about values in stubs
Doug Simon <doug.simon@oracle.com>
parents: 9565
diff changeset
452 static void decipher(jlong v, bool ignoreZero) {
a79e8020ad4b added Stub.decipher() to print information about values in stubs
Doug Simon <doug.simon@oracle.com>
parents: 9565
diff changeset
453 if (v != 0 || !ignoreZero) {
a79e8020ad4b added Stub.decipher() to print information about values in stubs
Doug Simon <doug.simon@oracle.com>
parents: 9565
diff changeset
454 void* p = (void *)(address) v;
a79e8020ad4b added Stub.decipher() to print information about values in stubs
Doug Simon <doug.simon@oracle.com>
parents: 9565
diff changeset
455 CodeBlob* cb = CodeCache::find_blob(p);
a79e8020ad4b added Stub.decipher() to print information about values in stubs
Doug Simon <doug.simon@oracle.com>
parents: 9565
diff changeset
456 if (cb) {
a79e8020ad4b added Stub.decipher() to print information about values in stubs
Doug Simon <doug.simon@oracle.com>
parents: 9565
diff changeset
457 if (cb->is_nmethod()) {
a79e8020ad4b added Stub.decipher() to print information about values in stubs
Doug Simon <doug.simon@oracle.com>
parents: 9565
diff changeset
458 char buf[O_BUFLEN];
a79e8020ad4b added Stub.decipher() to print information about values in stubs
Doug Simon <doug.simon@oracle.com>
parents: 9565
diff changeset
459 tty->print("%s [%p+%d]", cb->as_nmethod_or_null()->method()->name_and_sig_as_C_string(buf, O_BUFLEN), cb->code_begin(), (address)v - cb->code_begin());
a79e8020ad4b added Stub.decipher() to print information about values in stubs
Doug Simon <doug.simon@oracle.com>
parents: 9565
diff changeset
460 return;
a79e8020ad4b added Stub.decipher() to print information about values in stubs
Doug Simon <doug.simon@oracle.com>
parents: 9565
diff changeset
461 }
a79e8020ad4b added Stub.decipher() to print information about values in stubs
Doug Simon <doug.simon@oracle.com>
parents: 9565
diff changeset
462 cb->print_value_on(tty);
a79e8020ad4b added Stub.decipher() to print information about values in stubs
Doug Simon <doug.simon@oracle.com>
parents: 9565
diff changeset
463 return;
a79e8020ad4b added Stub.decipher() to print information about values in stubs
Doug Simon <doug.simon@oracle.com>
parents: 9565
diff changeset
464 }
a79e8020ad4b added Stub.decipher() to print information about values in stubs
Doug Simon <doug.simon@oracle.com>
parents: 9565
diff changeset
465 if (Universe::heap()->is_in(p)) {
a79e8020ad4b added Stub.decipher() to print information about values in stubs
Doug Simon <doug.simon@oracle.com>
parents: 9565
diff changeset
466 oop obj = oop(p);
a79e8020ad4b added Stub.decipher() to print information about values in stubs
Doug Simon <doug.simon@oracle.com>
parents: 9565
diff changeset
467 obj->print_value_on(tty);
a79e8020ad4b added Stub.decipher() to print information about values in stubs
Doug Simon <doug.simon@oracle.com>
parents: 9565
diff changeset
468 return;
a79e8020ad4b added Stub.decipher() to print information about values in stubs
Doug Simon <doug.simon@oracle.com>
parents: 9565
diff changeset
469 }
a79e8020ad4b added Stub.decipher() to print information about values in stubs
Doug Simon <doug.simon@oracle.com>
parents: 9565
diff changeset
470 tty->print("%p [long: %d, double %f, char %c]", v, v, v, v);
a79e8020ad4b added Stub.decipher() to print information about values in stubs
Doug Simon <doug.simon@oracle.com>
parents: 9565
diff changeset
471 }
a79e8020ad4b added Stub.decipher() to print information about values in stubs
Doug Simon <doug.simon@oracle.com>
parents: 9565
diff changeset
472 }
a79e8020ad4b added Stub.decipher() to print information about values in stubs
Doug Simon <doug.simon@oracle.com>
parents: 9565
diff changeset
473
9471
5fa54bf57f8c replaced exception_handler_nofpu assembler stub with a compiled stub (GRAAL-81)
Doug Simon <doug.simon@oracle.com>
parents: 9457
diff changeset
474 JRT_LEAF(void, GraalRuntime::vm_message(jboolean vmError, jlong format, jlong v1, jlong v2, jlong v3))
9232
bb2447c64055 strings used in compiled stubs are lowered to malloc'ed C strings so that there are no embedded oops (for the strings) in the resulting installed code
Doug Simon <doug.simon@oracle.com>
parents: 8506
diff changeset
475 ResourceMark rm;
bb2447c64055 strings used in compiled stubs are lowered to malloc'ed C strings so that there are no embedded oops (for the strings) in the resulting installed code
Doug Simon <doug.simon@oracle.com>
parents: 8506
diff changeset
476 char *buf = (char*) (address) format;
9471
5fa54bf57f8c replaced exception_handler_nofpu assembler stub with a compiled stub (GRAAL-81)
Doug Simon <doug.simon@oracle.com>
parents: 9457
diff changeset
477 if (vmError) {
9573
a79e8020ad4b added Stub.decipher() to print information about values in stubs
Doug Simon <doug.simon@oracle.com>
parents: 9565
diff changeset
478 if (buf != NULL) {
a79e8020ad4b added Stub.decipher() to print information about values in stubs
Doug Simon <doug.simon@oracle.com>
parents: 9565
diff changeset
479 fatal(err_msg(buf, v1, v2, v3));
a79e8020ad4b added Stub.decipher() to print information about values in stubs
Doug Simon <doug.simon@oracle.com>
parents: 9565
diff changeset
480 } else {
a79e8020ad4b added Stub.decipher() to print information about values in stubs
Doug Simon <doug.simon@oracle.com>
parents: 9565
diff changeset
481 fatal("<anonymous error>");
a79e8020ad4b added Stub.decipher() to print information about values in stubs
Doug Simon <doug.simon@oracle.com>
parents: 9565
diff changeset
482 }
a79e8020ad4b added Stub.decipher() to print information about values in stubs
Doug Simon <doug.simon@oracle.com>
parents: 9565
diff changeset
483 } else if (buf != NULL) {
a79e8020ad4b added Stub.decipher() to print information about values in stubs
Doug Simon <doug.simon@oracle.com>
parents: 9565
diff changeset
484 tty->print(buf, v1, v2, v3);
9471
5fa54bf57f8c replaced exception_handler_nofpu assembler stub with a compiled stub (GRAAL-81)
Doug Simon <doug.simon@oracle.com>
parents: 9457
diff changeset
485 } else {
9573
a79e8020ad4b added Stub.decipher() to print information about values in stubs
Doug Simon <doug.simon@oracle.com>
parents: 9565
diff changeset
486 assert(v2 == 0, "v2 != 0");
a79e8020ad4b added Stub.decipher() to print information about values in stubs
Doug Simon <doug.simon@oracle.com>
parents: 9565
diff changeset
487 assert(v3 == 0, "v3 != 0");
a79e8020ad4b added Stub.decipher() to print information about values in stubs
Doug Simon <doug.simon@oracle.com>
parents: 9565
diff changeset
488 decipher(v1, false);
9471
5fa54bf57f8c replaced exception_handler_nofpu assembler stub with a compiled stub (GRAAL-81)
Doug Simon <doug.simon@oracle.com>
parents: 9457
diff changeset
489 }
9232
bb2447c64055 strings used in compiled stubs are lowered to malloc'ed C strings so that there are no embedded oops (for the strings) in the resulting installed code
Doug Simon <doug.simon@oracle.com>
parents: 8506
diff changeset
490 JRT_END
bb2447c64055 strings used in compiled stubs are lowered to malloc'ed C strings so that there are no embedded oops (for the strings) in the resulting installed code
Doug Simon <doug.simon@oracle.com>
parents: 8506
diff changeset
491
7911
983f7bdb85ff removed redundant graal_ prefix from Graal specific functions and variable in native code
Doug Simon <doug.simon@oracle.com>
parents: 7735
diff changeset
492 JRT_ENTRY(void, GraalRuntime::log_primitive(JavaThread* thread, jchar typeChar, jlong value, jboolean newline))
7221
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
493 union {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
494 jlong l;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
495 jdouble d;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
496 jfloat f;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
497 } uu;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
498 uu.l = value;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
499 switch (typeChar) {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
500 case 'z': tty->print(value == 0 ? "false" : "true"); break;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
501 case 'b': tty->print("%d", (jbyte) value); break;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
502 case 'c': tty->print("%c", (jchar) value); break;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
503 case 's': tty->print("%d", (jshort) value); break;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
504 case 'i': tty->print("%d", (jint) value); break;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
505 case 'f': tty->print("%f", uu.f); break;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
506 case 'j': tty->print(INT64_FORMAT, value); break;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
507 case 'd': tty->print("%lf", uu.d); break;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
508 default: assert(false, "unknown typeChar"); break;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
509 }
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
510 if (newline) {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
511 tty->cr();
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
512 }
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
513 JRT_END
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
514
12423
370b5f07f9e2 The runtime entries need to use oopDesc* rather than oop in their signature
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 12372
diff changeset
515 JRT_ENTRY(jint, GraalRuntime::identity_hash_code(JavaThread* thread, oopDesc* obj))
7221
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
516 return (jint) obj->identity_hash();
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
517 JRT_END
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
518
12423
370b5f07f9e2 The runtime entries need to use oopDesc* rather than oop in their signature
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 12372
diff changeset
519 JRT_ENTRY(jboolean, GraalRuntime::thread_is_interrupted(JavaThread* thread, oopDesc* receiver, jboolean clear_interrupted))
7220
fcae6d960acd added more compiler intrinsics
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7216
diff changeset
520 // Ensure that the C++ Thread and OSThread structures aren't freed before we operate
fcae6d960acd added more compiler intrinsics
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7216
diff changeset
521 Handle receiverHandle(thread, receiver);
12423
370b5f07f9e2 The runtime entries need to use oopDesc* rather than oop in their signature
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 12372
diff changeset
522 MutexLockerEx ml(thread->threadObj() == (void*)receiver ? NULL : Threads_lock);
7386
707e9cca11de fixed HotSpot windows build
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7235
diff changeset
523 JavaThread* receiverThread = java_lang_Thread::thread(receiverHandle());
707e9cca11de fixed HotSpot windows build
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7235
diff changeset
524 return (jint) Thread::is_interrupted(receiverThread, clear_interrupted != 0);
7221
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
525 JRT_END
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
526
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
527 // JVM_InitializeGraalRuntime
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
528 JVM_ENTRY(jobject, JVM_InitializeGraalRuntime(JNIEnv *env, jclass graalclass))
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
529 return VMToCompiler::graalRuntimePermObject();
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7145
diff changeset
530 JVM_END
10475
3489047ffea2 Restructure the handling of HotSpotInstalledCode and their link to nmethods.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 10434
diff changeset
531
3489047ffea2 Restructure the handling of HotSpotInstalledCode and their link to nmethods.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 10434
diff changeset
532 // JVM_InitializeTruffleRuntime
3489047ffea2 Restructure the handling of HotSpotInstalledCode and their link to nmethods.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 10434
diff changeset
533 JVM_ENTRY(jobject, JVM_InitializeTruffleRuntime(JNIEnv *env, jclass graalclass))
3489047ffea2 Restructure the handling of HotSpotInstalledCode and their link to nmethods.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 10434
diff changeset
534 return JNIHandles::make_local(VMToCompiler::truffleRuntime()());
3489047ffea2 Restructure the handling of HotSpotInstalledCode and their link to nmethods.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 10434
diff changeset
535 JVM_END