Mercurial > hg > truffle
comparison src/share/vm/c1/c1_GraphBuilder.cpp @ 17925:45e59fae8f2b
8041481: JVM crashes with collect_args_for_profiling
Summary: method handle call to c1 intrinsic tries to profile popped argument
Reviewed-by: kvn, twisti
author | roland |
---|---|
date | Fri, 25 Apr 2014 09:22:16 +0200 |
parents | f47fa50d9b9c |
children | dda2ae6f9557 |
comparison
equal
deleted
inserted
replaced
17923:a062c3691003 | 17925:45e59fae8f2b |
---|---|
1695 return new Values(n); | 1695 return new Values(n); |
1696 } | 1696 } |
1697 return NULL; | 1697 return NULL; |
1698 } | 1698 } |
1699 | 1699 |
1700 void GraphBuilder::check_args_for_profiling(Values* obj_args, int expected) { | |
1701 #ifdef ASSERT | |
1702 bool ignored_will_link; | |
1703 ciSignature* declared_signature = NULL; | |
1704 ciMethod* real_target = method()->get_method_at_bci(bci(), ignored_will_link, &declared_signature); | |
1705 assert(expected == obj_args->length() || real_target->is_method_handle_intrinsic(), "missed on arg?"); | |
1706 #endif | |
1707 } | |
1708 | |
1700 // Collect arguments that we want to profile in a list | 1709 // Collect arguments that we want to profile in a list |
1701 Values* GraphBuilder::collect_args_for_profiling(Values* args, ciMethod* target, bool may_have_receiver) { | 1710 Values* GraphBuilder::collect_args_for_profiling(Values* args, ciMethod* target, bool may_have_receiver) { |
1702 int start = 0; | 1711 int start = 0; |
1703 Values* obj_args = args_list_for_profiling(target, start, may_have_receiver); | 1712 Values* obj_args = args_list_for_profiling(target, start, may_have_receiver); |
1704 if (obj_args == NULL) { | 1713 if (obj_args == NULL) { |
1705 return NULL; | 1714 return NULL; |
1706 } | 1715 } |
1707 int s = obj_args->size(); | 1716 int s = obj_args->size(); |
1708 for (int i = start, j = 0; j < s; i++) { | 1717 // if called through method handle invoke, some arguments may have been popped |
1718 for (int i = start, j = 0; j < s && i < args->length(); i++) { | |
1709 if (args->at(i)->type()->is_object_kind()) { | 1719 if (args->at(i)->type()->is_object_kind()) { |
1710 obj_args->push(args->at(i)); | 1720 obj_args->push(args->at(i)); |
1711 j++; | 1721 j++; |
1712 } | 1722 } |
1713 } | 1723 } |
1714 assert(s == obj_args->length(), "missed on arg?"); | 1724 check_args_for_profiling(obj_args, s); |
1715 return obj_args; | 1725 return obj_args; |
1716 } | 1726 } |
1717 | 1727 |
1718 | 1728 |
1719 void GraphBuilder::invoke(Bytecodes::Code code) { | 1729 void GraphBuilder::invoke(Bytecodes::Code code) { |
3841 if (v->type()->is_object_kind()) { | 3851 if (v->type()->is_object_kind()) { |
3842 obj_args->push(v); | 3852 obj_args->push(v); |
3843 j++; | 3853 j++; |
3844 } | 3854 } |
3845 } | 3855 } |
3846 #ifdef ASSERT | 3856 check_args_for_profiling(obj_args, s); |
3847 { | |
3848 bool ignored_will_link; | |
3849 ciSignature* declared_signature = NULL; | |
3850 ciMethod* real_target = method()->get_method_at_bci(bci(), ignored_will_link, &declared_signature); | |
3851 assert(s == obj_args->length() || real_target->is_method_handle_intrinsic(), "missed on arg?"); | |
3852 } | |
3853 #endif | |
3854 } | 3857 } |
3855 profile_call(callee, recv, holder_known ? callee->holder() : NULL, obj_args, true); | 3858 profile_call(callee, recv, holder_known ? callee->holder() : NULL, obj_args, true); |
3856 } | 3859 } |
3857 } | 3860 } |
3858 | 3861 |