< prev index next >
src/share/vm/c1/c1_CodeStubs.hpp
Print this page
*** 300,331 ****
class MonitorAccessStub: public CodeStub {
protected:
LIR_Opr _obj_reg;
LIR_Opr _lock_reg;
public:
! MonitorAccessStub(LIR_Opr obj_reg, LIR_Opr lock_reg) {
_obj_reg = obj_reg;
_lock_reg = lock_reg;
}
#ifndef PRODUCT
virtual void print_name(outputStream* out) const { out->print("MonitorAccessStub"); }
#endif // PRODUCT
};
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);
visitor->do_slow_case(_info);
}
--- 300,330 ----
class MonitorAccessStub: public CodeStub {
protected:
LIR_Opr _obj_reg;
LIR_Opr _lock_reg;
+ CodeEmitInfo* _info;
public:
! 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"); }
#endif // PRODUCT
};
class MonitorEnterStub: public MonitorAccessStub {
public:
MonitorEnterStub(LIR_Opr obj_reg, LIR_Opr lock_reg, CodeEmitInfo* info);
virtual void emit_code(LIR_Assembler* e);
virtual void visit(LIR_OpVisitState* visitor) {
visitor->do_input(_obj_reg);
visitor->do_input(_lock_reg);
visitor->do_slow_case(_info);
}
*** 339,359 ****
private:
bool _compute_lock;
int _monitor_ix;
public:
! MonitorExitStub(LIR_Opr lock_reg, bool compute_lock, int monitor_ix)
! : MonitorAccessStub(LIR_OprFact::illegalOpr, lock_reg),
_compute_lock(compute_lock), _monitor_ix(monitor_ix) { }
virtual void emit_code(LIR_Assembler* e);
virtual void visit(LIR_OpVisitState* visitor) {
assert(_obj_reg->is_illegal(), "unused");
if (_compute_lock) {
visitor->do_temp(_lock_reg);
} else {
visitor->do_input(_lock_reg);
}
}
#ifndef PRODUCT
virtual void print_name(outputStream* out) const { out->print("MonitorExitStub"); }
#endif // PRODUCT
};
--- 338,367 ----
private:
bool _compute_lock;
int _monitor_ix;
public:
! 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) {
assert(_obj_reg->is_illegal(), "unused");
if (_compute_lock) {
visitor->do_temp(_lock_reg);
} 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"); }
#endif // PRODUCT
};
< prev index next >