Mercurial > hg > truffle
comparison src/share/vm/c1x/c1x_VMEntries.cpp @ 1421:6223633ce7dd
changed VMExit/VMEntries to non-static, added eclipse c++ project, CIR interface changes
author | Lukas Stadler <lukas.stadler@oracle.com> |
---|---|
date | Fri, 23 Jul 2010 15:53:02 -0700 |
parents | 7bf6a77b9c5a |
children | 3483ec571caf |
comparison
equal
deleted
inserted
replaced
1420:44efca8a02d6 | 1421:6223633ce7dd |
---|---|
24 | 24 |
25 | 25 |
26 # include "incls/_precompiled.incl" | 26 # include "incls/_precompiled.incl" |
27 # include "incls/_c1x_VMEntries.cpp.incl" | 27 # include "incls/_c1x_VMEntries.cpp.incl" |
28 | 28 |
29 | |
29 /* | 30 /* |
30 * Class: com_sun_hotspot_c1x_VMEntries | 31 * Class: com_sun_hotspot_c1x_VMEntries |
31 * Method: RiMethod_code | 32 * Method: RiMethod_code |
32 * Signature: (Ljava/lang/Object;)[B | 33 * Signature: (Ljava/lang/Object;)[B |
33 */ | 34 */ |
34 JNIEXPORT jbyteArray JNICALL Java_com_sun_hotspot_c1x_VMEntries_RiMethod_1code(JNIEnv *env, jclass, jobject method) { | 35 JNIEXPORT jbyteArray JNICALL Java_com_sun_hotspot_c1x_VMEntries_RiMethod_1code(JNIEnv *env, jobject, jobject method) { |
35 methodOop m = (methodOop)JNIHandles::resolve(method); | 36 methodOop m = (methodOop)JNIHandles::resolve(method); |
36 int code_size = m->code_size(); | 37 int code_size = m->code_size(); |
37 jbyteArray result = env->NewByteArray(code_size); | 38 jbyteArray result = env->NewByteArray(code_size); |
38 env->SetByteArrayRegion(result, 0, code_size, (const jbyte *)m->code_base()); | 39 env->SetByteArrayRegion(result, 0, code_size, (const jbyte *)m->code_base()); |
39 return result; | 40 return result; |
42 /* | 43 /* |
43 * Class: com_sun_hotspot_c1x_VMEntries | 44 * Class: com_sun_hotspot_c1x_VMEntries |
44 * Method: RiMethod_maxStackSize | 45 * Method: RiMethod_maxStackSize |
45 * Signature: (Ljava/lang/Object;)I | 46 * Signature: (Ljava/lang/Object;)I |
46 */ | 47 */ |
47 JNIEXPORT jint JNICALL Java_com_sun_hotspot_c1x_VMEntries_RiMethod_1maxStackSize(JNIEnv *, jclass, jobject method) { | 48 JNIEXPORT jint JNICALL Java_com_sun_hotspot_c1x_VMEntries_RiMethod_1maxStackSize(JNIEnv *, jobject, jobject method) { |
48 methodOop m = (methodOop)JNIHandles::resolve(method); | 49 methodOop m = (methodOop)JNIHandles::resolve(method); |
49 return m->max_stack(); | 50 return m->max_stack(); |
50 } | 51 } |
51 | 52 |
52 /* | 53 /* |
53 * Class: com_sun_hotspot_c1x_VMEntries | 54 * Class: com_sun_hotspot_c1x_VMEntries |
54 * Method: RiMethod_maxLocals | 55 * Method: RiMethod_maxLocals |
55 * Signature: (Ljava/lang/Object;)I | 56 * Signature: (Ljava/lang/Object;)I |
56 */ | 57 */ |
57 JNIEXPORT jint JNICALL Java_com_sun_hotspot_c1x_VMEntries_RiMethod_1maxLocals(JNIEnv *, jclass, jobject method) { | 58 JNIEXPORT jint JNICALL Java_com_sun_hotspot_c1x_VMEntries_RiMethod_1maxLocals(JNIEnv *, jobject, jobject method) { |
58 methodOop m = (methodOop)JNIHandles::resolve(method); | 59 methodOop m = (methodOop)JNIHandles::resolve(method); |
59 return m->max_locals(); | 60 return m->max_locals(); |
60 } | 61 } |
61 | 62 |
62 /* | 63 /* |
63 * Class: com_sun_hotspot_c1x_VMEntries | 64 * Class: com_sun_hotspot_c1x_VMEntries |
64 * Method: RiMethod_holder | 65 * Method: RiMethod_holder |
65 * Signature: (Ljava/lang/Object;)Lcom/sun/cri/ri/RiType; | 66 * Signature: (Ljava/lang/Object;)Lcom/sun/cri/ri/RiType; |
66 */ | 67 */ |
67 JNIEXPORT jobject JNICALL Java_com_sun_hotspot_c1x_VMEntries_RiMethod_1holder(JNIEnv *, jclass, jobject method) { | 68 JNIEXPORT jobject JNICALL Java_com_sun_hotspot_c1x_VMEntries_RiMethod_1holder(JNIEnv *, jobject, jobject method) { |
68 VM_ENTRY_MARK | 69 VM_ENTRY_MARK |
69 methodOop m = (methodOop)JNIHandles::resolve(method); | 70 methodOop m = (methodOop)JNIHandles::resolve(method); |
70 klassOop k = m->method_holder(); | 71 klassOop k = m->method_holder(); |
71 return JNIHandles::make_local(Thread::current(), C1XCompiler::get_RiType(k)); | 72 return JNIHandles::make_local(Thread::current(), C1XCompiler::get_RiType(k)); |
72 } | 73 } |
74 /* | 75 /* |
75 * Class: com_sun_hotspot_c1x_VMEntries | 76 * Class: com_sun_hotspot_c1x_VMEntries |
76 * Method: RiMethod_signature | 77 * Method: RiMethod_signature |
77 * Signature: (Ljava/lang/Object;)Lcom/sun/cri/ri/RiSignature; | 78 * Signature: (Ljava/lang/Object;)Lcom/sun/cri/ri/RiSignature; |
78 */ | 79 */ |
79 JNIEXPORT jstring JNICALL Java_com_sun_hotspot_c1x_VMEntries_RiMethod_1signature(JNIEnv *env, jclass, jobject method) { | 80 JNIEXPORT jstring JNICALL Java_com_sun_hotspot_c1x_VMEntries_RiMethod_1signature(JNIEnv *env, jobject, jobject method) { |
80 methodOop m = (methodOop)JNIHandles::resolve(method); | 81 methodOop m = (methodOop)JNIHandles::resolve(method); |
81 return env->NewStringUTF(m->signature()->as_utf8()); | 82 return env->NewStringUTF(m->signature()->as_utf8()); |
82 } | 83 } |
83 | 84 |
84 /* | 85 /* |
85 * Class: com_sun_hotspot_c1x_VMEntries | 86 * Class: com_sun_hotspot_c1x_VMEntries |
86 * Method: RiMethod_name | 87 * Method: RiMethod_name |
87 * Signature: (Ljava/lang/Object;)Ljava/lang/String; | 88 * Signature: (Ljava/lang/Object;)Ljava/lang/String; |
88 */ | 89 */ |
89 JNIEXPORT jstring JNICALL Java_com_sun_hotspot_c1x_VMEntries_RiMethod_1name(JNIEnv *env, jclass, jobject method) { | 90 JNIEXPORT jstring JNICALL Java_com_sun_hotspot_c1x_VMEntries_RiMethod_1name(JNIEnv *env, jobject, jobject method) { |
90 methodOop m = (methodOop)JNIHandles::resolve(method); | 91 methodOop m = (methodOop)JNIHandles::resolve(method); |
91 return env->NewStringUTF(m->name()->as_utf8()); | 92 return env->NewStringUTF(m->name()->as_utf8()); |
92 } | 93 } |
93 | 94 |
94 /* | 95 /* |
95 * Class: com_sun_hotspot_c1x_VMEntries | 96 * Class: com_sun_hotspot_c1x_VMEntries |
96 * Method: RiSignature_lookupType | 97 * Method: RiSignature_lookupType |
97 * Signature: (Ljava/lang/String;Lcom/sun/cri/ri/RiType;)Lcom/sun/cri/ri/RiType; | 98 * Signature: (Ljava/lang/String;Lcom/sun/cri/ri/RiType;)Lcom/sun/cri/ri/RiType; |
98 */ | 99 */ |
99 JNIEXPORT jobject JNICALL Java_com_sun_hotspot_c1x_VMEntries_RiSignature_1lookupType(JNIEnv *, jclass, jstring name, jobject accessor) { | 100 JNIEXPORT jobject JNICALL Java_com_sun_hotspot_c1x_VMEntries_RiSignature_1lookupType(JNIEnv *, jobject, jstring name, jobject accessor) { |
100 VM_ENTRY_MARK | 101 VM_ENTRY_MARK |
101 klassOop k = (klassOop)JNIHandles::resolve(accessor); | 102 klassOop k = (klassOop)JNIHandles::resolve(accessor); |
102 oop n = JNIHandles::resolve_external_guard(name); | 103 oop n = JNIHandles::resolve_external_guard(name); |
103 if (n == NULL) { | 104 if (n == NULL) { |
104 THROW_MSG_(vmSymbols::java_lang_NullPointerException(), "Name must not be null.", NULL); | 105 THROW_MSG_(vmSymbols::java_lang_NullPointerException(), "Name must not be null.", NULL); |
112 /* | 113 /* |
113 * Class: com_sun_hotspot_c1x_VMEntries | 114 * Class: com_sun_hotspot_c1x_VMEntries |
114 * Method: RiSignature_symbolToString | 115 * Method: RiSignature_symbolToString |
115 * Signature: (Ljava/lang/Object;)Ljava/lang/String; | 116 * Signature: (Ljava/lang/Object;)Ljava/lang/String; |
116 */ | 117 */ |
117 JNIEXPORT jstring JNICALL Java_com_sun_hotspot_c1x_VMEntries_RiSignature_1symbolToString(JNIEnv *env, jclass, jobject symbol) { | 118 JNIEXPORT jstring JNICALL Java_com_sun_hotspot_c1x_VMEntries_RiSignature_1symbolToString(JNIEnv *env, jobject, jobject symbol) { |
118 symbolOop s = (symbolOop)JNIHandles::resolve(symbol); | 119 symbolOop s = (symbolOop)JNIHandles::resolve(symbol); |
119 return env->NewStringUTF(s->as_utf8()); | 120 return env->NewStringUTF(s->as_utf8()); |
120 } | 121 } |
121 | 122 |
122 /* | 123 /* |
123 * Class: com_sun_hotspot_c1x_VMEntries | 124 * Class: com_sun_hotspot_c1x_VMEntries |
124 * Method: RiType_javaClass | 125 * Method: RiType_javaClass |
125 * Signature: (Ljava/lang/Object;)Ljava/lang/Class; | 126 * Signature: (Ljava/lang/Object;)Ljava/lang/Class; |
126 */ | 127 */ |
127 JNIEXPORT jclass JNICALL Java_com_sun_hotspot_c1x_VMEntries_RiType_1javaClass(JNIEnv *, jclass, jobject klass) { | 128 JNIEXPORT jclass JNICALL Java_com_sun_hotspot_c1x_VMEntries_RiType_1javaClass(JNIEnv *, jobject, jobject klass) { |
128 klassOop k = (klassOop)JNIHandles::resolve(klass); | 129 klassOop k = (klassOop)JNIHandles::resolve(klass); |
129 oop result = k->klass_part()->java_mirror(); | 130 oop result = k->klass_part()->java_mirror(); |
130 return (jclass) JNIHandles::make_local(Thread::current(), result); | 131 return (jclass) JNIHandles::make_local(Thread::current(), result); |
131 } | 132 } |
132 | 133 |
133 /* | 134 /* |
134 * Class: com_sun_hotspot_c1x_VMEntries | 135 * Class: com_sun_hotspot_c1x_VMEntries |
135 * Method: RiType_name | 136 * Method: RiType_name |
136 * Signature: (Ljava/lang/Object;)Ljava/lang/String; | 137 * Signature: (Ljava/lang/Object;)Ljava/lang/String; |
137 */ | 138 */ |
138 JNIEXPORT jstring JNICALL Java_com_sun_hotspot_c1x_VMEntries_RiType_1name(JNIEnv *env, jclass, jobject klass) { | 139 JNIEXPORT jstring JNICALL Java_com_sun_hotspot_c1x_VMEntries_RiType_1name(JNIEnv *env, jobject, jobject klass) { |
139 klassOop k = (klassOop)JNIHandles::resolve(klass); | 140 klassOop k = (klassOop)JNIHandles::resolve(klass); |
140 return env->NewStringUTF(k->klass_part()->name()->as_utf8()); | 141 return env->NewStringUTF(k->klass_part()->name()->as_utf8()); |
141 } | 142 } |
142 | 143 |
143 | 144 |
144 /* | 145 /* |
145 * Class: com_sun_hotspot_c1x_VMEntries | 146 * Class: com_sun_hotspot_c1x_VMEntries |
146 * Method: RiConstantPool_lookupConstant | 147 * Method: RiConstantPool_lookupConstant |
147 * Signature: (Ljava/lang/Object;I)Ljava/lang/Object; | 148 * Signature: (Ljava/lang/Object;I)Ljava/lang/Object; |
148 */ | 149 */ |
149 JNIEXPORT jobject JNICALL Java_com_sun_hotspot_c1x_VMEntries_RiConstantPool_1lookupConstant(JNIEnv *env, jclass, jobject cpHandle, jint index) { | 150 JNIEXPORT jobject JNICALL Java_com_sun_hotspot_c1x_VMEntries_RiConstantPool_1lookupConstant(JNIEnv *env, jobject, jobject cpHandle, jint index) { |
150 | 151 |
151 VM_ENTRY_MARK; | 152 VM_ENTRY_MARK; |
152 constantPoolOop cp = (constantPoolOop)JNIHandles::resolve(cpHandle); | 153 constantPoolOop cp = (constantPoolOop)JNIHandles::resolve(cpHandle); |
153 | 154 |
154 oop result = NULL; | 155 oop result = NULL; |
204 /* | 205 /* |
205 * Class: com_sun_hotspot_c1x_VMEntries | 206 * Class: com_sun_hotspot_c1x_VMEntries |
206 * Method: RiConstantPool_lookupMethod | 207 * Method: RiConstantPool_lookupMethod |
207 * Signature: (Ljava/lang/Object;I)Lcom/sun/cri/ri/RiMethod; | 208 * Signature: (Ljava/lang/Object;I)Lcom/sun/cri/ri/RiMethod; |
208 */ | 209 */ |
209 JNIEXPORT jobject JNICALL Java_com_sun_hotspot_c1x_VMEntries_RiConstantPool_1lookupMethod(JNIEnv *env, jclass, jobject cpHandle, jint index, jbyte byteCode) { | 210 JNIEXPORT jobject JNICALL Java_com_sun_hotspot_c1x_VMEntries_RiConstantPool_1lookupMethod(JNIEnv *env, jobject, jobject cpHandle, jint index, jbyte byteCode) { |
210 VM_ENTRY_MARK; | 211 VM_ENTRY_MARK; |
211 constantPoolOop cp = (constantPoolOop)JNIHandles::resolve(cpHandle); | 212 constantPoolOop cp = (constantPoolOop)JNIHandles::resolve(cpHandle); |
212 Bytecodes::Code bc = (Bytecodes::Code)(((int)byteCode) & 0xFF); | 213 Bytecodes::Code bc = (Bytecodes::Code)(((int)byteCode) & 0xFF); |
213 ciInstanceKlass* loading_klass = (ciInstanceKlass *)CURRENT_ENV->get_object(cp->pool_holder()); | 214 ciInstanceKlass* loading_klass = (ciInstanceKlass *)CURRENT_ENV->get_object(cp->pool_holder()); |
214 ciMethod *method = CURRENT_ENV->get_method_by_index(cp, index, bc, loading_klass); | 215 ciMethod *method = CURRENT_ENV->get_method_by_index(cp, index, bc, loading_klass); |
218 /* | 219 /* |
219 * Class: com_sun_hotspot_c1x_VMEntries | 220 * Class: com_sun_hotspot_c1x_VMEntries |
220 * Method: RiConstantPool_lookupSignature | 221 * Method: RiConstantPool_lookupSignature |
221 * Signature: (Ljava/lang/Object;I)Lcom/sun/cri/ri/RiSignature; | 222 * Signature: (Ljava/lang/Object;I)Lcom/sun/cri/ri/RiSignature; |
222 */ | 223 */ |
223 JNIEXPORT jobject JNICALL Java_com_sun_hotspot_c1x_VMEntries_RiConstantPool_1lookupSignature(JNIEnv *env, jclass, jobject cpHandle, jint index) { | 224 JNIEXPORT jobject JNICALL Java_com_sun_hotspot_c1x_VMEntries_RiConstantPool_1lookupSignature(JNIEnv *env, jobject, jobject cpHandle, jint index) { |
224 fatal("currently unsupported"); | 225 fatal("currently unsupported"); |
225 return NULL; | 226 return NULL; |
226 } | 227 } |
227 | 228 |
228 /* | 229 /* |
229 * Class: com_sun_hotspot_c1x_VMEntries | 230 * Class: com_sun_hotspot_c1x_VMEntries |
230 * Method: RiConstantPool_lookupType | 231 * Method: RiConstantPool_lookupType |
231 * Signature: (Ljava/lang/Object;I)Lcom/sun/cri/ri/RiType; | 232 * Signature: (Ljava/lang/Object;I)Lcom/sun/cri/ri/RiType; |
232 */ | 233 */ |
233 JNIEXPORT jobject JNICALL Java_com_sun_hotspot_c1x_VMEntries_RiConstantPool_1lookupType(JNIEnv *env, jclass, jobject cpHandle, jint index) { | 234 JNIEXPORT jobject JNICALL Java_com_sun_hotspot_c1x_VMEntries_RiConstantPool_1lookupType(JNIEnv *env, jobject, jobject cpHandle, jint index) { |
234 VM_ENTRY_MARK; | 235 VM_ENTRY_MARK; |
235 constantPoolOop cp = (constantPoolOop)JNIHandles::resolve(cpHandle); | 236 constantPoolOop cp = (constantPoolOop)JNIHandles::resolve(cpHandle); |
236 ciInstanceKlass* loading_klass = (ciInstanceKlass *)CURRENT_ENV->get_object(cp->pool_holder()); | 237 ciInstanceKlass* loading_klass = (ciInstanceKlass *)CURRENT_ENV->get_object(cp->pool_holder()); |
237 bool is_accessible = false; | 238 bool is_accessible = false; |
238 ciKlass *klass = CURRENT_ENV->get_klass_by_index(cp, index, is_accessible, loading_klass); | 239 ciKlass *klass = CURRENT_ENV->get_klass_by_index(cp, index, is_accessible, loading_klass); |
243 /* | 244 /* |
244 * Class: com_sun_hotspot_c1x_VMEntries | 245 * Class: com_sun_hotspot_c1x_VMEntries |
245 * Method: RiConstantPool_lookupField | 246 * Method: RiConstantPool_lookupField |
246 * Signature: (Ljava/lang/Object;I)Lcom/sun/cri/ri/RiField; | 247 * Signature: (Ljava/lang/Object;I)Lcom/sun/cri/ri/RiField; |
247 */ | 248 */ |
248 JNIEXPORT jobject JNICALL Java_com_sun_hotspot_c1x_VMEntries_RiConstantPool_1lookupField(JNIEnv *env, jclass, jobject cpHandle, jint index) { | 249 JNIEXPORT jobject JNICALL Java_com_sun_hotspot_c1x_VMEntries_RiConstantPool_1lookupField(JNIEnv *env, jobject, jobject cpHandle, jint index) { |
249 VM_ENTRY_MARK; | 250 VM_ENTRY_MARK; |
250 constantPoolOop cp = (constantPoolOop)JNIHandles::resolve(cpHandle); | 251 constantPoolOop cp = (constantPoolOop)JNIHandles::resolve(cpHandle); |
251 ciInstanceKlass* loading_klass = (ciInstanceKlass *)CURRENT_ENV->get_object(cp->pool_holder()); | 252 ciInstanceKlass* loading_klass = (ciInstanceKlass *)CURRENT_ENV->get_object(cp->pool_holder()); |
252 ciField *field = CURRENT_ENV->get_field_by_index(loading_klass, index); | 253 ciField *field = CURRENT_ENV->get_field_by_index(loading_klass, index); |
253 return JNIHandles::make_local(THREAD, C1XCompiler::get_RiField(field)); | 254 return JNIHandles::make_local(THREAD, C1XCompiler::get_RiField(field)); |
256 /* | 257 /* |
257 * Class: com_sun_hotspot_c1x_VMEntries | 258 * Class: com_sun_hotspot_c1x_VMEntries |
258 * Method: findRiType | 259 * Method: findRiType |
259 * Signature: (Ljava/lang/Object;)Lcom/sun/cri/ri/RiType; | 260 * Signature: (Ljava/lang/Object;)Lcom/sun/cri/ri/RiType; |
260 */ | 261 */ |
261 JNIEXPORT jobject JNICALL Java_com_sun_hotspot_c1x_VMEntries_findRiType(JNIEnv *, jclass, jobject klass) { | 262 JNIEXPORT jobject JNICALL Java_com_sun_hotspot_c1x_VMEntries_findRiType(JNIEnv *, jobject, jobject klass) { |
262 VM_ENTRY_MARK; | 263 VM_ENTRY_MARK; |
263 klassOop o = (klassOop)JNIHandles::resolve(klass); | 264 klassOop o = (klassOop)JNIHandles::resolve(klass); |
264 return JNIHandles::make_local(THREAD, C1XCompiler::get_RiType(o)); | 265 return JNIHandles::make_local(THREAD, C1XCompiler::get_RiType(o)); |
265 } | 266 } |
266 | 267 |
267 /* | 268 /* |
268 * Class: com_sun_hotspot_c1x_VMEntries | 269 * Class: com_sun_hotspot_c1x_VMEntries |
269 * Method: RiRuntime_getConstantPool | 270 * Method: RiRuntime_getConstantPool |
270 * Signature: (Ljava/lang/Object;)Lcom/sun/cri/ri/RiConstantPool; | 271 * Signature: (Ljava/lang/Object;)Lcom/sun/cri/ri/RiConstantPool; |
271 */ | 272 */ |
272 JNIEXPORT jobject JNICALL Java_com_sun_hotspot_c1x_VMEntries_RiRuntime_1getConstantPool(JNIEnv *, jclass, jobject klass) { | 273 JNIEXPORT jobject JNICALL Java_com_sun_hotspot_c1x_VMEntries_RiRuntime_1getConstantPool(JNIEnv *, jobject, jobject klass) { |
273 VM_ENTRY_MARK; | 274 VM_ENTRY_MARK; |
274 klassOop o = (klassOop)JNIHandles::resolve(klass); | 275 klassOop o = (klassOop)JNIHandles::resolve(klass); |
275 return JNIHandles::make_local(THREAD, C1XCompiler::get_RiConstantPool(((instanceKlass*)o->klass_part())->constants())); | 276 return JNIHandles::make_local(THREAD, C1XCompiler::get_RiConstantPool(((instanceKlass*)o->klass_part())->constants())); |
276 } | 277 } |
277 | 278 |
278 /* | 279 /* |
279 * Class: com_sun_hotspot_c1x_VMEntries | 280 * Class: com_sun_hotspot_c1x_VMEntries |
280 * Method: RiType_isArrayClass | 281 * Method: RiType_isArrayClass |
281 * Signature: (Ljava/lang/Object;)Z | 282 * Signature: (Ljava/lang/Object;)Z |
282 */ | 283 */ |
283 JNIEXPORT jboolean JNICALL Java_com_sun_hotspot_c1x_VMEntries_RiType_1isArrayClass(JNIEnv *, jclass, jobject klass) { | 284 JNIEXPORT jboolean JNICALL Java_com_sun_hotspot_c1x_VMEntries_RiType_1isArrayClass(JNIEnv *, jobject, jobject klass) { |
284 klassOop o = (klassOop)JNIHandles::resolve(klass); | 285 klassOop o = (klassOop)JNIHandles::resolve(klass); |
285 o->print(); | 286 o->print(); |
286 bool result = o->klass_part()->oop_is_array(); | 287 bool result = o->klass_part()->oop_is_array(); |
287 tty->print_cr("result=%d", (int)result); | 288 tty->print_cr("result=%d", (int)result); |
288 return result; | 289 return result; |
291 /* | 292 /* |
292 * Class: com_sun_hotspot_c1x_VMEntries | 293 * Class: com_sun_hotspot_c1x_VMEntries |
293 * Method: RiType_isInstanceClass | 294 * Method: RiType_isInstanceClass |
294 * Signature: (Ljava/lang/Object;)Z | 295 * Signature: (Ljava/lang/Object;)Z |
295 */ | 296 */ |
296 JNIEXPORT jboolean JNICALL Java_com_sun_hotspot_c1x_VMEntries_RiType_1isInstanceClass(JNIEnv *, jclass, jobject klass) { | 297 JNIEXPORT jboolean JNICALL Java_com_sun_hotspot_c1x_VMEntries_RiType_1isInstanceClass(JNIEnv *, jobject, jobject klass) { |
297 klassOop o = (klassOop)JNIHandles::resolve(klass); | 298 klassOop o = (klassOop)JNIHandles::resolve(klass); |
298 return o->klass_part()->oop_is_instanceKlass(); | 299 return o->klass_part()->oop_is_instanceKlass(); |
299 } | 300 } |
300 | 301 |
301 /* | 302 /* |
302 * Class: com_sun_hotspot_c1x_VMEntries | 303 * Class: com_sun_hotspot_c1x_VMEntries |
303 * Method: RiType_isInterface | 304 * Method: RiType_isInterface |
304 * Signature: (Ljava/lang/Object;)Z | 305 * Signature: (Ljava/lang/Object;)Z |
305 */ | 306 */ |
306 JNIEXPORT jboolean JNICALL Java_com_sun_hotspot_c1x_VMEntries_RiType_1isInterface(JNIEnv *, jclass, jobject klass) { | 307 JNIEXPORT jboolean JNICALL Java_com_sun_hotspot_c1x_VMEntries_RiType_1isInterface(JNIEnv *, jobject, jobject klass) { |
307 klassOop o = (klassOop)JNIHandles::resolve(klass); | 308 klassOop o = (klassOop)JNIHandles::resolve(klass); |
308 return o->klass_part()->is_interface(); | 309 return o->klass_part()->is_interface(); |
309 } | 310 } |
310 | 311 |
311 /* | 312 /* |
312 * Class: com_sun_hotspot_c1x_VMEntries | 313 * Class: com_sun_hotspot_c1x_VMEntries |
313 * Method: RiMethod_accessFlags | 314 * Method: RiMethod_accessFlags |
314 * Signature: (Ljava/lang/Object;)I | 315 * Signature: (Ljava/lang/Object;)I |
315 */ | 316 */ |
316 JNIEXPORT jint JNICALL Java_com_sun_hotspot_c1x_VMEntries_RiMethod_1accessFlags(JNIEnv *, jclass, jobject method) { | 317 JNIEXPORT jint JNICALL Java_com_sun_hotspot_c1x_VMEntries_RiMethod_1accessFlags(JNIEnv *, jobject, jobject method) { |
317 methodOop m = (methodOop)JNIHandles::resolve(method); | 318 methodOop m = (methodOop)JNIHandles::resolve(method); |
318 return m->access_flags().as_int(); | 319 return m->access_flags().as_int(); |
319 } | 320 } |
320 | 321 |
322 | |
323 // helpers used to set fields in the HotSpotVMConfig object | |
324 jfieldID getFieldID(JNIEnv* env, jobject obj, const char* name, const char* sig) { | |
325 jfieldID id = env->GetFieldID(env->GetObjectClass(obj), name, sig); | |
326 if (id == NULL) { | |
327 tty->print_cr("field not found: %s (%s)", name, sig); | |
328 assert(id != NULL, "field not found"); | |
329 } | |
330 return id; | |
331 } | |
332 | |
333 void set_boolean(JNIEnv* env, jobject obj, const char* name, bool value) { env->SetBooleanField(obj, getFieldID(env, obj, name, "Z"), value); } | |
334 void set_int(JNIEnv* env, jobject obj, const char* name, int value) { env->SetIntField(obj, getFieldID(env, obj, name, "I"), value); } | |
335 void set_long(JNIEnv* env, jobject obj, const char* name, long value) { env->SetLongField(obj, getFieldID(env, obj, name, "J"), value); } | |
336 | |
337 jboolean get_boolean(JNIEnv* env, jobject obj, const char* name) { return env->GetBooleanField(obj, getFieldID(env, obj, name, "Z")); } | |
338 jint get_int(JNIEnv* env, jobject obj, const char* name) { return env->GetIntField(obj, getFieldID(env, obj, name, "I")); } | |
339 jobject get_object(JNIEnv* env, jobject obj, const char* name) { return env->GetObjectField(obj, getFieldID(env, obj, name, "Ljava/lang/Object;")); } | |
340 jobject get_object(JNIEnv* env, jobject obj, const char* name, const char* sig) { return env->GetObjectField(obj, getFieldID(env, obj, name, sig)); } | |
341 | |
342 | |
343 // Helpful routine for computing field offsets at run time rather than hardcoding them | |
344 int compute_offset(klassOop klass_oop, const char* name, const char* sig) { | |
345 JavaThread* THREAD = JavaThread::current(); | |
346 fieldDescriptor fd; | |
347 instanceKlass* ik = instanceKlass::cast(klass_oop); | |
348 symbolOop name_symbol = SymbolTable::probe(name, (int)strlen(name)); | |
349 symbolOop signature_symbol = SymbolTable::probe(sig, (int)strlen(sig)); | |
350 if (name_symbol == NULL || signature_symbol == NULL || !ik->find_local_field(name_symbol, signature_symbol, &fd)) { | |
351 ResourceMark rm; | |
352 tty->print_cr("Invalid layout of %s at %s", ik->external_name(), name_symbol->as_C_string()); | |
353 fatal("Invalid layout of c1x4hotspot class"); | |
354 } | |
355 return fd.offset(); | |
356 } | |
357 | |
358 | |
359 class TypeHelper { | |
360 public: | |
361 jclass jniHotSpotType; | |
362 jclass jniHotSpotTargetMethod; | |
363 klassOop HotSpotType; | |
364 klassOop HotSpotTargetMethod; | |
365 int HotSpotType_klassOop; | |
366 | |
367 TypeHelper(JNIEnv* jniEnv) { | |
368 jniHotSpotType = jniEnv->FindClass("com/sun/hotspot/c1x/HotSpotType"); | |
369 jniHotSpotTargetMethod = jniEnv->FindClass("com/sun/hotspot/c1x/HotSpotTargetMethod"); | |
370 } | |
371 | |
372 void initialize() { | |
373 HotSpotType = java_lang_Class::as_klassOop(JNIHandles::resolve(jniHotSpotType)); | |
374 HotSpotTargetMethod = java_lang_Class::as_klassOop(JNIHandles::resolve(jniHotSpotTargetMethod)); | |
375 HotSpotType_klassOop = compute_offset(HotSpotType, "klassOop", "Ljava/lang/Object;"); | |
376 } | |
377 }; | |
378 | |
379 | |
380 | |
381 | |
321 /* | 382 /* |
322 * Class: com_sun_hotspot_c1x_VMEntries | 383 * Class: com_sun_hotspot_c1x_VMEntries |
323 * Method: installCode | 384 * Method: installCode |
324 * Signature: (Ljava/lang/Object;[BI)V | 385 * Signature: (Lcom/sun/hotspot/c1x/HotSpotTargetMethod;)V |
325 */ | 386 */ |
326 JNIEXPORT void JNICALL Java_com_sun_hotspot_c1x_VMEntries_installCode(JNIEnv *jniEnv, jclass, jobject method, jbyteArray code, jint frameSize) { | 387 JNIEXPORT void JNICALL Java_com_sun_hotspot_c1x_VMEntries_installCode(JNIEnv *jniEnv, jobject, jobject targetMethod) { |
327 | 388 TypeHelper types(jniEnv); |
328 methodOop m = (methodOop)JNIHandles::resolve(method); | 389 |
329 jboolean isCopy = false; | 390 methodOop m = (methodOop)JNIHandles::resolve(get_object(jniEnv, targetMethod, "methodOop")); |
330 jbyte *codeBytes = jniEnv->GetByteArrayElements(code, &isCopy); | 391 jbyteArray code = (jbyteArray)get_object(jniEnv, targetMethod, "code", "[B"); |
331 // TODO: Check if we need to disallocate? | 392 jintArray relocationOffsetsObj = (jintArray)get_object(jniEnv, targetMethod, "relocationOffsets", "[I"); |
332 int codeSize = jniEnv->GetArrayLength(code); | 393 jobjectArray relocationDataObj = (jobjectArray)get_object(jniEnv, targetMethod, "relocationData", "[Ljava/lang/Object;"); |
394 jint frameSize = get_int(jniEnv, targetMethod, "frameSize"); | |
395 | |
396 CodeOffsets offsets; | |
397 | |
398 // TODO: This is a hack.. Produce correct entries. | |
399 offsets.set_value(CodeOffsets::Exceptions, 0); | |
400 offsets.set_value(CodeOffsets::Deopt, 0); | |
401 | |
402 offsets.set_value(CodeOffsets::Entry, get_int(jniEnv, targetMethod, "unverifiedEntrypoint")); | |
403 offsets.set_value(CodeOffsets::Verified_Entry, get_int(jniEnv, targetMethod, "verifiedEntrypoint")); | |
404 | |
333 VM_ENTRY_MARK; | 405 VM_ENTRY_MARK; |
334 ciEnv *env = CURRENT_ENV; | 406 ciEnv *env = CURRENT_ENV; |
407 | |
408 types.initialize(); | |
335 | 409 |
336 env->set_oop_recorder(new OopRecorder(env->arena())); | 410 env->set_oop_recorder(new OopRecorder(env->arena())); |
337 env->set_debug_info(new DebugInformationRecorder(env->oop_recorder())); | 411 env->set_debug_info(new DebugInformationRecorder(env->oop_recorder())); |
338 env->set_dependencies(new Dependencies(env)); | 412 env->set_dependencies(new Dependencies(env)); |
339 ciMethod *ciMethodObject = (ciMethod *)env->get_object(m); | 413 ciMethod *ciMethodObject = (ciMethod *)env->get_object(m); |
340 CodeOffsets offsets; | 414 |
341 | 415 int codeSize = ((arrayOop)JNIHandles::resolve(code))->length(); |
342 // TODO: This is a hack.. Produce correct entries. | 416 int relocationCount = relocationOffsetsObj == NULL ? 0 : ((arrayOop)JNIHandles::resolve(relocationOffsetsObj))->length(); |
343 offsets.set_value(CodeOffsets::Exceptions, 0); | 417 |
344 offsets.set_value(CodeOffsets::Deopt, 0); | 418 CodeBuffer buffer("c1x nmethod", codeSize, relocationCount * relocInfo::length_limit); |
345 | 419 buffer.initialize_oop_recorder(env->oop_recorder()); |
346 CodeBuffer buffer((address)codeBytes, codeSize); | 420 |
421 // copy the code into the newly created CodeBuffer | |
422 CodeSection* instructions = buffer.insts(); | |
423 memcpy(instructions->start(), ((arrayOop)JNIHandles::resolve(code))->base(T_BYTE), codeSize); | |
424 instructions->set_end(instructions->start() + codeSize); | |
425 | |
426 if (relocationCount > 0) { | |
427 jint* relocationOffsets = (jint*)((arrayOop)JNIHandles::resolve(relocationOffsetsObj))->base(T_INT); | |
428 oop* relocationObjects = (oop*)((arrayOop)JNIHandles::resolve(relocationDataObj))->base(T_OBJECT); | |
429 | |
430 for (int i=0; i<relocationCount; i++) { | |
431 address inst = (address)instructions->start() + relocationOffsets[i]; | |
432 oop obj = relocationObjects[i]; | |
433 assert(obj != NULL, "NULL oop needn't be patched"); | |
434 | |
435 if (java_lang_boxing_object::is_instance(obj, T_LONG)) { | |
436 address operand = Assembler::locate_operand(inst, Assembler::call32_operand); | |
437 long dest = obj->long_field(java_lang_boxing_object::value_offset_in_bytes(T_LONG)); | |
438 long disp = dest - (long)(operand + 4); | |
439 assert(disp == (int) disp, "disp doesn't fit in 32 bits"); | |
440 *((int*)operand) = (int)disp; | |
441 | |
442 instructions->relocate(inst, runtime_call_Relocation::spec(), Assembler::call32_operand); | |
443 tty->print_cr("relocating (Long)"); | |
444 } else if (obj->is_a(types.HotSpotType)) { | |
445 address operand = Assembler::locate_operand(inst, Assembler::imm_operand); | |
446 | |
447 *((oop**)operand) = obj->obj_field_addr<oop>(types.HotSpotType_klassOop); | |
448 instructions->relocate(inst, oop_Relocation::spec_for_immediate(), Assembler::imm_operand); | |
449 tty->print_cr("relocating (HotSpotType)"); | |
450 } else { | |
451 tty->print_cr("unknown relocation type"); | |
452 } | |
453 } | |
454 } | |
455 | |
347 buffer.print(); | 456 buffer.print(); |
348 CodeSection *inst_section = buffer.insts(); | 457 |
349 inst_section->set_end(inst_section->start() + codeSize); | |
350 buffer.initialize_oop_recorder(env->oop_recorder()); | |
351 OopMapSet oop_map_set; | 458 OopMapSet oop_map_set; |
352 ExceptionHandlerTable handler_table; | 459 ExceptionHandlerTable handler_table; |
353 ImplicitExceptionTable inc_table; | 460 ImplicitExceptionTable inc_table; |
354 { | 461 { |
355 ThreadToNativeFromVM t((JavaThread*)THREAD); | 462 ThreadToNativeFromVM t((JavaThread*)THREAD); |
356 env->register_method(ciMethodObject, -1, &offsets, 0, &buffer, frameSize, &oop_map_set, &handler_table, &inc_table, NULL, env->comp_level(), false, false); | 463 env->register_method(ciMethodObject, -1, &offsets, 0, &buffer, frameSize, &oop_map_set, &handler_table, &inc_table, NULL, env->comp_level(), false, false); |
357 | 464 |
358 } | 465 } |
359 } | 466 } |
360 | 467 |
361 // helpers used to set fields in the HotSpotVMConfig object | |
362 #define SET_CONFIG_BOOLEAN(name, value) { jfieldID id = jniEnv->GetFieldID(klass, #name, "Z"); jniEnv->SetBooleanField(config, id, value); } | |
363 #define SET_CONFIG_INT(name, value) { jfieldID id = jniEnv->GetFieldID(klass, #name, "I"); jniEnv->SetIntField(config, id, value); } | |
364 | |
365 /* | 468 /* |
366 * Class: com_sun_hotspot_c1x_VMEntries | 469 * Class: com_sun_hotspot_c1x_VMEntries |
367 * Method: getConfiguration | 470 * Method: getConfiguration |
368 * Signature: ()Lcom/sun/hotspot/c1x/HotSpotVMConfig; | 471 * Signature: ()Lcom/sun/hotspot/c1x/HotSpotVMConfig; |
369 */ | 472 */ |
370 JNIEXPORT jobject JNICALL Java_com_sun_hotspot_c1x_VMEntries_getConfiguration(JNIEnv *jniEnv, jclass) { | 473 JNIEXPORT jobject JNICALL Java_com_sun_hotspot_c1x_VMEntries_getConfiguration(JNIEnv *env, jobject) { |
371 jclass klass = jniEnv->FindClass("com/sun/hotspot/c1x/HotSpotVMConfig"); | 474 jclass klass = env->FindClass("com/sun/hotspot/c1x/HotSpotVMConfig"); |
372 assert(klass != NULL, "HotSpot vm config class not found"); | 475 assert(klass != NULL, "HotSpot vm config class not found"); |
373 jobject config = jniEnv->AllocObject(klass); | 476 jobject config = env->AllocObject(klass); |
374 jfieldID id = jniEnv->GetFieldID(klass, "windowsOs", "Z"); | |
375 #ifdef _WIN64 | 477 #ifdef _WIN64 |
376 SET_CONFIG_BOOLEAN(windowsOs, true) | 478 set_boolean(env, config, "windowsOs", true); |
377 #else | 479 #else |
378 SET_CONFIG_BOOLEAN(windowsOs, false) | 480 set_boolean(env, config, "windowsOs", false); |
379 #endif | 481 #endif |
482 set_int(env, config, "codeEntryAlignment", CodeEntryAlignment); | |
483 set_int(env, config, "vmPageSize", os::vm_page_size()); | |
484 set_int(env, config, "stackShadowPages", StackShadowPages); | |
485 set_int(env, config, "hubOffset", oopDesc::klass_offset_in_bytes()); | |
486 set_long(env, config, "instanceofStub", (long)Runtime1::entry_for(Runtime1::slow_subtype_check_id)); | |
487 set_long(env, config, "debugStub", (long)warning); | |
380 return config; | 488 return config; |
381 } | 489 } |
382 | 490 |
383 | 491 |
384 JNINativeMethod VMEntries_methods[] = { | 492 JNINativeMethod VMEntries_methods[] = { |
387 {CC"RiMethod_maxLocals", CC"(Ljava/lang/Object;)I", FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiMethod_1maxLocals)}, | 495 {CC"RiMethod_maxLocals", CC"(Ljava/lang/Object;)I", FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiMethod_1maxLocals)}, |
388 {CC"RiMethod_holder", CC"(Ljava/lang/Object;)Lcom/sun/cri/ri/RiType;", FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiMethod_1holder)}, | 496 {CC"RiMethod_holder", CC"(Ljava/lang/Object;)Lcom/sun/cri/ri/RiType;", FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiMethod_1holder)}, |
389 {CC"RiMethod_signature", CC"(Ljava/lang/Object;)Ljava/lang/String;", FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiMethod_1signature)}, | 497 {CC"RiMethod_signature", CC"(Ljava/lang/Object;)Ljava/lang/String;", FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiMethod_1signature)}, |
390 {CC"RiMethod_name", CC"(Ljava/lang/Object;)Ljava/lang/String;", FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiMethod_1name)}, | 498 {CC"RiMethod_name", CC"(Ljava/lang/Object;)Ljava/lang/String;", FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiMethod_1name)}, |
391 {CC"RiSignature_lookupType", CC"(Ljava/lang/String;Ljava/lang/Object;)Lcom/sun/cri/ri/RiType;", FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiSignature_1lookupType)}, | 499 {CC"RiSignature_lookupType", CC"(Ljava/lang/String;Ljava/lang/Object;)Lcom/sun/cri/ri/RiType;", FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiSignature_1lookupType)}, |
500 {CC"RiSignature_symbolToString", CC"(Ljava/lang/Object;)Ljava/lang/String;", FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiSignature_1symbolToString)}, | |
392 {CC"RiType_javaClass", CC"(Ljava/lang/Object;)Ljava/lang/Class;", FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiType_1javaClass)}, | 501 {CC"RiType_javaClass", CC"(Ljava/lang/Object;)Ljava/lang/Class;", FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiType_1javaClass)}, |
393 {CC"RiType_name", CC"(Ljava/lang/Object;)Ljava/lang/String;", FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiType_1name)}, | 502 {CC"RiType_name", CC"(Ljava/lang/Object;)Ljava/lang/String;", FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiType_1name)}, |
394 {CC"RiConstantPool_lookupConstant", CC"(Ljava/lang/Object;I)Ljava/lang/Object;", FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiConstantPool_1lookupConstant)}, | 503 {CC"RiConstantPool_lookupConstant", CC"(Ljava/lang/Object;I)Ljava/lang/Object;", FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiConstantPool_1lookupConstant)}, |
395 {CC"RiConstantPool_lookupMethod", CC"(Ljava/lang/Object;IB)Lcom/sun/cri/ri/RiMethod;", FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiConstantPool_1lookupMethod)}, | 504 {CC"RiConstantPool_lookupMethod", CC"(Ljava/lang/Object;IB)Lcom/sun/cri/ri/RiMethod;", FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiConstantPool_1lookupMethod)}, |
396 {CC"RiConstantPool_lookupSignature", CC"(Ljava/lang/Object;I)Lcom/sun/cri/ri/RiSignature;", FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiConstantPool_1lookupSignature)}, | 505 {CC"RiConstantPool_lookupSignature", CC"(Ljava/lang/Object;I)Lcom/sun/cri/ri/RiSignature;", FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiConstantPool_1lookupSignature)}, |
399 {CC"RiRuntime_getConstantPool", CC"(Ljava/lang/Object;)Lcom/sun/cri/ri/RiConstantPool;", FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiRuntime_1getConstantPool)}, | 508 {CC"RiRuntime_getConstantPool", CC"(Ljava/lang/Object;)Lcom/sun/cri/ri/RiConstantPool;", FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiRuntime_1getConstantPool)}, |
400 {CC"RiType_isArrayClass", CC"(Ljava/lang/Object;)Z", FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiType_1isArrayClass)}, | 509 {CC"RiType_isArrayClass", CC"(Ljava/lang/Object;)Z", FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiType_1isArrayClass)}, |
401 {CC"RiType_isInstanceClass", CC"(Ljava/lang/Object;)Z", FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiType_1isInstanceClass)}, | 510 {CC"RiType_isInstanceClass", CC"(Ljava/lang/Object;)Z", FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiType_1isInstanceClass)}, |
402 {CC"RiType_isInterface", CC"(Ljava/lang/Object;)Z", FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiType_1isInterface)}, | 511 {CC"RiType_isInterface", CC"(Ljava/lang/Object;)Z", FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiType_1isInterface)}, |
403 {CC"RiMethod_accessFlags", CC"(Ljava/lang/Object;)I", FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiMethod_1accessFlags)}, | 512 {CC"RiMethod_accessFlags", CC"(Ljava/lang/Object;)I", FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiMethod_1accessFlags)}, |
404 {CC"installCode", CC"(Ljava/lang/Object;[BI)V", FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_installCode)}, | 513 {CC"installCode", CC"(Lcom/sun/hotspot/c1x/HotSpotTargetMethod;)V", FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_installCode)}, |
405 {CC"getConfiguration", CC"()Lcom/sun/hotspot/c1x/HotSpotVMConfig;", FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_getConfiguration)} | 514 {CC"getConfiguration", CC"()Lcom/sun/hotspot/c1x/HotSpotVMConfig;", FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_getConfiguration)} |
406 }; | 515 }; |
407 | 516 |
408 int VMEntries_methods_count() { | 517 int VMEntries_methods_count() { |
409 return sizeof(VMEntries_methods) / sizeof(JNINativeMethod); | 518 return sizeof(VMEntries_methods) / sizeof(JNINativeMethod); |