6854812: 6.0_14-b08 crashes with a SIGSEGV

Reviewed-by: kvn, twisti
This commit is contained in:
Tom Rodriguez 2009-09-16 11:06:10 -07:00
parent 47c425506d
commit 7437f0b825
4 changed files with 29 additions and 6 deletions

View file

@ -325,10 +325,10 @@ ciTypeFlow* ciMethod::get_osr_flow_analysis(int osr_bci) {
} }
// ------------------------------------------------------------------ // ------------------------------------------------------------------
// ciMethod::liveness_at_bci // ciMethod::raw_liveness_at_bci
// //
// Which local variables are live at a specific bci? // Which local variables are live at a specific bci?
MethodLivenessResult ciMethod::liveness_at_bci(int bci) { MethodLivenessResult ciMethod::raw_liveness_at_bci(int bci) {
check_is_loaded(); check_is_loaded();
if (_liveness == NULL) { if (_liveness == NULL) {
// Create the liveness analyzer. // Create the liveness analyzer.
@ -336,7 +336,17 @@ MethodLivenessResult ciMethod::liveness_at_bci(int bci) {
_liveness = new (arena) MethodLiveness(arena, this); _liveness = new (arena) MethodLiveness(arena, this);
_liveness->compute_liveness(); _liveness->compute_liveness();
} }
MethodLivenessResult result = _liveness->get_liveness_at(bci); return _liveness->get_liveness_at(bci);
}
// ------------------------------------------------------------------
// ciMethod::liveness_at_bci
//
// Which local variables are live at a specific bci? When debugging
// will return true for all locals in some cases to improve debug
// information.
MethodLivenessResult ciMethod::liveness_at_bci(int bci) {
MethodLivenessResult result = raw_liveness_at_bci(bci);
if (CURRENT_ENV->jvmti_can_access_local_variables() || DeoptimizeALot || CompileTheWorld) { if (CURRENT_ENV->jvmti_can_access_local_variables() || DeoptimizeALot || CompileTheWorld) {
// Keep all locals live for the user's edification and amusement. // Keep all locals live for the user's edification and amusement.
result.at_put_range(0, result.size(), true); result.at_put_range(0, result.size(), true);

View file

@ -149,6 +149,12 @@ class ciMethod : public ciObject {
bool has_monitor_bytecodes() const { return _uses_monitors; } bool has_monitor_bytecodes() const { return _uses_monitors; }
bool has_balanced_monitors(); bool has_balanced_monitors();
// Returns a bitmap indicating which locals are required to be
// maintained as live for deopt. raw_liveness_at_bci is always the
// direct output of the liveness computation while liveness_at_bci
// may mark all locals as live to improve support for debugging Java
// code by maintaining the state of as many locals as possible.
MethodLivenessResult raw_liveness_at_bci(int bci);
MethodLivenessResult liveness_at_bci(int bci); MethodLivenessResult liveness_at_bci(int bci);
// Get the interpreters viewpoint on oop liveness. MethodLiveness is // Get the interpreters viewpoint on oop liveness. MethodLiveness is

View file

@ -2486,8 +2486,13 @@ void ciTypeFlow::build_loop_tree(Block* blk) {
// Assume irreducible entries need more data flow // Assume irreducible entries need more data flow
add_to_work_list(succ); add_to_work_list(succ);
} }
lp = lp->parent(); Loop* plp = lp->parent();
assert(lp != NULL, "nested loop must have parent by now"); if (plp == NULL) {
// This only happens for some irreducible cases. The parent
// will be updated during a later pass.
break;
}
lp = plp;
} }
// Merge loop tree branch for all successors. // Merge loop tree branch for all successors.

View file

@ -229,7 +229,9 @@ void Parse::load_interpreter_state(Node* osr_buf) {
} }
} }
MethodLivenessResult live_locals = method()->liveness_at_bci(osr_bci()); // Use the raw liveness computation to make sure that unexpected
// values don't propagate into the OSR frame.
MethodLivenessResult live_locals = method()->raw_liveness_at_bci(osr_bci());
if (!live_locals.is_valid()) { if (!live_locals.is_valid()) {
// Degenerate or breakpointed method. // Degenerate or breakpointed method.
C->record_method_not_compilable("OSR in empty or breakpointed method"); C->record_method_not_compilable("OSR in empty or breakpointed method");