Mercurial > hg > graal-jvmci-8
comparison src/cpu/x86/vm/methodHandles_x86.cpp @ 6847:65d07d9ee446
8000263: JSR 292: signature types may appear to be unloaded
Reviewed-by: kvn, jrose
author | twisti |
---|---|
date | Mon, 08 Oct 2012 17:04:00 -0700 |
parents | 2cb2f30450c7 |
children | cd3d6a6b95d9 |
comparison
equal
deleted
inserted
replaced
6846:377508648226 | 6847:65d07d9ee446 |
---|---|
207 Register rdx_argp = rdx; // argument list ptr, live on error paths | 207 Register rdx_argp = rdx; // argument list ptr, live on error paths |
208 Register rax_temp = rax; | 208 Register rax_temp = rax; |
209 Register rcx_mh = rcx; // MH receiver; dies quickly and is recycled | 209 Register rcx_mh = rcx; // MH receiver; dies quickly and is recycled |
210 Register rbx_method = rbx; // eventual target of this invocation | 210 Register rbx_method = rbx; // eventual target of this invocation |
211 | 211 |
212 address code_start = __ pc(); | |
213 | |
214 // here's where control starts out: | 212 // here's where control starts out: |
215 __ align(CodeEntryAlignment); | 213 __ align(CodeEntryAlignment); |
216 address entry_point = __ pc(); | 214 address entry_point = __ pc(); |
217 | 215 |
218 if (VerifyMethodHandles) { | 216 if (VerifyMethodHandles) { |
249 DEBUG_ONLY(rdx_argp = noreg); | 247 DEBUG_ONLY(rdx_argp = noreg); |
250 } | 248 } |
251 | 249 |
252 // rdx_first_arg_addr is live! | 250 // rdx_first_arg_addr is live! |
253 | 251 |
254 if (TraceMethodHandles) { | 252 trace_method_handle_interpreter_entry(_masm, iid); |
255 const char* name = vmIntrinsics::name_at(iid); | |
256 if (*name == '_') name += 1; | |
257 const size_t len = strlen(name) + 50; | |
258 char* qname = NEW_C_HEAP_ARRAY(char, len, mtInternal); | |
259 const char* suffix = ""; | |
260 if (vmIntrinsics::method_for(iid) == NULL || | |
261 !vmIntrinsics::method_for(iid)->access_flags().is_public()) { | |
262 if (is_signature_polymorphic_static(iid)) | |
263 suffix = "/static"; | |
264 else | |
265 suffix = "/private"; | |
266 } | |
267 jio_snprintf(qname, len, "MethodHandle::interpreter_entry::%s%s", name, suffix); | |
268 // note: stub look for mh in rcx | |
269 trace_method_handle(_masm, qname); | |
270 } | |
271 | 253 |
272 if (iid == vmIntrinsics::_invokeBasic) { | 254 if (iid == vmIntrinsics::_invokeBasic) { |
273 generate_method_handle_dispatch(_masm, iid, rcx_mh, noreg, not_for_compiler_entry); | 255 generate_method_handle_dispatch(_masm, iid, rcx_mh, noreg, not_for_compiler_entry); |
274 | 256 |
275 } else { | 257 } else { |
283 Register rbx_member = rbx_method; // MemberName ptr; incoming method ptr is dead now | 265 Register rbx_member = rbx_method; // MemberName ptr; incoming method ptr is dead now |
284 __ pop(rax_temp); // return address | 266 __ pop(rax_temp); // return address |
285 __ pop(rbx_member); // extract last argument | 267 __ pop(rbx_member); // extract last argument |
286 __ push(rax_temp); // re-push return address | 268 __ push(rax_temp); // re-push return address |
287 generate_method_handle_dispatch(_masm, iid, rcx_recv, rbx_member, not_for_compiler_entry); | 269 generate_method_handle_dispatch(_masm, iid, rcx_recv, rbx_member, not_for_compiler_entry); |
288 } | |
289 | |
290 if (PrintMethodHandleStubs) { | |
291 address code_end = __ pc(); | |
292 tty->print_cr("--------"); | |
293 tty->print_cr("method handle interpreter entry for %s", vmIntrinsics::name_at(iid)); | |
294 Disassembler::decode(code_start, code_end); | |
295 tty->cr(); | |
296 } | 270 } |
297 | 271 |
298 return entry_point; | 272 return entry_point; |
299 } | 273 } |
300 | 274 |