annotate src/share/vm/graal/graalCompilerToVM.cpp @ 7225:31c4d9f9e922

adder better CHA support added more test cases for inlining and intrinsification
author Christian Haeubl <haeubl@ssw.jku.at>
date Fri, 14 Dec 2012 12:05:35 +0100
parents 720925633b3a
children 8a3efb8c831d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
7221
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
1 /*
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
2 * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
4 *
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
7 * published by the Free Software Foundation.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
8 *
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
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 7147
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
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 7147
diff changeset
13 * accompanied this code).
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
14 *
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
15 * You should have received a copy of the GNU General Public License version
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
18 *
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
21 * questions.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
22 */
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
23
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
24 #include "precompiled.hpp"
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
25 #include "runtime/fieldDescriptor.hpp"
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
26 #include "memory/oopFactory.hpp"
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
27 #include "oops/generateOopMap.hpp"
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
28 #include "oops/fieldStreams.hpp"
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
29 #include "runtime/javaCalls.hpp"
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
30 #include "graal/graalRuntime.hpp"
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
31 #include "compiler/compileBroker.hpp"
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
32 #include "compiler/compilerOracle.hpp"
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
33 #include "graal/graalCompilerToVM.hpp"
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
34 #include "graal/graalCompiler.hpp"
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
35 #include "graal/graalEnv.hpp"
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
36 #include "graal/graalJavaAccess.hpp"
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
37 #include "graal/graalCodeInstaller.hpp"
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
38 #include "graal/graalVMToCompiler.hpp"
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
39 #include "graal/graalVmIds.hpp"
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
40
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
41
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
42 Method* getMethodFromHotSpotMethod(oop hotspot_method) {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
43 assert(hotspot_method != NULL && hotspot_method->is_a(HotSpotResolvedJavaMethod::klass()), "sanity");
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
44 return asMethod(HotSpotResolvedJavaMethod::metaspaceMethod(hotspot_method));
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
45 }
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
46
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
47 // Entry to native method implementation that transitions current thread to '_thread_in_vm'.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
48 #define C2V_VMENTRY(result_type, name, signature) \
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
49 JNIEXPORT result_type JNICALL c2v_ ## name signature { \
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
50 TRACE_graal_3("CompilerToVM::" #name); \
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
51 GRAAL_VM_ENTRY_MARK; \
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
52
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
53 // Entry to native method implementation that calls a JNI function
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
54 // and hence cannot transition current thread to '_thread_in_vm'.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
55 #define C2V_ENTRY(result_type, name, signature) \
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
56 JNIEXPORT result_type JNICALL c2v_ ## name signature { \
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
57 TRACE_graal_3("CompilerToVM::" #name); \
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
58
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
59 #define C2V_END }
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
60
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
61 C2V_ENTRY(jbyteArray, initializeBytecode, (JNIEnv *env, jobject, jlong metaspace_method, jbyteArray result))
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
62 methodHandle method = asMethod(metaspace_method);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
63 ResourceMark rm;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
64
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
65 int code_size = method->code_size();
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
66 jbyte* reconstituted_code = NULL;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
67
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
68 // replace all breakpoints - must be done before undoing any rewriting
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
69 if (method->number_of_breakpoints() > 0) {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
70 reconstituted_code = NEW_RESOURCE_ARRAY(jbyte, code_size);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
71 memcpy(reconstituted_code, (jbyte *) method->code_base(), code_size);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
72 BreakpointInfo* bp = InstanceKlass::cast(method->method_holder())->breakpoints();
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
73 for (; bp != NULL; bp = bp->next()) {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
74 if (bp->match(method())) {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
75 jbyte code = bp->orig_bytecode();
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
76 reconstituted_code[bp->bci()] = code;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
77 }
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
78 }
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
79 }
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
80
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
81 // iterate over all bytecodes and replace non-Java bytecodes
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
82 if (RewriteBytecodes || RewriteFrequentPairs || InstanceKlass::cast(method->method_holder())->is_rewritten()) {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
83 if (reconstituted_code == NULL) {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
84 reconstituted_code = NEW_RESOURCE_ARRAY(jbyte, code_size);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
85 memcpy(reconstituted_code, (jbyte *) method->code_base(), code_size);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
86 }
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
87 BytecodeStream s(method);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
88 while(!s.is_last_bytecode()) {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
89 s.next();
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
90 Bytecodes::Code opcode = s.raw_code();
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
91 if (!Bytecodes::is_java_code(opcode)) {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
92 jbyte original_opcode = Bytecodes::java_code(opcode);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
93 int bci = s.bci();
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
94 reconstituted_code[bci] = original_opcode;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
95 if (opcode == Bytecodes::_fast_aldc_w) {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
96 int cpci = Bytes::get_native_u2((address) reconstituted_code + bci + 1);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
97 int i = method->constants()->object_to_cp_index(cpci);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
98 assert(i < method->constants()->length(), "sanity check");
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
99 Bytes::put_Java_u2((address) reconstituted_code + bci + 1, (u2)i);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
100 } else if (opcode == Bytecodes::_fast_aldc) {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
101 int cpci = reconstituted_code[bci + 1] & 0xff;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
102 int i = method->constants()->object_to_cp_index(cpci);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
103 assert(i < method->constants()->length(), "sanity check");
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
104 reconstituted_code[bci + 1] = (jbyte)i;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
105 }
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
106 }
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
107 }
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
108 }
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
109
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
110 if (reconstituted_code == NULL) {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
111 env->SetByteArrayRegion(result, 0, code_size, (jbyte *) method->code_base());
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
112 } else {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
113 env->SetByteArrayRegion(result, 0, code_size, reconstituted_code);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
114 }
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
115
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
116 return result;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
117 C2V_END
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
118
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
119 C2V_VMENTRY(jstring, getSignature, (JNIEnv *env, jobject, jlong metaspace_method))
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
120 Method* method = asMethod(metaspace_method);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
121 assert(method != NULL && method->signature() != NULL, "signature required");
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
122 return VmIds::toString<jstring>(method->signature(), THREAD);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
123 C2V_END
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
124
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
125 C2V_VMENTRY(jobjectArray, initializeExceptionHandlers, (JNIEnv *, jobject, jlong metaspace_method, jobjectArray java_handlers))
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
126 ResourceMark rm;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
127 methodHandle method = asMethod(metaspace_method);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
128 int handler_count = method->exception_table_length();
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
129 objArrayHandle array = (objArrayOop) JNIHandles::resolve(java_handlers);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
130 assert(array->length() == handler_count, "wrong length");
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
131 ExceptionTableElement* handlers = handler_count == 0 ? NULL : method->exception_table_start();
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
132
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
133 for (int i = 0; i < handler_count; i++) {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
134 ExceptionTableElement* handler = handlers + i;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
135 Handle entry = array->obj_at(i);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
136 assert(!entry.is_null(), "entry should not be null");
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
137 ExceptionHandler::set_startBCI(entry, handler->start_pc);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
138 ExceptionHandler::set_endBCI(entry, handler->end_pc);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
139 ExceptionHandler::set_handlerBCI(entry, handler->handler_pc);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
140 int catch_class_index = handler->catch_type_index;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
141 ExceptionHandler::set_catchTypeCPI(entry, catch_class_index);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
142
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
143 if (catch_class_index == 0) {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
144 ExceptionHandler::set_catchType(entry, NULL);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
145 } else {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
146 ConstantPool* cp = InstanceKlass::cast(method->method_holder())->constants();
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
147 KlassHandle loading_klass = method->method_holder();
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
148 Handle catch_class = GraalCompiler::get_JavaType(cp, catch_class_index, loading_klass, CHECK_NULL);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
149 if (catch_class->klass() == HotSpotResolvedObjectType::klass() && java_lang_Class::as_Klass(HotSpotResolvedObjectType::javaMirror(catch_class)) == SystemDictionary::Throwable_klass()) {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
150 ExceptionHandler::set_catchType(entry, NULL);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
151 ExceptionHandler::set_catchTypeCPI(entry, 0);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
152 } else {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
153 ExceptionHandler::set_catchType(entry, catch_class());
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
154 }
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
155 }
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
156 array->obj_at_put(i, entry());
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
157 }
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
158
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
159 return (jobjectArray) JNIHandles::make_local(array());
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
160 C2V_END
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
161
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
162 C2V_VMENTRY(jint, hasBalancedMonitors, (JNIEnv *, jobject, jlong metaspace_method))
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
163
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
164 // Analyze the method to see if monitors are used properly.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
165 methodHandle method(THREAD, asMethod(metaspace_method));
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
166 assert(method->has_monitor_bytecodes(), "should have checked this");
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
167
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
168 // Check to see if a previous compilation computed the monitor-matching analysis.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
169 if (method->guaranteed_monitor_matching()) {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
170 return true;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
171 }
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
172
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
173 {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
174 EXCEPTION_MARK;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
175 ResourceMark rm(THREAD);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
176 GeneratePairingInfo gpi(method);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
177 gpi.compute_map(CATCH);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
178 if (!gpi.monitor_safe()) {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
179 return false;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
180 }
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
181 method->set_guaranteed_monitor_matching();
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
182 }
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
183 return true;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
184 C2V_END
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
185
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
186 C2V_VMENTRY(jlong, getMetaspaceMethod, (JNIEnv *, jobject, jobject reflection_method_handle, jobject resultHolder))
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
187 oop reflection_method = JNIHandles::resolve(reflection_method_handle);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
188 oop reflection_holder = java_lang_reflect_Method::clazz(reflection_method);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
189 int slot = java_lang_reflect_Method::slot(reflection_method);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
190 Klass* holder = java_lang_Class::as_Klass(reflection_holder);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
191 methodHandle method = InstanceKlass::cast(holder)->method_with_idnum(slot);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
192 Handle type = GraalCompiler::createHotSpotResolvedObjectType(method, CHECK_0);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
193 objArrayOop(JNIHandles::resolve(resultHolder))->obj_at_put(0, type());
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
194 return (jlong) (address) method();
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
195 }
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
196
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
197 C2V_VMENTRY(jlong, getMetaspaceConstructor, (JNIEnv *, jobject, jobject reflection_ctor_handle, jobject resultHolder))
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
198 oop reflection_ctor = JNIHandles::resolve(reflection_ctor_handle);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
199 oop reflection_holder = java_lang_reflect_Constructor::clazz(reflection_ctor);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
200 int slot = java_lang_reflect_Constructor::slot(reflection_ctor);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
201 Klass* holder = java_lang_Class::as_Klass(reflection_holder);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
202 methodHandle method = InstanceKlass::cast(holder)->method_with_idnum(slot);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
203 Handle type = GraalCompiler::createHotSpotResolvedObjectType(method, CHECK_0);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
204 objArrayOop(JNIHandles::resolve(resultHolder))->obj_at_put(0, type());
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
205 return (jlong) (address) method();
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
206 }
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
207
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
208 C2V_VMENTRY(jobject, getJavaField, (JNIEnv *, jobject, jobject reflection_field_handle))
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
209 oop reflection_field = JNIHandles::resolve(reflection_field_handle);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
210 oop reflection_holder = java_lang_reflect_Field::clazz(reflection_field);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
211 int slot = java_lang_reflect_Field::slot(reflection_field);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
212 InstanceKlass* holder = InstanceKlass::cast(java_lang_Class::as_Klass(reflection_holder));
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
213
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
214 int offset = holder->field_offset(slot);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
215 int flags = holder->field_access_flags(slot);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
216 Symbol* field_name = holder->field_name(slot);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
217 Handle field_holder = GraalCompiler::get_JavaTypeFromClass(reflection_holder, CHECK_NULL);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
218 Handle field_type = GraalCompiler::get_JavaTypeFromClass(java_lang_reflect_Field::type(reflection_field), CHECK_NULL);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
219
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
220 Handle ret = GraalCompiler::get_JavaField(offset, flags, field_name, field_holder, field_type, CHECK_NULL);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
221 return JNIHandles::make_local(THREAD, ret());
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
222 }
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
223
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
224 C2V_VMENTRY(jlong, getUniqueConcreteMethod, (JNIEnv *, jobject, jlong metaspace_method, jobject resultHolder))
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
225 methodHandle method = asMethod(metaspace_method);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
226 KlassHandle holder = method->method_holder();
7225
31c4d9f9e922 adder better CHA support
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7222
diff changeset
227 // TODO (chaeubl): check if the following is necessary
31c4d9f9e922 adder better CHA support
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7222
diff changeset
228 //if (holder->is_interface()) {
31c4d9f9e922 adder better CHA support
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7222
diff changeset
229 // // Cannot trust interfaces. Because of:
31c4d9f9e922 adder better CHA support
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7222
diff changeset
230 // // interface I { void foo(); }
31c4d9f9e922 adder better CHA support
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7222
diff changeset
231 // // class A { public void foo() {} }
31c4d9f9e922 adder better CHA support
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7222
diff changeset
232 // // class B extends A implements I { }
31c4d9f9e922 adder better CHA support
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7222
diff changeset
233 // // class C extends B { public void foo() { } }
31c4d9f9e922 adder better CHA support
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7222
diff changeset
234 // // class D extends B { }
31c4d9f9e922 adder better CHA support
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7222
diff changeset
235 // // Would lead to identify C.foo() as the unique concrete method for I.foo() without seeing A.foo().
31c4d9f9e922 adder better CHA support
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7222
diff changeset
236 // return 0L;
31c4d9f9e922 adder better CHA support
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7222
diff changeset
237 //}
7221
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
238 methodHandle ucm;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
239 {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
240 ResourceMark rm;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
241 MutexLocker locker(Compile_lock);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
242 ucm = Dependencies::find_unique_concrete_method(holder(), method());
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
243 }
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
244
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
245 if (ucm.is_null()) {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
246 return 0L;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
247 }
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
248
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
249 Handle type = GraalCompiler::createHotSpotResolvedObjectType(ucm(), CHECK_0);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
250 objArrayOop(JNIHandles::resolve(resultHolder))->obj_at_put(0, type());
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
251 return (jlong) (address) ucm();
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
252 C2V_END
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
253
7225
31c4d9f9e922 adder better CHA support
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7222
diff changeset
254 C2V_VMENTRY(jobject, getUniqueImplementor, (JNIEnv *, jobject, jobject interface_type))
31c4d9f9e922 adder better CHA support
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7222
diff changeset
255 InstanceKlass* klass = (InstanceKlass*) asKlass(HotSpotResolvedObjectType::metaspaceKlass(interface_type));
31c4d9f9e922 adder better CHA support
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7222
diff changeset
256 assert(klass->is_interface(), "must be");
31c4d9f9e922 adder better CHA support
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7222
diff changeset
257 if (klass->nof_implementors() == 1) {
31c4d9f9e922 adder better CHA support
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7222
diff changeset
258 InstanceKlass* implementor = (InstanceKlass*) klass->implementor();
31c4d9f9e922 adder better CHA support
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7222
diff changeset
259 if (!implementor->is_abstract() && !implementor->is_interface() && implementor->is_leaf_class()) {
31c4d9f9e922 adder better CHA support
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7222
diff changeset
260 Handle type = GraalCompiler::get_JavaType(implementor, CHECK_NULL);
31c4d9f9e922 adder better CHA support
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7222
diff changeset
261 return JNIHandles::make_local(THREAD, type());
31c4d9f9e922 adder better CHA support
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7222
diff changeset
262 }
31c4d9f9e922 adder better CHA support
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7222
diff changeset
263 }
31c4d9f9e922 adder better CHA support
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7222
diff changeset
264 return NULL;
31c4d9f9e922 adder better CHA support
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7222
diff changeset
265 C2V_END
31c4d9f9e922 adder better CHA support
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7222
diff changeset
266
7221
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
267 C2V_ENTRY(jint, getInvocationCount, (JNIEnv *, jobject, jlong metaspace_method))
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
268 Method* method = asMethod(metaspace_method);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
269 return method->invocation_count();
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
270 C2V_END
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
271
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
272 C2V_VMENTRY(void, initializeMethod,(JNIEnv *, jobject, jlong metaspace_method, jobject hotspot_method))
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
273 methodHandle method = asMethod(metaspace_method);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
274 Handle name = VmIds::toString<Handle>(method->name(), CHECK);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
275 InstanceKlass::cast(HotSpotResolvedJavaMethod::klass())->initialize(CHECK);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
276 HotSpotResolvedJavaMethod::set_name(hotspot_method, name());
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
277 HotSpotResolvedJavaMethod::set_codeSize(hotspot_method, method->code_size());
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
278 HotSpotResolvedJavaMethod::set_exceptionHandlerCount(hotspot_method, method->exception_table_length());
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
279 C2V_END
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
280
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
281 C2V_VMENTRY(jboolean, isMethodCompilable,(JNIEnv *, jobject, jlong metaspace_method))
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
282 methodHandle method = asMethod(metaspace_method);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
283 return !method->is_not_compilable() && !CompilerOracle::should_not_inline(method);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
284 C2V_END
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
285
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
286 C2V_VMENTRY(void, initializeMethodData,(JNIEnv *, jobject, jlong metaspace_method_data, jobject hotspot_method_data))
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
287 MethodData* method_data = asMethodData(metaspace_method_data);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
288 HotSpotMethodData::set_normalDataSize(hotspot_method_data, method_data->data_size());
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
289 HotSpotMethodData::set_extraDataSize(hotspot_method_data, method_data->extra_data_size());
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
290 C2V_END
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
291
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
292 // ------------------------------------------------------------------
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
293 // Adjust a CounterData count to be commensurate with
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
294 // interpreter_invocation_count. If the MDO exists for
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
295 // only 25% of the time the method exists, then the
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
296 // counts in the MDO should be scaled by 4X, so that
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
297 // they can be usefully and stably compared against the
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
298 // invocation counts in methods.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
299 int scale_count(MethodData* method_data, int count) {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
300 if (count > 0) {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
301 int counter_life;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
302 int method_life = method_data->method()->interpreter_invocation_count();
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
303 int current_mileage = MethodData::mileage_of(method_data->method());
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
304 int creation_mileage = method_data->creation_mileage();
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
305 counter_life = current_mileage - creation_mileage;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
306
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
307 // counter_life due to backedge_counter could be > method_life
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
308 if (counter_life > method_life)
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
309 counter_life = method_life;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
310 if (0 < counter_life && counter_life <= method_life) {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
311 count = (int)((double)count * method_life / counter_life + 0.5);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
312 count = (count > 0) ? count : 1;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
313 }
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
314 }
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
315 return count;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
316 }
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
317
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
318 C2V_ENTRY(jint, getCompiledCodeSize, (JNIEnv *env, jobject, jlong metaspace_method))
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
319 nmethod* code = (asMethod(metaspace_method))->code();
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
320 return code == NULL ? 0 : code->insts_size();
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
321 C2V_END
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
322
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
323 C2V_VMENTRY(jobject, lookupType, (JNIEnv *env, jobject, jstring jname, jobject accessingClass, jboolean eagerResolve))
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
324 ResourceMark rm;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
325
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
326 Symbol* nameSymbol = VmIds::toSymbol(jname);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
327 Handle name = JNIHandles::resolve(jname);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
328 assert(nameSymbol != NULL, "name to symbol creation failed");
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
329
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
330 oop result = NULL;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
331 if (nameSymbol == vmSymbols::int_signature()) {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
332 result = VMToCompiler::createPrimitiveJavaType((int) T_INT, THREAD);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
333 } else if (nameSymbol == vmSymbols::long_signature()) {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
334 result = VMToCompiler::createPrimitiveJavaType((int) T_LONG, THREAD);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
335 } else if (nameSymbol == vmSymbols::bool_signature()) {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
336 result = VMToCompiler::createPrimitiveJavaType((int) T_BOOLEAN, THREAD);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
337 } else if (nameSymbol == vmSymbols::char_signature()) {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
338 result = VMToCompiler::createPrimitiveJavaType((int) T_CHAR, THREAD);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
339 } else if (nameSymbol == vmSymbols::short_signature()) {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
340 result = VMToCompiler::createPrimitiveJavaType((int) T_SHORT, THREAD);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
341 } else if (nameSymbol == vmSymbols::byte_signature()) {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
342 result = VMToCompiler::createPrimitiveJavaType((int) T_BYTE, THREAD);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
343 } else if (nameSymbol == vmSymbols::double_signature()) {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
344 result = VMToCompiler::createPrimitiveJavaType((int) T_DOUBLE, THREAD);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
345 } else if (nameSymbol == vmSymbols::float_signature()) {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
346 result = VMToCompiler::createPrimitiveJavaType((int) T_FLOAT, THREAD);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
347 } else if (nameSymbol == vmSymbols::void_signature()) {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
348 result = VMToCompiler::createPrimitiveJavaType((int) T_VOID, THREAD);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
349 } else {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
350 Klass* resolved_type = NULL;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
351 Handle classloader;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
352 Handle protectionDomain;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
353 if (JNIHandles::resolve(accessingClass) != NULL) {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
354 classloader = java_lang_Class::as_Klass(HotSpotResolvedObjectType::javaMirror(accessingClass))->class_loader();
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
355 protectionDomain = java_lang_Class::as_Klass(HotSpotResolvedObjectType::javaMirror(accessingClass))->protection_domain();
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
356 }
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
357
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
358 if (eagerResolve) {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
359 resolved_type = SystemDictionary::resolve_or_fail(nameSymbol, classloader, protectionDomain, true, THREAD);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
360 } else {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
361 resolved_type = SystemDictionary::resolve_or_null(nameSymbol, classloader, protectionDomain, THREAD);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
362 }
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
363
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
364 if (!HAS_PENDING_EXCEPTION) {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
365 if (resolved_type == NULL) {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
366 assert(!eagerResolve, "failed eager resolution should have caused an exception");
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
367 Handle type = VMToCompiler::createUnresolvedJavaType(name, THREAD);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
368 result = type();
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
369 } else {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
370 Handle type = GraalCompiler::createHotSpotResolvedObjectType(resolved_type, name, CHECK_NULL);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
371 result = type();
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
372 }
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
373 }
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
374 }
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
375
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
376 return JNIHandles::make_local(THREAD, result);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
377 C2V_END
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
378
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
379 C2V_VMENTRY(jobject, lookupConstantInPool, (JNIEnv *env, jobject, jobject type, jint index))
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
380
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
381 ConstantPool* cp = InstanceKlass::cast(java_lang_Class::as_Klass(HotSpotResolvedObjectType::javaMirror(type)))->constants();
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
382
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
383 oop result = NULL;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
384 constantTag tag = cp->tag_at(index);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
385 if (tag.is_int()) {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
386 result = VMToCompiler::createConstant(Kind::Int(), cp->int_at(index), CHECK_0);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
387 } else if (tag.is_long()) {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
388 result = VMToCompiler::createConstant(Kind::Long(), cp->long_at(index), CHECK_0);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
389 } else if (tag.is_float()) {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
390 result = VMToCompiler::createConstantFloat(cp->float_at(index), CHECK_0);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
391 } else if (tag.is_double()) {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
392 result = VMToCompiler::createConstantDouble(cp->double_at(index), CHECK_0);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
393 } else if (tag.is_string()) {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
394 oop string = NULL;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
395 if (cp->is_pseudo_string_at(index)) {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
396 int obj_index = cp->cp_to_object_index(index);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
397 string = cp->pseudo_string_at(index, obj_index);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
398 } else {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
399 string = cp->string_at(index, THREAD);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
400 if (HAS_PENDING_EXCEPTION) {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
401 CLEAR_PENDING_EXCEPTION;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
402 // TODO: Gracefully exit compilation.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
403 fatal("out of memory during compilation!");
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
404 return NULL;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
405 }
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
406 }
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
407 result = VMToCompiler::createConstantObject(string, CHECK_0);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
408 } else if (tag.is_klass() || tag.is_unresolved_klass()) {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
409 Handle type = GraalCompiler::get_JavaType(cp, index, cp->pool_holder(), CHECK_NULL);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
410 result = type();
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
411 } else if (tag.is_object()) {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
412 oop obj = cp->object_at(index);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
413 assert(obj->is_instance(), "must be an instance");
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
414 result = VMToCompiler::createConstantObject(obj, CHECK_NULL);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
415 } else {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
416 tty->print("unknown constant pool tag (%s) at cpi %d in %s: ", tag.internal_name(), index, cp->pool_holder()->name()->as_C_string());
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
417 ShouldNotReachHere();
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
418 }
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
419
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
420 return JNIHandles::make_local(THREAD, result);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
421 C2V_END
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
422
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
423 C2V_VMENTRY(jobject, lookupMethodInPool, (JNIEnv *env, jobject, jobject type, jint index, jbyte opcode))
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
424 index = GraalCompiler::to_cp_index_u2(index);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
425 constantPoolHandle cp = InstanceKlass::cast(java_lang_Class::as_Klass(HotSpotResolvedObjectType::javaMirror(type)))->constants();
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
426 instanceKlassHandle pool_holder(cp->pool_holder());
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
427
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
428 Bytecodes::Code bc = (Bytecodes::Code) (((int) opcode) & 0xFF);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
429 methodHandle method = GraalEnv::get_method_by_index(cp, index, bc, pool_holder);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
430 if (!method.is_null()) {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
431 Handle holder = GraalCompiler::get_JavaType(method->method_holder(), CHECK_NULL);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
432 return JNIHandles::make_local(THREAD, VMToCompiler::createResolvedJavaMethod(holder, method(), THREAD));
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
433 } else {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
434 // Get the method's name and signature.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
435 Handle name = VmIds::toString<Handle>(cp->name_ref_at(index), CHECK_NULL);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
436 Handle signature = VmIds::toString<Handle>(cp->signature_ref_at(index), CHECK_NULL);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
437 int holder_index = cp->klass_ref_index_at(index);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
438 Handle type = GraalCompiler::get_JavaType(cp, holder_index, cp->pool_holder(), CHECK_NULL);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
439 return JNIHandles::make_local(THREAD, VMToCompiler::createUnresolvedJavaMethod(name, signature, type, THREAD));
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
440 }
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
441 C2V_END
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
442
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
443 C2V_VMENTRY(jobject, lookupTypeInPool, (JNIEnv *env, jobject, jobject type, jint index))
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
444
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
445 ConstantPool* cp = InstanceKlass::cast(java_lang_Class::as_Klass(HotSpotResolvedObjectType::javaMirror(type)))->constants();
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
446 Handle result = GraalCompiler::get_JavaType(cp, index, cp->pool_holder(), CHECK_NULL);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
447 return JNIHandles::make_local(THREAD, result());
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
448 C2V_END
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
449
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
450 C2V_VMENTRY(void, lookupReferencedTypeInPool, (JNIEnv *env, jobject, jobject type, jint index, jbyte op))
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
451 ConstantPool* cp = InstanceKlass::cast(java_lang_Class::as_Klass(HotSpotResolvedObjectType::javaMirror(type)))->constants();
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
452 int opcode = (op & 0xFF);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
453 if (opcode != Bytecodes::_checkcast && opcode != Bytecodes::_instanceof && opcode != Bytecodes::_new && opcode != Bytecodes::_anewarray
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
454 && opcode != Bytecodes::_multianewarray && opcode != Bytecodes::_ldc && opcode != Bytecodes::_ldc_w && opcode != Bytecodes::_ldc2_w)
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
455 {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
456 index = cp->remap_instruction_operand_from_cache(GraalCompiler::to_cp_index_u2(index));
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
457 }
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
458 constantTag tag = cp->tag_at(index);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
459 if (tag.is_field_or_method()) {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
460 index = cp->uncached_klass_ref_index_at(index);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
461 tag = cp->tag_at(index);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
462 }
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
463
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
464 if (tag.is_unresolved_klass() || tag.is_klass()) {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
465 Klass* klass = cp->klass_at(index, CHECK);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
466 if (klass->oop_is_instance()) {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
467 InstanceKlass::cast(klass)->initialize(CHECK);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
468 }
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
469 }
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
470 C2V_END
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
471
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
472 C2V_VMENTRY(jobject, lookupFieldInPool, (JNIEnv *env, jobject, jobject constantPoolHolder, jint index, jbyte opcode))
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
473 ResourceMark rm;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
474
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
475 index = GraalCompiler::to_cp_index_u2(index);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
476 constantPoolHandle cp = InstanceKlass::cast(java_lang_Class::as_Klass(HotSpotResolvedObjectType::javaMirror(constantPoolHolder)))->constants();
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
477
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
478 int nt_index = cp->name_and_type_ref_index_at(index);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
479 int sig_index = cp->signature_ref_index_at(nt_index);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
480 Symbol* signature = cp->symbol_at(sig_index);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
481 int name_index = cp->name_ref_index_at(nt_index);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
482 Symbol* name = cp->symbol_at(name_index);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
483 int holder_index = cp->klass_ref_index_at(index);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
484 Handle holder = GraalCompiler::get_JavaType(cp, holder_index, cp->pool_holder(), CHECK_NULL);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
485 instanceKlassHandle holder_klass;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
486
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
487 Bytecodes::Code code = (Bytecodes::Code)(((int) opcode) & 0xFF);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
488 int offset = -1;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
489 AccessFlags flags;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
490 BasicType basic_type;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
491 if (holder->klass() == SystemDictionary::HotSpotResolvedObjectType_klass()) {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
492 FieldAccessInfo result;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
493 LinkResolver::resolve_field(result, cp, index,
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
494 Bytecodes::java_code(code),
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
495 true, false, Thread::current());
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
496 if (HAS_PENDING_EXCEPTION) {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
497 CLEAR_PENDING_EXCEPTION;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
498 } else {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
499 offset = result.field_offset();
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
500 flags = result.access_flags();
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
501 holder_klass = result.klass()();
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
502 basic_type = result.field_type();
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
503 holder = GraalCompiler::get_JavaType(holder_klass, CHECK_NULL);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
504 }
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
505 }
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
506
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
507 Handle type = GraalCompiler::get_JavaTypeFromSignature(signature, cp->pool_holder(), CHECK_NULL);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
508 Handle field_handle = GraalCompiler::get_JavaField(offset, flags.as_int(), name, holder, type, THREAD);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
509
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
510 return JNIHandles::make_local(THREAD, field_handle());
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
511 C2V_END
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
512
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
513 C2V_VMENTRY(jobject, resolveMethod, (JNIEnv *, jobject, jobject resolved_type, jstring name, jstring signature))
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
514
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
515 assert(JNIHandles::resolve(resolved_type) != NULL, "");
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
516 Klass* klass = java_lang_Class::as_Klass(HotSpotResolvedObjectType::javaMirror(resolved_type));
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
517 Symbol* name_symbol = VmIds::toSymbol(name);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
518 Symbol* signature_symbol = VmIds::toSymbol(signature);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
519 methodHandle method = klass->lookup_method(name_symbol, signature_symbol);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
520 if (method.is_null()) {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
521 if (TraceGraal >= 3) {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
522 ResourceMark rm;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
523 tty->print_cr("Could not resolve method %s %s on klass %s", name_symbol->as_C_string(), signature_symbol->as_C_string(), klass->name()->as_C_string());
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
524 }
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
525 return NULL;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
526 }
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
527 Handle holder = GraalCompiler::get_JavaType(method->method_holder(), CHECK_NULL);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
528 return JNIHandles::make_local(THREAD, VMToCompiler::createResolvedJavaMethod(holder, method(), THREAD));
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
529 C2V_END
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
530
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
531 C2V_VMENTRY(jboolean, isTypeInitialized,(JNIEnv *, jobject, jobject hotspot_klass))
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
532 Klass* klass = java_lang_Class::as_Klass(HotSpotResolvedObjectType::javaMirror(hotspot_klass));
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
533 assert(klass != NULL, "method must not be called for primitive types");
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
534 return InstanceKlass::cast(klass)->is_initialized();
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
535 C2V_END
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
536
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
537 C2V_VMENTRY(void, initializeType, (JNIEnv *, jobject, jobject hotspot_klass))
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
538 Klass* klass = java_lang_Class::as_Klass(HotSpotResolvedObjectType::javaMirror(hotspot_klass));
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
539 assert(klass != NULL, "method must not be called for primitive types");
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
540 InstanceKlass::cast(klass)->initialize(JavaThread::current());
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
541 C2V_END
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
542
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
543 C2V_VMENTRY(jobject, getInstanceFields, (JNIEnv *, jobject, jobject klass))
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
544 ResourceMark rm;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
545
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
546 instanceKlassHandle k = java_lang_Class::as_Klass(HotSpotResolvedObjectType::javaMirror(klass));
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
547 GrowableArray<Handle> fields(k->java_fields_count());
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
548
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
549 for (AllFieldStream fs(k()); !fs.done(); fs.next()) {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
550 if (!fs.access_flags().is_static()) {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
551 Handle type = GraalCompiler::get_JavaTypeFromSignature(fs.signature(), k, Thread::current());
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
552 int flags = fs.access_flags().as_int();
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
553 bool internal = fs.access_flags().is_internal();
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
554 Handle name = VmIds::toString<Handle>(fs.name(), Thread::current());
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
555 Handle field = VMToCompiler::createJavaField(JNIHandles::resolve(klass), name, type, fs.offset(), flags, internal, Thread::current());
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
556 fields.append(field());
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
557 }
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
558 }
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
559 objArrayHandle field_array = oopFactory::new_objArray(SystemDictionary::HotSpotResolvedJavaField_klass(), fields.length(), CHECK_NULL);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
560 for (int i = 0; i < fields.length(); ++i) {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
561 field_array->obj_at_put(i, fields.at(i)());
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
562 }
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
563 return JNIHandles::make_local(field_array());
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
564 C2V_END
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
565
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
566 C2V_VMENTRY(jlong, getMaxCallTargetOffset, (JNIEnv *env, jobject, jlong stub))
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
567 address target_addr = (address) stub;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
568 if (target_addr != 0x0) {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
569 int64_t off_low = (int64_t)target_addr - ((int64_t)CodeCache::low_bound() + sizeof(int));
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
570 int64_t off_high = (int64_t)target_addr - ((int64_t)CodeCache::high_bound() + sizeof(int));
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
571 return MAX2(ABS(off_low), ABS(off_high));
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
572 }
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
573 return -1;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
574 C2V_END
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
575
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
576 C2V_VMENTRY(jobject, getResolvedType, (JNIEnv *env, jobject, jobject javaClass))
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
577 oop java_mirror = JNIHandles::resolve(javaClass);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
578 assert(java_mirror != NULL, "argument to CompilerToVM.getResolvedType must not be NULL");
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
579 Handle type = GraalCompiler::get_JavaTypeFromClass(java_mirror, CHECK_NULL);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
580 return JNIHandles::make_local(THREAD, type());
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
581 C2V_END
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
582
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
583
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
584 // helpers used to set fields in the HotSpotVMConfig object
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
585 jfieldID getFieldID(JNIEnv* env, jobject obj, const char* name, const char* sig) {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
586 jfieldID id = env->GetFieldID(env->GetObjectClass(obj), name, sig);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
587 if (id == NULL) {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
588 fatal(err_msg("field not found: %s (%s)", name, sig));
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
589 }
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
590 return id;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
591 }
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
592
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
593 BasicType basicTypes[] = { T_BOOLEAN, T_BYTE, T_SHORT, T_CHAR, T_INT, T_FLOAT, T_LONG, T_DOUBLE, T_OBJECT };
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
594 int basicTypeCount = sizeof(basicTypes) / sizeof(BasicType);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
595
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
596 C2V_ENTRY(void, initializeConfiguration, (JNIEnv *env, jobject, jobject config))
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
597
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
598 #define set_boolean(name, value) do { env->SetBooleanField(config, getFieldID(env, config, name, "Z"), value); } while (0)
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
599 #define set_int(name, value) do { env->SetIntField(config, getFieldID(env, config, name, "I"), value); } while (0)
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
600 #define set_long(name, value) do { env->SetLongField(config, getFieldID(env, config, name, "J"), value); } while (0)
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
601 #define set_object(name, value) do { env->SetObjectField(config, getFieldID(env, config, name, "Ljava/lang/Object;"), value); } while (0)
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
602 #define set_int_array(name, value) do { env->SetObjectField(config, getFieldID(env, config, name, "[I"), value); } while (0)
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
603
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
604 guarantee(HeapWordSize == sizeof(char*), "Graal assumption that HeadWordSize == machine word size is wrong");
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
605 #ifdef _WIN64
7222
720925633b3a fixes after merge
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7221
diff changeset
606 set_boolean("windowsOs", true);
7221
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
607 #else
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
608 set_boolean("windowsOs", false);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
609 #endif
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
610 set_boolean("verifyOops", VerifyOops);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
611 set_boolean("useFastLocking", UseFastLocking);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
612 set_boolean("useFastNewObjectArray", UseFastNewObjectArray);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
613 set_boolean("useBiasedLocking", UseBiasedLocking);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
614 set_boolean("useFastNewTypeArray", UseFastNewTypeArray);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
615 set_boolean("useTLAB", UseTLAB);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
616 set_int("codeEntryAlignment", CodeEntryAlignment);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
617 set_int("vmPageSize", os::vm_page_size());
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
618 set_int("stackShadowPages", StackShadowPages);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
619 set_int("hubOffset", oopDesc::klass_offset_in_bytes());
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
620 set_int("markOffset", oopDesc::mark_offset_in_bytes());
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
621 set_int("prototypeMarkWordOffset", in_bytes(Klass::prototype_header_offset()));
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
622 set_int("superCheckOffsetOffset", in_bytes(Klass::super_check_offset_offset()));
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
623 set_int("secondarySuperCacheOffset", in_bytes(Klass::secondary_super_cache_offset()));
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
624 set_int("secondarySupersOffset", in_bytes(Klass::secondary_supers_offset()));
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
625 set_int("subklassOffset", in_bytes(Klass::subklass_offset()));
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
626 set_int("nextSiblingOffset", in_bytes(Klass::next_sibling_offset()));
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
627 set_int("arrayLengthOffset", arrayOopDesc::length_offset_in_bytes());
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
628 set_int("klassStateOffset", in_bytes(InstanceKlass::init_state_offset()));
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
629 set_int("klassStateFullyInitialized", (int)InstanceKlass::fully_initialized);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
630 set_int("threadTlabTopOffset", in_bytes(JavaThread::tlab_top_offset()));
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
631 set_int("threadTlabEndOffset", in_bytes(JavaThread::tlab_end_offset()));
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
632 set_int("threadObjectOffset", in_bytes(JavaThread::threadObj_offset()));
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
633 set_int("osThreadOffset", in_bytes(JavaThread::osthread_offset()));
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
634 set_int("osThreadInterruptedOffset", in_bytes(OSThread::interrupted_offset()));
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
635 set_int("unlockedMask", (int) markOopDesc::unlocked_value);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
636 set_int("biasedLockMaskInPlace", (int) markOopDesc::biased_lock_mask_in_place);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
637 set_int("ageMaskInPlace", (int) markOopDesc::age_mask_in_place);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
638 set_int("epochMaskInPlace", (int) markOopDesc::epoch_mask_in_place);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
639 set_int("biasedLockPattern", (int) markOopDesc::biased_lock_pattern);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
640 set_int("methodMaxLocalsOffset", in_bytes(Method::size_of_locals_offset()));
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
641 set_int("methodMaxStackOffset", in_bytes(Method::max_stack_offset()));
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
642 set_int("extraStackEntries", Method::extra_stack_entries());
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
643 set_int("methodAccessFlagsOffset", in_bytes(Method::access_flags_offset()));
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
644 set_int("klassHasFinalizerFlag", JVM_ACC_HAS_FINALIZER);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
645 set_int("threadExceptionOopOffset", in_bytes(JavaThread::exception_oop_offset()));
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
646 set_int("threadExceptionPcOffset", in_bytes(JavaThread::exception_pc_offset()));
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
647 set_long("safepointPollingAddress", (jlong)(os::get_polling_page() + (SafepointPollOffset % os::vm_page_size())));
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
648 set_boolean("isPollingPageFar", Assembler::is_polling_page_far());
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
649 set_int("classMirrorOffset", in_bytes(Klass::java_mirror_offset()));
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
650 set_int("runtimeCallStackSize", (jint)frame::arg_reg_save_area_bytes);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
651 set_int("klassModifierFlagsOffset", in_bytes(Klass::modifier_flags_offset()));
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
652 set_int("klassAccessFlagsOffset", in_bytes(Klass::access_flags_offset()));
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
653 set_int("klassOffset", java_lang_Class::klass_offset_in_bytes());
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
654 set_int("graalMirrorInClassOffset", java_lang_Class::graal_mirror_offset_in_bytes());
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
655 set_int("klassLayoutHelperOffset", in_bytes(Klass::layout_helper_offset()));
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
656 set_int("klassSuperKlassOffset", in_bytes(Klass::super_offset()));
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
657 set_int("methodDataOffset", in_bytes(Method::method_data_offset()));
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
658 set_int("nmethodEntryOffset", nmethod::verified_entry_point_offset());
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
659 set_int("methodCompiledEntryOffset", in_bytes(Method::from_compiled_offset()));
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
660 set_int("basicLockSize", sizeof(BasicLock));
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
661 set_int("basicLockDisplacedHeaderOffset", BasicLock::displaced_header_offset_in_bytes());
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
662 set_int("uninitializedIdentityHashCodeValue", markOopDesc::no_hash);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
663 set_int("identityHashCodeShift", markOopDesc::hash_shift);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
664
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
665 set_int("arrayKlassLayoutHelperIdentifier", 0x80000000);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
666 assert((Klass::_lh_array_tag_obj_value & Klass::_lh_array_tag_type_value & 0x80000000) != 0, "obj_array and type_array must have first bit set");
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
667 set_int("arrayKlassComponentMirrorOffset", in_bytes(ArrayKlass::component_mirror_offset()));
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
668
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
669 set_int("metaspaceArrayLengthOffset", Array<Klass*>::length_offset_in_bytes());
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
670 set_int("metaspaceArrayBaseOffset", Array<Klass*>::base_offset_in_bytes());
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
671 set_int("methodDataOopDataOffset", in_bytes(MethodData::data_offset()));
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
672 set_int("methodDataOopTrapHistoryOffset", in_bytes(MethodData::trap_history_offset()));
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
673 set_int("dataLayoutHeaderSize", DataLayout::header_size_in_bytes());
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
674 set_int("dataLayoutTagOffset", in_bytes(DataLayout::tag_offset()));
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
675 set_int("dataLayoutFlagsOffset", in_bytes(DataLayout::flags_offset()));
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
676 set_int("dataLayoutBCIOffset", in_bytes(DataLayout::bci_offset()));
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
677 set_int("dataLayoutCellsOffset", in_bytes(DataLayout::cell_offset(0)));
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
678 set_int("dataLayoutCellSize", DataLayout::cell_size);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
679 set_int("bciProfileWidth", BciProfileWidth);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
680 set_int("typeProfileWidth", TypeProfileWidth);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
681
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
682 set_int("tlabAlignmentReserve", (int32_t)ThreadLocalAllocBuffer::alignment_reserve());
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
683 set_long("tlabIntArrayMarkWord", (intptr_t)markOopDesc::prototype()->copy_set_hash(0x2));
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
684 set_long("heapTopAddress", (jlong)(address) Universe::heap()->top_addr());
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
685 set_long("heapEndAddress", (jlong)(address) Universe::heap()->end_addr());
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
686 set_int("threadTlabStartOffset", in_bytes(JavaThread::tlab_start_offset()));
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
687 set_int("threadTlabSizeOffset", in_bytes(JavaThread::tlab_size_offset()));
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
688 set_int("threadAllocatedBytesOffset", in_bytes(JavaThread::allocated_bytes_offset()));
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
689 set_int("tlabSlowAllocationsOffset", in_bytes(JavaThread::tlab_slow_allocations_offset()));
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
690 set_int("tlabFastRefillWasteOffset", in_bytes(JavaThread::tlab_fast_refill_waste_offset()));
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
691 set_int("tlabNumberOfRefillsOffset", in_bytes(JavaThread::tlab_number_of_refills_offset()));
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
692 set_int("tlabRefillWasteLimitOffset", in_bytes(JavaThread::tlab_refill_waste_limit_offset()));
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
693 set_int("tlabRefillWasteIncrement", (int32_t) ThreadLocalAllocBuffer::refill_waste_limit_increment());
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
694 set_int("klassInstanceSizeOffset", in_bytes(Klass::layout_helper_offset()));
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
695 set_boolean("tlabStats", TLABStats);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
696 set_boolean("inlineContiguousAllocationSupported", !CMSIncrementalMode && Universe::heap()->supports_inline_contig_alloc());
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
697
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
698 set_long("arrayPrototypeMarkWord", (intptr_t)markOopDesc::prototype());
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
699 set_int("layoutHelperLog2ElementSizeShift", Klass::_lh_log2_element_size_shift);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
700 set_int("layoutHelperLog2ElementSizeMask", Klass::_lh_log2_element_size_mask);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
701 set_int("layoutHelperElementTypeShift", Klass::_lh_element_type_shift);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
702 set_int("layoutHelperElementTypeMask", Klass::_lh_element_type_mask);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
703 set_int("layoutHelperHeaderSizeShift", Klass::_lh_header_size_shift);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
704 set_int("layoutHelperHeaderSizeMask", Klass::_lh_header_size_mask);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
705 set_int("layoutHelperOffset", in_bytes(Klass::layout_helper_offset()));
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
706
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
707 set_long("debugStub", VmIds::addStub((address)warning));
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
708 set_long("instanceofStub", VmIds::addStub(GraalRuntime::entry_for(GraalRuntime::graal_slow_subtype_check_id)));
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
709 set_long("newInstanceStub", VmIds::addStub(GraalRuntime::entry_for(GraalRuntime::graal_new_instance_id)));
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
710 set_long("newArrayStub", VmIds::addStub(GraalRuntime::entry_for(GraalRuntime::graal_new_array_id)));
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
711 set_long("newMultiArrayStub", VmIds::addStub(GraalRuntime::entry_for(GraalRuntime::graal_new_multi_array_id)));
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
712 set_long("identityHashCodeStub", VmIds::addStub(GraalRuntime::entry_for(GraalRuntime::graal_identity_hash_code_id)));
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
713 set_long("threadIsInterruptedStub", VmIds::addStub(GraalRuntime::entry_for(GraalRuntime::graal_thread_is_interrupted_id)));
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
714 set_long("inlineCacheMissStub", VmIds::addStub(SharedRuntime::get_ic_miss_stub()));
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
715 set_long("handleExceptionStub", VmIds::addStub(GraalRuntime::entry_for(GraalRuntime::graal_handle_exception_nofpu_id)));
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
716 set_long("handleDeoptStub", VmIds::addStub(SharedRuntime::deopt_blob()->unpack()));
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
717 set_long("monitorEnterStub", VmIds::addStub(GraalRuntime::entry_for(GraalRuntime::graal_monitorenter_id)));
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
718 set_long("monitorExitStub", VmIds::addStub(GraalRuntime::entry_for(GraalRuntime::graal_monitorexit_id)));
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
719 set_long("verifyOopStub", VmIds::addStub(GraalRuntime::entry_for(GraalRuntime::graal_verify_oop_id)));
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
720 set_long("vmErrorStub", VmIds::addStub(GraalRuntime::entry_for(GraalRuntime::graal_vm_error_id)));
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
721 set_long("deoptimizeStub", VmIds::addStub(SharedRuntime::deopt_blob()->uncommon_trap()));
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
722 set_long("unwindExceptionStub", VmIds::addStub(GraalRuntime::entry_for(GraalRuntime::graal_unwind_exception_call_id)));
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
723 set_long("osrMigrationEndStub", VmIds::addStub(GraalRuntime::entry_for(GraalRuntime::graal_OSR_migration_end_id)));
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
724 set_long("registerFinalizerStub", VmIds::addStub(GraalRuntime::entry_for(GraalRuntime::graal_register_finalizer_id)));
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
725 set_long("setDeoptInfoStub", VmIds::addStub(GraalRuntime::entry_for(GraalRuntime::graal_set_deopt_info_id)));
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
726 set_long("createNullPointerExceptionStub", VmIds::addStub(GraalRuntime::entry_for(GraalRuntime::graal_create_null_pointer_exception_id)));
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
727 set_long("createOutOfBoundsExceptionStub", VmIds::addStub(GraalRuntime::entry_for(GraalRuntime::graal_create_out_of_bounds_exception_id)));
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
728 set_long("javaTimeMillisStub", VmIds::addStub(CAST_FROM_FN_PTR(address, os::javaTimeMillis)));
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
729 set_long("javaTimeNanosStub", VmIds::addStub(CAST_FROM_FN_PTR(address, os::javaTimeNanos)));
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
730 set_long("arithmeticFremStub", VmIds::addStub(GraalRuntime::entry_for(GraalRuntime::graal_arithmetic_frem_id)));
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
731 set_long("arithmeticDremStub", VmIds::addStub(GraalRuntime::entry_for(GraalRuntime::graal_arithmetic_drem_id)));
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
732 set_long("arithmeticSinStub", VmIds::addStub(CAST_FROM_FN_PTR(address, SharedRuntime::dsin)));
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
733 set_long("arithmeticCosStub", VmIds::addStub(CAST_FROM_FN_PTR(address, SharedRuntime::dcos)));
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
734 set_long("arithmeticTanStub", VmIds::addStub(CAST_FROM_FN_PTR(address, SharedRuntime::dtan)));
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
735 set_long("logPrimitiveStub", VmIds::addStub(GraalRuntime::entry_for(GraalRuntime::graal_log_primitive_id)));
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
736 set_long("logObjectStub", VmIds::addStub(GraalRuntime::entry_for(GraalRuntime::graal_log_object_id)));
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
737 set_long("logPrintfStub", VmIds::addStub(GraalRuntime::entry_for(GraalRuntime::graal_log_printf_id)));
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
738
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
739
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
740 BarrierSet* bs = Universe::heap()->barrier_set();
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
741 switch (bs->kind()) {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
742 case BarrierSet::CardTableModRef:
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
743 case BarrierSet::CardTableExtension: {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
744 jlong base = (jlong)((CardTableModRefBS*)bs)->byte_map_base;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
745 assert(base != 0, "unexpected byte_map_base");
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
746 set_long("cardtableStartAddress", base);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
747 set_int("cardtableShift", CardTableModRefBS::card_shift);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
748 break;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
749 }
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
750 case BarrierSet::ModRef:
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
751 case BarrierSet::Other:
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
752 set_long("cardtableStartAddress", 0);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
753 set_int("cardtableShift", 0);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
754 // No post barriers
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
755 break;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
756 #ifndef SERIALGC
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
757 case BarrierSet::G1SATBCT:
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
758 case BarrierSet::G1SATBCTLogging:
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
759 #endif // SERIALGC
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
760 default:
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
761 ShouldNotReachHere();
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
762 break;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
763 }
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
764
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
765 set_int("arrayClassElementOffset", in_bytes(ObjArrayKlass::element_klass_offset()));
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
766
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
767 #undef set_boolean
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
768 #undef set_int
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
769 #undef set_long
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
770 #undef set_object
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
771 #undef set_int_array
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
772
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
773 C2V_END
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
774
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
775 C2V_VMENTRY(jint, installCode0, (JNIEnv *jniEnv, jobject, jobject compResult, jobject installed_code, jobject info))
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
776 ResourceMark rm;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
777 HandleMark hm;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
778 Handle compResultHandle = JNIHandles::resolve(compResult);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
779 nmethod* nm = NULL;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
780 methodHandle method = getMethodFromHotSpotMethod(HotSpotCompilationResult::method(compResult));
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
781 Handle installed_code_handle = JNIHandles::resolve(installed_code);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
782 GraalEnv::CodeInstallResult result;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
783 CodeInstaller installer(compResultHandle, method, result, nm, installed_code_handle);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
784
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
785 if (result != GraalEnv::ok) {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
786 assert(nm == NULL, "should be");
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
787 } else {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
788 if (info != NULL) {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
789 arrayOop codeCopy = oopFactory::new_byteArray(nm->code_size(), CHECK_0);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
790 memcpy(codeCopy->base(T_BYTE), nm->code_begin(), nm->code_size());
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
791 HotSpotCodeInfo::set_code(info, codeCopy);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
792 HotSpotCodeInfo::set_start(info, (jlong) nm->code_begin());
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
793 }
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
794
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
795 if (!installed_code_handle.is_null()) {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
796 assert(installed_code_handle->is_a(HotSpotInstalledCode::klass()), "wrong type");
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
797 HotSpotInstalledCode::set_nmethod(installed_code_handle, (jlong) nm);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
798 HotSpotInstalledCode::set_method(installed_code_handle, HotSpotCompilationResult::method(compResult));
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
799 assert(nm == NULL || !installed_code_handle->is_scavengable() || nm->on_scavenge_root_list(), "nm should be scavengable if installed_code is scavengable");
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
800 }
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
801 }
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
802 return result;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
803 C2V_END
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
804
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
805 C2V_VMENTRY(jobject, disassembleNative, (JNIEnv *jniEnv, jobject, jbyteArray code, jlong start_address))
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
806 ResourceMark rm;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
807 HandleMark hm;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
808
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
809 stringStream(st);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
810 arrayOop code_oop = (arrayOop) JNIHandles::resolve(code);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
811 int len = code_oop->length();
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
812 address begin = (address) code_oop->base(T_BYTE);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
813 address end = begin + len;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
814 Disassembler::decode(begin, end, &st);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
815
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
816 Handle result = java_lang_String::create_from_platform_dependent_str(st.as_string(), CHECK_NULL);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
817 return JNIHandles::make_local(result());
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
818 C2V_END
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
819
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
820 C2V_VMENTRY(jobject, getStackTraceElement, (JNIEnv *env, jobject, jlong metaspace_method, int bci))
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
821 ResourceMark rm;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
822 HandleMark hm;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
823
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
824 methodHandle method = asMethod(metaspace_method);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
825 oop element = java_lang_StackTraceElement::create(method, bci, CHECK_NULL);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
826 return JNIHandles::make_local(element);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
827 C2V_END
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
828
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
829 C2V_VMENTRY(jobject, executeCompiledMethodVarargs, (JNIEnv *env, jobject, jlong metaspace_method, jlong metaspace_nmethod, jobject args))
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
830 ResourceMark rm;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
831 HandleMark hm;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
832
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
833 assert(metaspace_method != 0, "just checking");
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
834 methodHandle mh = asMethod(metaspace_method);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
835 Symbol* signature = mh->signature();
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
836 JavaCallArguments jca;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
837
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
838 JavaArgumentUnboxer jap(signature, &jca, (arrayOop) JNIHandles::resolve(args), mh->is_static());
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
839 JavaValue result(jap.get_ret_type());
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
840
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
841 nmethod* nm = (nmethod*) (address) metaspace_nmethod;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
842 if (nm == NULL || !nm->is_alive()) {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
843 THROW_0(vmSymbols::MethodInvalidatedException());
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
844 }
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
845
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
846 JavaCalls::call(&result, mh, nm, &jca, CHECK_NULL);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
847
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
848 if (jap.get_ret_type() == T_VOID) {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
849 return NULL;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
850 } else if (jap.get_ret_type() == T_OBJECT || jap.get_ret_type() == T_ARRAY) {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
851 return JNIHandles::make_local((oop) result.get_jobject());
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
852 } else {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
853 oop o = java_lang_boxing_object::create(jap.get_ret_type(), (jvalue *) result.get_value_addr(), CHECK_NULL);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
854 return JNIHandles::make_local(o);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
855 }
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
856 C2V_END
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
857
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
858 C2V_VMENTRY(jobject, executeCompiledMethod, (JNIEnv *env, jobject, jlong metaspace_method, jlong metaspace_nmethod, jobject arg1, jobject arg2, jobject arg3))
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
859 ResourceMark rm;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
860 HandleMark hm;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
861
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
862 methodHandle method = asMethod(metaspace_method);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
863 assert(!method.is_null(), "just checking");
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
864 JavaValue result(T_OBJECT);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
865 JavaCallArguments args;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
866 args.push_oop(JNIHandles::resolve(arg1));
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
867 args.push_oop(JNIHandles::resolve(arg2));
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
868 args.push_oop(JNIHandles::resolve(arg3));
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
869
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
870 nmethod* nm = (nmethod*) (address) metaspace_nmethod;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
871 if (nm == NULL || !nm->is_alive()) {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
872 THROW_0(vmSymbols::MethodInvalidatedException());
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
873 }
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
874
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
875 JavaCalls::call(&result, method, nm, &args, CHECK_NULL);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
876
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
877 return JNIHandles::make_local((oop) result.get_jobject());
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
878 C2V_END
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
879
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
880 C2V_VMENTRY(jint, getVtableEntryOffset, (JNIEnv *, jobject, jlong metaspace_method))
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
881
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
882 Method* method = asMethod(metaspace_method);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
883 assert(!InstanceKlass::cast(method->method_holder())->is_interface(), "vtableEntryOffset cannot be called for interface methods");
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
884 assert(InstanceKlass::cast(method->method_holder())->is_linked(), "vtableEntryOffset cannot be called is holder is not linked");
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
885
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
886 // get entry offset in words
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
887 int vtable_entry_offset = InstanceKlass::vtable_start_offset() + method->vtable_index() * vtableEntry::size();
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
888 // convert to bytes
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
889 vtable_entry_offset = vtable_entry_offset * wordSize + vtableEntry::method_offset_in_bytes();
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
890
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
891 return vtable_entry_offset;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
892 C2V_END
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
893
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
894 C2V_VMENTRY(jobject, getDeoptedLeafGraphIds, (JNIEnv *, jobject))
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
895
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
896 // the contract for this method is as follows:
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
897 // returning null: no deopted leaf graphs
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
898 // returning array (size > 0): the ids of the deopted leaf graphs
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
899 // returning array (size == 0): there was an overflow, the compiler needs to clear its cache completely
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
900
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
901 oop array = GraalCompiler::instance()->dump_deopted_leaf_graphs(CHECK_NULL);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
902 return JNIHandles::make_local(array);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
903 C2V_END
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
904
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
905 C2V_VMENTRY(jobject, decodePC, (JNIEnv *, jobject, jlong pc))
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
906 stringStream(st);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
907 CodeBlob* blob = CodeCache::find_blob_unsafe((void*) pc);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
908 if (blob == NULL) {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
909 st.print("[unidentified pc]");
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
910 } else {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
911 st.print(blob->name());
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
912
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
913 nmethod* nm = blob->as_nmethod_or_null();
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
914 if (nm != NULL && nm->method() != NULL) {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
915 st.print(" %s.", nm->method()->method_holder()->external_name());
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
916 nm->method()->name()->print_symbol_on(&st);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
917 st.print(" @ %d", pc - (jlong) nm->entry_point());
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
918 }
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
919 }
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
920 Handle result = java_lang_String::create_from_platform_dependent_str(st.as_string(), CHECK_NULL);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
921 return JNIHandles::make_local(result());
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
922 C2V_END
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
923
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
924
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
925 #define CC (char*) /*cast a literal from (const char*)*/
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
926 #define FN_PTR(f) CAST_FROM_FN_PTR(void*, &(c2v_ ## f))
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
927
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
928 #define RESOLVED_TYPE "Lcom/oracle/graal/api/meta/ResolvedJavaType;"
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
929 #define TYPE "Lcom/oracle/graal/api/meta/JavaType;"
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
930 #define METHOD "Lcom/oracle/graal/api/meta/JavaMethod;"
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
931 #define FIELD "Lcom/oracle/graal/api/meta/JavaField;"
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
932 #define SIGNATURE "Lcom/oracle/graal/api/meta/Signature;"
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
933 #define CONSTANT_POOL "Lcom/oracle/graal/api/meta/ConstantPool;"
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
934 #define CONSTANT "Lcom/oracle/graal/api/meta/Constant;"
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
935 #define KIND "Lcom/oracle/graal/api/meta/Kind;"
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
936 #define RUNTIME_CALL "Lcom/oracle/graal/api/code/RuntimeCall;"
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
937 #define EXCEPTION_HANDLERS "[Lcom/oracle/graal/api/meta/ExceptionHandler;"
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
938 #define REFLECT_METHOD "Ljava/lang/reflect/Method;"
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
939 #define REFLECT_CONSTRUCTOR "Ljava/lang/reflect/Constructor;"
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
940 #define REFLECT_FIELD "Ljava/lang/reflect/Field;"
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
941 #define STRING "Ljava/lang/String;"
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
942 #define OBJECT "Ljava/lang/Object;"
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
943 #define CLASS "Ljava/lang/Class;"
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
944 #define STACK_TRACE_ELEMENT "Ljava/lang/StackTraceElement;"
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
945 #define HS_RESOLVED_TYPE "Lcom/oracle/graal/hotspot/meta/HotSpotResolvedObjectType;"
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
946 #define HS_RESOLVED_METHOD "Lcom/oracle/graal/hotspot/meta/HotSpotResolvedJavaMethod;"
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
947 #define HS_RESOLVED_FIELD "Lcom/oracle/graal/hotspot/meta/HotSpotResolvedJavaField;"
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
948 #define HS_COMP_RESULT "Lcom/oracle/graal/hotspot/HotSpotCompilationResult;"
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
949 #define HS_CONFIG "Lcom/oracle/graal/hotspot/HotSpotVMConfig;"
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
950 #define HS_METHOD "Lcom/oracle/graal/hotspot/meta/HotSpotMethod;"
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
951 #define HS_INSTALLED_CODE "Lcom/oracle/graal/hotspot/meta/HotSpotInstalledCode;"
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
952 #define HS_CODE_INFO "Lcom/oracle/graal/hotspot/meta/HotSpotCodeInfo;"
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
953 #define METHOD_DATA "Lcom/oracle/graal/hotspot/meta/HotSpotMethodData;"
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
954 #define METASPACE_METHOD "J"
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
955 #define METASPACE_METHOD_DATA "J"
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
956 #define NMETHOD "J"
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
957
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
958 JNINativeMethod CompilerToVM_methods[] = {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
959 {CC"initializeBytecode", CC"("METASPACE_METHOD"[B)[B", FN_PTR(initializeBytecode)},
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
960 {CC"getSignature", CC"("METASPACE_METHOD")"STRING, FN_PTR(getSignature)},
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
961 {CC"initializeExceptionHandlers", CC"("METASPACE_METHOD EXCEPTION_HANDLERS")"EXCEPTION_HANDLERS, FN_PTR(initializeExceptionHandlers)},
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
962 {CC"hasBalancedMonitors", CC"("METASPACE_METHOD")Z", FN_PTR(hasBalancedMonitors)},
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
963 {CC"getUniqueConcreteMethod", CC"("METASPACE_METHOD"["HS_RESOLVED_TYPE")"METASPACE_METHOD, FN_PTR(getUniqueConcreteMethod)},
7225
31c4d9f9e922 adder better CHA support
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7222
diff changeset
964 {CC"getUniqueImplementor", CC"("HS_RESOLVED_TYPE")"RESOLVED_TYPE, FN_PTR(getUniqueImplementor)},
7221
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
965 {CC"getStackTraceElement", CC"("METASPACE_METHOD"I)"STACK_TRACE_ELEMENT, FN_PTR(getStackTraceElement)},
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
966 {CC"initializeMethod", CC"("METASPACE_METHOD HS_RESOLVED_METHOD")V", FN_PTR(initializeMethod)},
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
967 {CC"initializeMethodData", CC"("METASPACE_METHOD_DATA METHOD_DATA")V", FN_PTR(initializeMethodData)},
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
968 {CC"isMethodCompilable", CC"("METASPACE_METHOD")Z", FN_PTR(isMethodCompilable)},
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
969 {CC"getInvocationCount", CC"("METASPACE_METHOD")I", FN_PTR(getInvocationCount)},
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
970 {CC"getCompiledCodeSize", CC"("METASPACE_METHOD")I", FN_PTR(getCompiledCodeSize)},
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
971 {CC"getVtableEntryOffset", CC"("METASPACE_METHOD")I", FN_PTR(getVtableEntryOffset)},
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
972 {CC"lookupType", CC"("STRING HS_RESOLVED_TYPE"Z)"TYPE, FN_PTR(lookupType)},
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
973 {CC"lookupConstantInPool", CC"("HS_RESOLVED_TYPE"I)"OBJECT, FN_PTR(lookupConstantInPool)},
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
974 {CC"lookupMethodInPool", CC"("HS_RESOLVED_TYPE"IB)"METHOD, FN_PTR(lookupMethodInPool)},
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
975 {CC"lookupTypeInPool", CC"("HS_RESOLVED_TYPE"I)"TYPE, FN_PTR(lookupTypeInPool)},
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
976 {CC"lookupReferencedTypeInPool", CC"("HS_RESOLVED_TYPE"IB)V", FN_PTR(lookupReferencedTypeInPool)},
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
977 {CC"lookupFieldInPool", CC"("HS_RESOLVED_TYPE"IB)"FIELD, FN_PTR(lookupFieldInPool)},
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
978 {CC"resolveMethod", CC"("HS_RESOLVED_TYPE STRING STRING")"METHOD, FN_PTR(resolveMethod)},
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
979 {CC"getInstanceFields", CC"("HS_RESOLVED_TYPE")["HS_RESOLVED_FIELD, FN_PTR(getInstanceFields)},
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
980 {CC"isTypeInitialized", CC"("HS_RESOLVED_TYPE")Z", FN_PTR(isTypeInitialized)},
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
981 {CC"initializeType", CC"("HS_RESOLVED_TYPE")V", FN_PTR(initializeType)},
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
982 {CC"getMaxCallTargetOffset", CC"(J)J", FN_PTR(getMaxCallTargetOffset)},
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
983 {CC"getResolvedType", CC"("CLASS")"RESOLVED_TYPE, FN_PTR(getResolvedType)},
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
984 {CC"getMetaspaceMethod", CC"("REFLECT_METHOD"["HS_RESOLVED_TYPE")"METASPACE_METHOD, FN_PTR(getMetaspaceMethod)},
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
985 {CC"getMetaspaceConstructor", CC"("REFLECT_CONSTRUCTOR"["HS_RESOLVED_TYPE")"METASPACE_METHOD, FN_PTR(getMetaspaceConstructor)},
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
986 {CC"getJavaField", CC"("REFLECT_FIELD")"HS_RESOLVED_FIELD, FN_PTR(getJavaField)},
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
987 {CC"initializeConfiguration", CC"("HS_CONFIG")V", FN_PTR(initializeConfiguration)},
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
988 {CC"installCode0", CC"("HS_COMP_RESULT HS_INSTALLED_CODE HS_CODE_INFO")I", FN_PTR(installCode0)},
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
989 {CC"disassembleNative", CC"([BJ)"STRING, FN_PTR(disassembleNative)},
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
990 {CC"executeCompiledMethod", CC"("METASPACE_METHOD NMETHOD OBJECT OBJECT OBJECT")"OBJECT, FN_PTR(executeCompiledMethod)},
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
991 {CC"executeCompiledMethodVarargs", CC"("METASPACE_METHOD NMETHOD "["OBJECT")"OBJECT, FN_PTR(executeCompiledMethodVarargs)},
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
992 {CC"getDeoptedLeafGraphIds", CC"()[J", FN_PTR(getDeoptedLeafGraphIds)},
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
993 {CC"decodePC", CC"(J)"STRING, FN_PTR(decodePC)},
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
994 };
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
995
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
996 int CompilerToVM_methods_count() {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
997 return sizeof(CompilerToVM_methods) / sizeof(JNINativeMethod);
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
998 }
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7220 7147
diff changeset
999