--- old/src/share/vm/c1/c1_CodeStubs.hpp 2016-10-25 10:40:04.771774613 +0200 +++ new/src/share/vm/c1/c1_CodeStubs.hpp 2016-10-25 10:40:04.723774582 +0200 @@ -302,12 +302,15 @@ protected: LIR_Opr _obj_reg; LIR_Opr _lock_reg; + CodeEmitInfo* _info; public: - MonitorAccessStub(LIR_Opr obj_reg, LIR_Opr lock_reg) { + MonitorAccessStub(LIR_Opr obj_reg, LIR_Opr lock_reg, CodeEmitInfo* info) { _obj_reg = obj_reg; _lock_reg = lock_reg; + _info = (info != NULL) ? new CodeEmitInfo(info) : NULL; } + virtual CodeEmitInfo* info() const { return _info; } #ifndef PRODUCT virtual void print_name(outputStream* out) const { out->print("MonitorAccessStub"); } @@ -316,14 +319,10 @@ class MonitorEnterStub: public MonitorAccessStub { - private: - CodeEmitInfo* _info; - public: MonitorEnterStub(LIR_Opr obj_reg, LIR_Opr lock_reg, CodeEmitInfo* info); virtual void emit_code(LIR_Assembler* e); - virtual CodeEmitInfo* info() const { return _info; } virtual void visit(LIR_OpVisitState* visitor) { visitor->do_input(_obj_reg); visitor->do_input(_lock_reg); @@ -341,8 +340,8 @@ int _monitor_ix; public: - MonitorExitStub(LIR_Opr lock_reg, bool compute_lock, int monitor_ix) - : MonitorAccessStub(LIR_OprFact::illegalOpr, lock_reg), + MonitorExitStub(LIR_Opr lock_reg, bool compute_lock, int monitor_ix, CodeEmitInfo* info) + : MonitorAccessStub(LIR_OprFact::illegalOpr, lock_reg, info), _compute_lock(compute_lock), _monitor_ix(monitor_ix) { } virtual void emit_code(LIR_Assembler* e); virtual void visit(LIR_OpVisitState* visitor) { @@ -352,6 +351,15 @@ } else { visitor->do_input(_lock_reg); } + /* Do NOT call this, we don't need it to emit non-safepoint debug info. + * This makes the compiler assume there is a safepoint associated with + * this stub, but there's not. It causes C1 crashes in Eclipse and other + * OSGi applications. + + if (_info != NULL) { + visitor->do_slow_case(_info); + } + */ } #ifndef PRODUCT virtual void print_name(outputStream* out) const { out->print("MonitorExitStub"); }