Mercurial > hg > truffle
comparison src/cpu/ppc/vm/ppc.ad @ 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 | f6bde7889409 |
comparison
equal
deleted
inserted
replaced
17978:ad51f24671c2 | 17980:0bf37f737702 |
---|---|
1 // | 1 // |
2 // Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved. | 2 // Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved. |
3 // Copyright 2012, 2013 SAP AG. All rights reserved. | 3 // Copyright 2012, 2014 SAP AG. All rights reserved. |
4 // DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | 4 // DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
5 // | 5 // |
6 // This code is free software; you can redistribute it and/or modify it | 6 // This code is free software; you can redistribute it and/or modify it |
7 // under the terms of the GNU General Public License version 2 only, as | 7 // under the terms of the GNU General Public License version 2 only, as |
8 // published by the Free Software Foundation. | 8 // published by the Free Software Foundation. |
1361 | 1361 |
1362 void MachPrologNode::emit(CodeBuffer &cbuf, PhaseRegAlloc *ra_) const { | 1362 void MachPrologNode::emit(CodeBuffer &cbuf, PhaseRegAlloc *ra_) const { |
1363 Compile* C = ra_->C; | 1363 Compile* C = ra_->C; |
1364 MacroAssembler _masm(&cbuf); | 1364 MacroAssembler _masm(&cbuf); |
1365 | 1365 |
1366 const long framesize = ((long)C->frame_slots()) << LogBytesPerInt; | 1366 const long framesize = C->frame_size_in_bytes(); |
1367 assert(framesize%(2*wordSize) == 0, "must preserve 2*wordSize alignment"); | 1367 assert(framesize % (2 * wordSize) == 0, "must preserve 2*wordSize alignment"); |
1368 | 1368 |
1369 const bool method_is_frameless = false /* TODO: PPC port C->is_frameless_method()*/; | 1369 const bool method_is_frameless = false /* TODO: PPC port C->is_frameless_method()*/; |
1370 | 1370 |
1371 const Register return_pc = R20; // Must match return_addr() in frame section. | 1371 const Register return_pc = R20; // Must match return_addr() in frame section. |
1372 const Register callers_sp = R21; | 1372 const Register callers_sp = R21; |
1387 // Calls to C2R adapters often do not accept exceptional returns. | 1387 // Calls to C2R adapters often do not accept exceptional returns. |
1388 // We require that their callers must bang for them. But be | 1388 // We require that their callers must bang for them. But be |
1389 // careful, because some VM calls (such as call site linkage) can | 1389 // careful, because some VM calls (such as call site linkage) can |
1390 // use several kilobytes of stack. But the stack safety zone should | 1390 // use several kilobytes of stack. But the stack safety zone should |
1391 // account for that. See bugs 4446381, 4468289, 4497237. | 1391 // account for that. See bugs 4446381, 4468289, 4497237. |
1392 if (C->need_stack_bang(framesize) && UseStackBanging) { | 1392 |
1393 int bangsize = C->bang_size_in_bytes(); | |
1394 assert(bangsize >= framesize || bangsize <= 0, "stack bang size incorrect"); | |
1395 if (C->need_stack_bang(bangsize) && UseStackBanging) { | |
1393 // Unfortunately we cannot use the function provided in | 1396 // Unfortunately we cannot use the function provided in |
1394 // assembler.cpp as we have to emulate the pipes. So I had to | 1397 // assembler.cpp as we have to emulate the pipes. So I had to |
1395 // insert the code of generate_stack_overflow_check(), see | 1398 // insert the code of generate_stack_overflow_check(), see |
1396 // assembler.cpp for some illuminative comments. | 1399 // assembler.cpp for some illuminative comments. |
1397 const int page_size = os::vm_page_size(); | 1400 const int page_size = os::vm_page_size(); |
1398 int bang_end = StackShadowPages*page_size; | 1401 int bang_end = StackShadowPages * page_size; |
1399 | 1402 |
1400 // This is how far the previous frame's stack banging extended. | 1403 // This is how far the previous frame's stack banging extended. |
1401 const int bang_end_safe = bang_end; | 1404 const int bang_end_safe = bang_end; |
1402 | 1405 |
1403 if (framesize > page_size) { | 1406 if (bangsize > page_size) { |
1404 bang_end += framesize; | 1407 bang_end += bangsize; |
1405 } | 1408 } |
1406 | 1409 |
1407 int bang_offset = bang_end_safe; | 1410 int bang_offset = bang_end_safe; |
1408 | 1411 |
1409 while (bang_offset <= bang_end) { | 1412 while (bang_offset <= bang_end) { |
1445 // R11 trashed | 1448 // R11 trashed |
1446 } // C->need_stack_bang(framesize) && UseStackBanging | 1449 } // C->need_stack_bang(framesize) && UseStackBanging |
1447 | 1450 |
1448 unsigned int bytes = (unsigned int)framesize; | 1451 unsigned int bytes = (unsigned int)framesize; |
1449 long offset = Assembler::align_addr(bytes, frame::alignment_in_bytes); | 1452 long offset = Assembler::align_addr(bytes, frame::alignment_in_bytes); |
1450 ciMethod *currMethod = C -> method(); | 1453 ciMethod *currMethod = C->method(); |
1451 | 1454 |
1452 // Optimized version for most common case. | 1455 // Optimized version for most common case. |
1453 if (UsePower6SchedulerPPC64 && | 1456 if (UsePower6SchedulerPPC64 && |
1454 !method_is_frameless && Assembler::is_simm((int)(-offset), 16) && | 1457 !method_is_frameless && Assembler::is_simm((int)(-offset), 16) && |
1455 !(false /* ConstantsALot TODO: PPC port*/)) { | 1458 !(false /* ConstantsALot TODO: PPC port*/)) { |