comparison src/cpu/ppc/vm/templateInterpreter_ppc.cpp @ 17980:0bf37f737702

8032410: compiler/uncommontrap/TestStackBangRbp.java times out on Solaris-Sparc V9 Summary: make compiled code bang the stack by the worst case size of the interpreter frame at deoptimization points. Reviewed-by: twisti, kvn
author roland
date Tue, 01 Apr 2014 09:36:49 +0200
parents 63c5920a038d
children 5214669b01f2 b384ba33c9a0
comparison
equal deleted inserted replaced
17978:ad51f24671c2 17980:0bf37f737702
1326 // We must calc this exactly like in generate_fixed_frame. 1326 // We must calc this exactly like in generate_fixed_frame.
1327 // Note: This returns the conservative size assuming maximum alignment. 1327 // Note: This returns the conservative size assuming maximum alignment.
1328 int AbstractInterpreter::size_top_interpreter_activation(Method* method) { 1328 int AbstractInterpreter::size_top_interpreter_activation(Method* method) {
1329 const int max_alignment_size = 2; 1329 const int max_alignment_size = 2;
1330 const int abi_scratch = frame::abi_reg_args_size; 1330 const int abi_scratch = frame::abi_reg_args_size;
1331 return method->max_locals() + method->max_stack() + frame::interpreter_frame_monitor_size() + max_alignment_size + abi_scratch; 1331 return method->max_locals() + method->max_stack() +
1332 } 1332 frame::interpreter_frame_monitor_size() + max_alignment_size + abi_scratch;
1333 1333 }
1334 // Fills a sceletal interpreter frame generated during deoptimizations 1334
1335 // and returns the frame size in slots. 1335 // Returns number of stackElementWords needed for the interpreter frame with the
1336 // given sections.
1337 // This overestimates the stack by one slot in case of alignments.
1338 int AbstractInterpreter::size_activation(int max_stack,
1339 int temps,
1340 int extra_args,
1341 int monitors,
1342 int callee_params,
1343 int callee_locals,
1344 bool is_top_frame) {
1345 // Note: This calculation must exactly parallel the frame setup
1346 // in AbstractInterpreterGenerator::generate_method_entry.
1347 assert(Interpreter::stackElementWords == 1, "sanity");
1348 const int max_alignment_space = StackAlignmentInBytes / Interpreter::stackElementSize;
1349 const int abi_scratch = is_top_frame ? (frame::abi_reg_args_size / Interpreter::stackElementSize) :
1350 (frame::abi_minframe_size / Interpreter::stackElementSize);
1351 const int size =
1352 max_stack +
1353 (callee_locals - callee_params) +
1354 monitors * frame::interpreter_frame_monitor_size() +
1355 max_alignment_space +
1356 abi_scratch +
1357 frame::ijava_state_size / Interpreter::stackElementSize;
1358
1359 // Fixed size of an interpreter frame, align to 16-byte.
1360 return (size & -2);
1361 }
1362
1363 // Fills a sceletal interpreter frame generated during deoptimizations.
1336 // 1364 //
1337 // Parameters: 1365 // Parameters:
1338 //
1339 // interpreter_frame == NULL:
1340 // Only calculate the size of an interpreter activation, no actual layout.
1341 // Note: This calculation must exactly parallel the frame setup
1342 // in TemplateInterpreter::generate_normal_entry. But it does not
1343 // account for the SP alignment, that might further enhance the
1344 // frame size, depending on FP.
1345 // 1366 //
1346 // interpreter_frame != NULL: 1367 // interpreter_frame != NULL:
1347 // set up the method, locals, and monitors. 1368 // set up the method, locals, and monitors.
1348 // The frame interpreter_frame, if not NULL, is guaranteed to be the 1369 // The frame interpreter_frame, if not NULL, is guaranteed to be the
1349 // right size, as determined by a previous call to this method. 1370 // right size, as determined by a previous call to this method.
1357 // off the callee frame. We want to re-execute the call that called the 1378 // off the callee frame. We want to re-execute the call that called the
1358 // callee interpreted, but since the return to the interpreter would pop 1379 // callee interpreted, but since the return to the interpreter would pop
1359 // the arguments off advance the esp by dummy popframe_extra_args slots. 1380 // the arguments off advance the esp by dummy popframe_extra_args slots.
1360 // Popping off those will establish the stack layout as it was before the call. 1381 // Popping off those will establish the stack layout as it was before the call.
1361 // 1382 //
1362 int AbstractInterpreter::layout_activation(Method* method, 1383 void AbstractInterpreter::layout_activation(Method* method,
1363 int tempcount, 1384 int tempcount,
1364 int popframe_extra_args, 1385 int popframe_extra_args,
1365 int moncount, 1386 int moncount,
1366 int caller_actual_parameters, 1387 int caller_actual_parameters,
1367 int callee_param_count, 1388 int callee_param_count,
1368 int callee_locals, 1389 int callee_locals_count,
1369 frame* caller, 1390 frame* caller,
1370 frame* interpreter_frame, 1391 frame* interpreter_frame,
1371 bool is_top_frame, 1392 bool is_top_frame,
1372 bool is_bottom_frame) { 1393 bool is_bottom_frame) {
1373 1394
1374 const int max_alignment_space = 2;
1375 const int abi_scratch = is_top_frame ? (frame::abi_reg_args_size / Interpreter::stackElementSize) : 1395 const int abi_scratch = is_top_frame ? (frame::abi_reg_args_size / Interpreter::stackElementSize) :
1376 (frame::abi_minframe_size / Interpreter::stackElementSize) ; 1396 (frame::abi_minframe_size / Interpreter::stackElementSize);
1377 const int conservative_framesize_in_slots = 1397
1378 method->max_stack() + callee_locals - callee_param_count + 1398 intptr_t* locals_base = (caller->is_interpreted_frame()) ?
1379 (moncount * frame::interpreter_frame_monitor_size()) + max_alignment_space + 1399 caller->interpreter_frame_esp() + caller_actual_parameters :
1380 abi_scratch + frame::ijava_state_size / Interpreter::stackElementSize; 1400 caller->sp() + method->max_locals() - 1 + (frame::abi_minframe_size / Interpreter::stackElementSize) ;
1381 1401
1382 assert(!is_top_frame || conservative_framesize_in_slots * 8 > frame::abi_reg_args_size + frame::ijava_state_size, "frame too small"); 1402 intptr_t* monitor_base = caller->sp() - frame::ijava_state_size / Interpreter::stackElementSize ;
1383 1403 intptr_t* monitor = monitor_base - (moncount * frame::interpreter_frame_monitor_size());
1384 if (interpreter_frame == NULL) { 1404 intptr_t* esp_base = monitor - 1;
1385 // Since we don't know the exact alignment, we return the conservative size. 1405 intptr_t* esp = esp_base - tempcount - popframe_extra_args;
1386 return (conservative_framesize_in_slots & -2); 1406 intptr_t* sp = (intptr_t *) (((intptr_t) (esp_base - callee_locals_count + callee_param_count - method->max_stack()- abi_scratch)) & -StackAlignmentInBytes);
1387 } else { 1407 intptr_t* sender_sp = caller->sp() + (frame::abi_minframe_size - frame::abi_reg_args_size) / Interpreter::stackElementSize;
1388 // Now we know our caller, calc the exact frame layout and size. 1408 intptr_t* top_frame_sp = is_top_frame ? sp : sp + (frame::abi_minframe_size - frame::abi_reg_args_size) / Interpreter::stackElementSize;
1389 intptr_t* locals_base = (caller->is_interpreted_frame()) ? 1409
1390 caller->interpreter_frame_esp() + caller_actual_parameters : 1410 interpreter_frame->interpreter_frame_set_method(method);
1391 caller->sp() + method->max_locals() - 1 + (frame::abi_minframe_size / Interpreter::stackElementSize) ; 1411 interpreter_frame->interpreter_frame_set_locals(locals_base);
1392 1412 interpreter_frame->interpreter_frame_set_cpcache(method->constants()->cache());
1393 intptr_t* monitor_base = caller->sp() - frame::ijava_state_size / Interpreter::stackElementSize ; 1413 interpreter_frame->interpreter_frame_set_esp(esp);
1394 intptr_t* monitor = monitor_base - (moncount * frame::interpreter_frame_monitor_size()); 1414 interpreter_frame->interpreter_frame_set_monitor_end((BasicObjectLock *)monitor);
1395 intptr_t* esp_base = monitor - 1; 1415 interpreter_frame->interpreter_frame_set_top_frame_sp(top_frame_sp);
1396 intptr_t* esp = esp_base - tempcount - popframe_extra_args; 1416 if (!is_bottom_frame) {
1397 intptr_t* sp = (intptr_t *) (((intptr_t) (esp_base- callee_locals + callee_param_count - method->max_stack()- abi_scratch)) & -StackAlignmentInBytes); 1417 interpreter_frame->interpreter_frame_set_sender_sp(sender_sp);
1398 intptr_t* sender_sp = caller->sp() + (frame::abi_minframe_size - frame::abi_reg_args_size) / Interpreter::stackElementSize;
1399 intptr_t* top_frame_sp = is_top_frame ? sp : sp + (frame::abi_minframe_size - frame::abi_reg_args_size) / Interpreter::stackElementSize;
1400
1401 interpreter_frame->interpreter_frame_set_method(method);
1402 interpreter_frame->interpreter_frame_set_locals(locals_base);
1403 interpreter_frame->interpreter_frame_set_cpcache(method->constants()->cache());
1404 interpreter_frame->interpreter_frame_set_esp(esp);
1405 interpreter_frame->interpreter_frame_set_monitor_end((BasicObjectLock *)monitor);
1406 interpreter_frame->interpreter_frame_set_top_frame_sp(top_frame_sp);
1407 if (!is_bottom_frame) {
1408 interpreter_frame->interpreter_frame_set_sender_sp(sender_sp);
1409 }
1410
1411 int framesize_in_slots = caller->sp() - sp;
1412 assert(!is_top_frame ||framesize_in_slots >= (frame::abi_reg_args_size / Interpreter::stackElementSize) + frame::ijava_state_size / Interpreter::stackElementSize, "frame too small");
1413 assert(framesize_in_slots <= conservative_framesize_in_slots, "exact frame size must be smaller than the convervative size!");
1414 return framesize_in_slots;
1415 } 1418 }
1416 } 1419 }
1417 1420
1418 // ============================================================================= 1421 // =============================================================================
1419 // Exceptions 1422 // Exceptions