< prev index next >

src/share/vm/opto/output.cpp

Print this page

        

*** 982,1030 **** // A simplified version of Process_OopMap_Node, to handle non-safepoints. class NonSafepointEmitter { Compile* C; JVMState* _pending_jvms; ! int _pending_offset; void emit_non_safepoint(); public: NonSafepointEmitter(Compile* compile) { this->C = compile; _pending_jvms = NULL; ! _pending_offset = 0; } void observe_instruction(Node* n, int pc_offset) { if (!C->debug_info()->recording_non_safepoints()) return; Node_Notes* nn = C->node_notes_at(n->_idx); if (nn == NULL || nn->jvms() == NULL) return; if (_pending_jvms != NULL && _pending_jvms->same_calls_as(nn->jvms())) { // Repeated JVMS? Stretch it up here. ! _pending_offset = pc_offset; } else { ! if (_pending_jvms != NULL && ! _pending_offset < pc_offset) { emit_non_safepoint(); } _pending_jvms = NULL; if (pc_offset > C->debug_info()->last_pc_offset()) { // This is the only way _pending_jvms can become non-NULL: _pending_jvms = nn->jvms(); ! _pending_offset = pc_offset; } } } // Stay out of the way of real safepoints: void observe_safepoint(JVMState* jvms, int pc_offset) { if (_pending_jvms != NULL && !_pending_jvms->same_calls_as(jvms) && ! _pending_offset < pc_offset) { emit_non_safepoint(); } _pending_jvms = NULL; } --- 982,1037 ---- // A simplified version of Process_OopMap_Node, to handle non-safepoints. class NonSafepointEmitter { Compile* C; JVMState* _pending_jvms; ! int _pending_begin_offset; ! int _pending_end_offset; void emit_non_safepoint(); public: NonSafepointEmitter(Compile* compile) { this->C = compile; _pending_jvms = NULL; ! _pending_begin_offset = 0; ! _pending_end_offset = 0; } void observe_instruction(Node* n, int pc_offset) { if (!C->debug_info()->recording_non_safepoints()) return; Node_Notes* nn = C->node_notes_at(n->_idx); if (nn == NULL || nn->jvms() == NULL) return; if (_pending_jvms != NULL && _pending_jvms->same_calls_as(nn->jvms())) { // Repeated JVMS? Stretch it up here. ! _pending_end_offset = pc_offset; } else { ! if (_pending_jvms != NULL) { ! if (_pending_end_offset < pc_offset) { emit_non_safepoint(); + } else if (_pending_begin_offset < pc_offset) { + // stretch as far as possible before the conflict + _pending_end_offset = pc_offset - 1; + emit_non_safepoint(); + } } _pending_jvms = NULL; if (pc_offset > C->debug_info()->last_pc_offset()) { // This is the only way _pending_jvms can become non-NULL: _pending_jvms = nn->jvms(); ! _pending_begin_offset = _pending_end_offset = pc_offset; } } } // Stay out of the way of real safepoints: void observe_safepoint(JVMState* jvms, int pc_offset) { if (_pending_jvms != NULL && !_pending_jvms->same_calls_as(jvms) && ! _pending_end_offset < pc_offset) { emit_non_safepoint(); } _pending_jvms = NULL; }
*** 1036,1046 **** } }; void NonSafepointEmitter::emit_non_safepoint() { JVMState* youngest_jvms = _pending_jvms; ! int pc_offset = _pending_offset; // Clear it now: _pending_jvms = NULL; DebugInformationRecorder* debug_info = C->debug_info(); --- 1043,1053 ---- } }; void NonSafepointEmitter::emit_non_safepoint() { JVMState* youngest_jvms = _pending_jvms; ! int pc_offset = _pending_end_offset; // Clear it now: _pending_jvms = NULL; DebugInformationRecorder* debug_info = C->debug_info();
< prev index next >