Mercurial > hg > truffle
comparison src/share/vm/runtime/frame.cpp @ 6266:1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
6984705: JSR 292 method handle creation should not go through JNI
Summary: remove assembly code for JDK 7 chained method handles
Reviewed-by: jrose, twisti, kvn, mhaupt
Contributed-by: John Rose <john.r.rose@oracle.com>, Christian Thalinger <christian.thalinger@oracle.com>, Michael Haupt <michael.haupt@oracle.com>
author | twisti |
---|---|
date | Tue, 24 Jul 2012 10:51:00 -0700 |
parents | aa3d708d67c4 |
children | 957c266d8bc5 da91efe96a93 |
comparison
equal
deleted
inserted
replaced
6241:aba91a731143 | 6266:1d7922586cf6 |
---|---|
168 _cb = CodeCache::find_blob_unsafe(_pc); | 168 _cb = CodeCache::find_blob_unsafe(_pc); |
169 | 169 |
170 } | 170 } |
171 | 171 |
172 // type testers | 172 // type testers |
173 bool frame::is_ricochet_frame() const { | 173 bool frame::is_ignored_frame() const { |
174 RicochetBlob* rcb = SharedRuntime::ricochet_blob(); | 174 return false; // FIXME: some LambdaForm frames should be ignored |
175 return (_cb == rcb && rcb != NULL && rcb->returns_to_bounce_addr(_pc)); | 175 } |
176 } | |
177 | |
178 bool frame::is_deoptimized_frame() const { | 176 bool frame::is_deoptimized_frame() const { |
179 assert(_deopt_state != unknown, "not answerable"); | 177 assert(_deopt_state != unknown, "not answerable"); |
180 return _deopt_state == is_deoptimized; | 178 return _deopt_state == is_deoptimized; |
181 } | 179 } |
182 | 180 |
346 } | 344 } |
347 | 345 |
348 frame frame::real_sender(RegisterMap* map) const { | 346 frame frame::real_sender(RegisterMap* map) const { |
349 frame result = sender(map); | 347 frame result = sender(map); |
350 while (result.is_runtime_frame() || | 348 while (result.is_runtime_frame() || |
351 result.is_ricochet_frame()) { | 349 result.is_ignored_frame()) { |
352 result = result.sender(map); | 350 result = result.sender(map); |
353 } | 351 } |
354 return result; | 352 return result; |
355 } | |
356 | |
357 frame frame::sender_for_ricochet_frame(RegisterMap* map) const { | |
358 assert(is_ricochet_frame(), ""); | |
359 return MethodHandles::ricochet_frame_sender(*this, map); | |
360 } | 353 } |
361 | 354 |
362 // Note: called by profiler - NOT for current thread | 355 // Note: called by profiler - NOT for current thread |
363 frame frame::profile_find_Java_sender_frame(JavaThread *thread) { | 356 frame frame::profile_find_Java_sender_frame(JavaThread *thread) { |
364 // If we don't recognize this frame, walk back up the stack until we do | 357 // If we don't recognize this frame, walk back up the stack until we do |
539 // (frame::interpreter_frame_sender_sp accessor is in frame_<arch>.cpp) | 532 // (frame::interpreter_frame_sender_sp accessor is in frame_<arch>.cpp) |
540 | 533 |
541 const char* frame::print_name() const { | 534 const char* frame::print_name() const { |
542 if (is_native_frame()) return "Native"; | 535 if (is_native_frame()) return "Native"; |
543 if (is_interpreted_frame()) return "Interpreted"; | 536 if (is_interpreted_frame()) return "Interpreted"; |
544 if (is_ricochet_frame()) return "Ricochet"; | |
545 if (is_compiled_frame()) { | 537 if (is_compiled_frame()) { |
546 if (is_deoptimized_frame()) return "Deoptimized"; | 538 if (is_deoptimized_frame()) return "Deoptimized"; |
547 return "Compiled"; | 539 return "Compiled"; |
548 } | 540 } |
549 if (sp() == NULL) return "Empty"; | 541 if (sp() == NULL) return "Empty"; |
726 } | 718 } |
727 } else if (_cb->is_runtime_stub()) { | 719 } else if (_cb->is_runtime_stub()) { |
728 st->print("v ~RuntimeStub::%s", ((RuntimeStub *)_cb)->name()); | 720 st->print("v ~RuntimeStub::%s", ((RuntimeStub *)_cb)->name()); |
729 } else if (_cb->is_deoptimization_stub()) { | 721 } else if (_cb->is_deoptimization_stub()) { |
730 st->print("v ~DeoptimizationBlob"); | 722 st->print("v ~DeoptimizationBlob"); |
731 } else if (_cb->is_ricochet_stub()) { | |
732 st->print("v ~RichochetBlob"); | |
733 } else if (_cb->is_exception_stub()) { | 723 } else if (_cb->is_exception_stub()) { |
734 st->print("v ~ExceptionBlob"); | 724 st->print("v ~ExceptionBlob"); |
735 } else if (_cb->is_safepoint_stub()) { | 725 } else if (_cb->is_safepoint_stub()) { |
736 st->print("v ~SafepointBlob"); | 726 st->print("v ~SafepointBlob"); |
737 } else { | 727 } else { |
991 finder.oops_do(); | 981 finder.oops_do(); |
992 } | 982 } |
993 | 983 |
994 void frame::oops_code_blob_do(OopClosure* f, CodeBlobClosure* cf, const RegisterMap* reg_map) { | 984 void frame::oops_code_blob_do(OopClosure* f, CodeBlobClosure* cf, const RegisterMap* reg_map) { |
995 assert(_cb != NULL, "sanity check"); | 985 assert(_cb != NULL, "sanity check"); |
996 if (_cb == SharedRuntime::ricochet_blob()) { | |
997 oops_ricochet_do(f, reg_map); | |
998 } | |
999 if (_cb->oop_maps() != NULL) { | 986 if (_cb->oop_maps() != NULL) { |
1000 OopMapSet::oops_do(this, reg_map, f); | 987 OopMapSet::oops_do(this, reg_map, f); |
1001 | 988 |
1002 // Preserve potential arguments for a callee. We handle this by dispatching | 989 // Preserve potential arguments for a callee. We handle this by dispatching |
1003 // on the codeblob. For c2i, we do | 990 // on the codeblob. For c2i, we do |
1010 // prevent them from being collected. However, this visit should be | 997 // prevent them from being collected. However, this visit should be |
1011 // restricted to certain phases of the collection only. The | 998 // restricted to certain phases of the collection only. The |
1012 // closure decides how it wants nmethods to be traced. | 999 // closure decides how it wants nmethods to be traced. |
1013 if (cf != NULL) | 1000 if (cf != NULL) |
1014 cf->do_code_blob(_cb); | 1001 cf->do_code_blob(_cb); |
1015 } | |
1016 | |
1017 void frame::oops_ricochet_do(OopClosure* f, const RegisterMap* map) { | |
1018 assert(is_ricochet_frame(), ""); | |
1019 MethodHandles::ricochet_frame_oops_do(*this, f, map); | |
1020 } | 1002 } |
1021 | 1003 |
1022 class CompiledArgumentOopFinder: public SignatureInfo { | 1004 class CompiledArgumentOopFinder: public SignatureInfo { |
1023 protected: | 1005 protected: |
1024 OopClosure* _f; | 1006 OopClosure* _f; |
1085 frame caller = *this; | 1067 frame caller = *this; |
1086 | 1068 |
1087 // First consult the ADLC on where it puts parameter 0 for this signature. | 1069 // First consult the ADLC on where it puts parameter 0 for this signature. |
1088 VMReg reg = SharedRuntime::name_for_receiver(); | 1070 VMReg reg = SharedRuntime::name_for_receiver(); |
1089 oop r = *caller.oopmapreg_to_location(reg, reg_map); | 1071 oop r = *caller.oopmapreg_to_location(reg, reg_map); |
1090 assert( Universe::heap()->is_in_or_null(r), "bad receiver" ); | 1072 assert(Universe::heap()->is_in_or_null(r), err_msg("bad receiver: " INTPTR_FORMAT " (" INTX_FORMAT ")", (intptr_t) r, (intptr_t) r)); |
1091 return r; | 1073 return r; |
1092 } | 1074 } |
1093 | 1075 |
1094 | 1076 |
1095 oop* frame::oopmapreg_to_location(VMReg reg, const RegisterMap* reg_map) const { | 1077 oop* frame::oopmapreg_to_location(VMReg reg, const RegisterMap* reg_map) const { |
1405 // For now just label the frame | 1387 // For now just label the frame |
1406 nmethod* nm = cb()->as_nmethod_or_null(); | 1388 nmethod* nm = cb()->as_nmethod_or_null(); |
1407 values.describe(-1, info_address, | 1389 values.describe(-1, info_address, |
1408 FormatBuffer<1024>("#%d nmethod " INTPTR_FORMAT " for native method %s", frame_no, | 1390 FormatBuffer<1024>("#%d nmethod " INTPTR_FORMAT " for native method %s", frame_no, |
1409 nm, nm->method()->name_and_sig_as_C_string()), 2); | 1391 nm, nm->method()->name_and_sig_as_C_string()), 2); |
1410 } else if (is_ricochet_frame()) { | |
1411 values.describe(-1, info_address, err_msg("#%d ricochet frame", frame_no), 2); | |
1412 } else { | 1392 } else { |
1413 // provide default info if not handled before | 1393 // provide default info if not handled before |
1414 char *info = (char *) "special frame"; | 1394 char *info = (char *) "special frame"; |
1415 if ((_cb != NULL) && | 1395 if ((_cb != NULL) && |
1416 (_cb->name() != NULL)) { | 1396 (_cb->name() != NULL)) { |