Mercurial > hg > truffle
comparison src/share/vm/c1/c1_LIRGenerator.cpp @ 6739:8a02ca5e5576
7195816: NPG: Crash in c1_ValueType - ShouldNotReachHere
Summary: C1 needs knowledge of T_METADATA at the LIR level.
Reviewed-by: kvn, coleenp
author | roland |
---|---|
date | Tue, 11 Sep 2012 16:20:57 +0200 |
parents | 044a77cd0c8b |
children | 8e47bac5643a |
comparison
equal
deleted
inserted
replaced
6738:ec98e58952b2 | 6739:8a02ca5e5576 |
---|---|
465 if (!obj->is_loaded() || PatchALot) { | 465 if (!obj->is_loaded() || PatchALot) { |
466 assert(info != NULL, "info must be set if class is not loaded"); | 466 assert(info != NULL, "info must be set if class is not loaded"); |
467 __ klass2reg_patch(NULL, r, info); | 467 __ klass2reg_patch(NULL, r, info); |
468 } else { | 468 } else { |
469 // no patching needed | 469 // no patching needed |
470 __ oop2reg(obj->constant_encoding(), r); | 470 __ metadata2reg(obj->constant_encoding(), r); |
471 } | 471 } |
472 } | 472 } |
473 | 473 |
474 | 474 |
475 void LIRGenerator::array_range_check(LIR_Opr array, LIR_Opr index, | 475 void LIRGenerator::array_range_check(LIR_Opr array, LIR_Opr index, |
953 int t = taken_count_offset; | 953 int t = taken_count_offset; |
954 taken_count_offset = not_taken_count_offset; | 954 taken_count_offset = not_taken_count_offset; |
955 not_taken_count_offset = t; | 955 not_taken_count_offset = t; |
956 } | 956 } |
957 | 957 |
958 LIR_Opr md_reg = new_register(T_OBJECT); | 958 LIR_Opr md_reg = new_register(T_METADATA); |
959 __ oop2reg(md->constant_encoding(), md_reg); | 959 __ metadata2reg(md->constant_encoding(), md_reg); |
960 | 960 |
961 LIR_Opr data_offset_reg = new_pointer_register(); | 961 LIR_Opr data_offset_reg = new_pointer_register(); |
962 __ cmove(lir_cond(cond), | 962 __ cmove(lir_cond(cond), |
963 LIR_OprFact::intptrConst(taken_count_offset), | 963 LIR_OprFact::intptrConst(taken_count_offset), |
964 LIR_OprFact::intptrConst(not_taken_count_offset), | 964 LIR_OprFact::intptrConst(not_taken_count_offset), |
1190 BasicTypeList signature; | 1190 BasicTypeList signature; |
1191 signature.append(LP64_ONLY(T_LONG) NOT_LP64(T_INT)); // thread | 1191 signature.append(LP64_ONLY(T_LONG) NOT_LP64(T_INT)); // thread |
1192 signature.append(T_OBJECT); // Method* | 1192 signature.append(T_OBJECT); // Method* |
1193 LIR_OprList* args = new LIR_OprList(); | 1193 LIR_OprList* args = new LIR_OprList(); |
1194 args->append(getThreadPointer()); | 1194 args->append(getThreadPointer()); |
1195 LIR_Opr meth = new_register(T_OBJECT); | 1195 LIR_Opr meth = new_register(T_METADATA); |
1196 __ oop2reg(method()->constant_encoding(), meth); | 1196 __ metadata2reg(method()->constant_encoding(), meth); |
1197 args->append(meth); | 1197 args->append(meth); |
1198 call_runtime(&signature, args, CAST_FROM_FN_PTR(address, SharedRuntime::dtrace_method_exit), voidType, NULL); | 1198 call_runtime(&signature, args, CAST_FROM_FN_PTR(address, SharedRuntime::dtrace_method_exit), voidType, NULL); |
1199 } | 1199 } |
1200 | 1200 |
1201 if (x->type()->is_void()) { | 1201 if (x->type()->is_void()) { |
2551 offset = md->byte_offset_of_slot(data, BranchData::not_taken_offset()); | 2551 offset = md->byte_offset_of_slot(data, BranchData::not_taken_offset()); |
2552 } else { | 2552 } else { |
2553 assert(data->is_JumpData(), "need JumpData for branches"); | 2553 assert(data->is_JumpData(), "need JumpData for branches"); |
2554 offset = md->byte_offset_of_slot(data, JumpData::taken_offset()); | 2554 offset = md->byte_offset_of_slot(data, JumpData::taken_offset()); |
2555 } | 2555 } |
2556 LIR_Opr md_reg = new_register(T_OBJECT); | 2556 LIR_Opr md_reg = new_register(T_METADATA); |
2557 __ oop2reg(md->constant_encoding(), md_reg); | 2557 __ metadata2reg(md->constant_encoding(), md_reg); |
2558 | 2558 |
2559 increment_counter(new LIR_Address(md_reg, offset, | 2559 increment_counter(new LIR_Address(md_reg, offset, |
2560 NOT_LP64(T_INT) LP64_ONLY(T_LONG)), DataLayout::counter_increment); | 2560 NOT_LP64(T_INT) LP64_ONLY(T_LONG)), DataLayout::counter_increment); |
2561 } | 2561 } |
2562 | 2562 |
2609 BasicTypeList signature; | 2609 BasicTypeList signature; |
2610 signature.append(LP64_ONLY(T_LONG) NOT_LP64(T_INT)); // thread | 2610 signature.append(LP64_ONLY(T_LONG) NOT_LP64(T_INT)); // thread |
2611 signature.append(T_OBJECT); // Method* | 2611 signature.append(T_OBJECT); // Method* |
2612 LIR_OprList* args = new LIR_OprList(); | 2612 LIR_OprList* args = new LIR_OprList(); |
2613 args->append(getThreadPointer()); | 2613 args->append(getThreadPointer()); |
2614 LIR_Opr meth = new_register(T_OBJECT); | 2614 LIR_Opr meth = new_register(T_METADATA); |
2615 __ oop2reg(method()->constant_encoding(), meth); | 2615 __ metadata2reg(method()->constant_encoding(), meth); |
2616 args->append(meth); | 2616 args->append(meth); |
2617 call_runtime(&signature, args, CAST_FROM_FN_PTR(address, SharedRuntime::dtrace_method_entry), voidType, NULL); | 2617 call_runtime(&signature, args, CAST_FROM_FN_PTR(address, SharedRuntime::dtrace_method_entry), voidType, NULL); |
2618 } | 2618 } |
2619 | 2619 |
2620 if (method()->is_synchronized()) { | 2620 if (method()->is_synchronized()) { |
3030 assert(frequency == 0 || is_power_of_2(frequency + 1), "Frequency must be x^2 - 1 or 0"); | 3030 assert(frequency == 0 || is_power_of_2(frequency + 1), "Frequency must be x^2 - 1 or 0"); |
3031 int level = _compilation->env()->comp_level(); | 3031 int level = _compilation->env()->comp_level(); |
3032 assert(level > CompLevel_simple, "Shouldn't be here"); | 3032 assert(level > CompLevel_simple, "Shouldn't be here"); |
3033 | 3033 |
3034 int offset = -1; | 3034 int offset = -1; |
3035 LIR_Opr counter_holder = new_register(T_OBJECT); | 3035 LIR_Opr counter_holder = new_register(T_METADATA); |
3036 LIR_Opr meth; | 3036 LIR_Opr meth; |
3037 if (level == CompLevel_limited_profile) { | 3037 if (level == CompLevel_limited_profile) { |
3038 offset = in_bytes(backedge ? Method::backedge_counter_offset() : | 3038 offset = in_bytes(backedge ? Method::backedge_counter_offset() : |
3039 Method::invocation_counter_offset()); | 3039 Method::invocation_counter_offset()); |
3040 __ oop2reg(method->constant_encoding(), counter_holder); | 3040 __ metadata2reg(method->constant_encoding(), counter_holder); |
3041 meth = counter_holder; | 3041 meth = counter_holder; |
3042 } else if (level == CompLevel_full_profile) { | 3042 } else if (level == CompLevel_full_profile) { |
3043 offset = in_bytes(backedge ? MethodData::backedge_counter_offset() : | 3043 offset = in_bytes(backedge ? MethodData::backedge_counter_offset() : |
3044 MethodData::invocation_counter_offset()); | 3044 MethodData::invocation_counter_offset()); |
3045 ciMethodData* md = method->method_data_or_null(); | 3045 ciMethodData* md = method->method_data_or_null(); |
3046 assert(md != NULL, "Sanity"); | 3046 assert(md != NULL, "Sanity"); |
3047 __ oop2reg(md->constant_encoding(), counter_holder); | 3047 __ metadata2reg(md->constant_encoding(), counter_holder); |
3048 meth = new_register(T_OBJECT); | 3048 meth = new_register(T_METADATA); |
3049 __ oop2reg(method->constant_encoding(), meth); | 3049 __ metadata2reg(method->constant_encoding(), meth); |
3050 } else { | 3050 } else { |
3051 ShouldNotReachHere(); | 3051 ShouldNotReachHere(); |
3052 } | 3052 } |
3053 LIR_Address* counter = new LIR_Address(counter_holder, offset, T_INT); | 3053 LIR_Address* counter = new LIR_Address(counter_holder, offset, T_INT); |
3054 LIR_Opr result = new_register(T_INT); | 3054 LIR_Opr result = new_register(T_INT); |