Mercurial > hg > graal-compiler
comparison src/cpu/x86/vm/sharedRuntime_x86_32.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 | 2100bf712e2a |
children | 52b4284cb496 |
comparison
equal
deleted
inserted
replaced
17978:ad51f24671c2 | 17980:0bf37f737702 |
---|---|
3012 | 3012 |
3013 // Pick up the initial fp we should save | 3013 // Pick up the initial fp we should save |
3014 // restore rbp before stack bang because if stack overflow is thrown it needs to be pushed (and preserved) | 3014 // restore rbp before stack bang because if stack overflow is thrown it needs to be pushed (and preserved) |
3015 __ movptr(rbp, Address(rdi, Deoptimization::UnrollBlock::initial_info_offset_in_bytes())); | 3015 __ movptr(rbp, Address(rdi, Deoptimization::UnrollBlock::initial_info_offset_in_bytes())); |
3016 | 3016 |
3017 // Stack bang to make sure there's enough room for these interpreter frames. | 3017 #ifdef ASSERT |
3018 // Compilers generate code that bang the stack by as much as the | |
3019 // interpreter would need. So this stack banging should never | |
3020 // trigger a fault. Verify that it does not on non product builds. | |
3018 if (UseStackBanging) { | 3021 if (UseStackBanging) { |
3019 __ movl(rbx, Address(rdi ,Deoptimization::UnrollBlock::total_frame_sizes_offset_in_bytes())); | 3022 __ movl(rbx, Address(rdi ,Deoptimization::UnrollBlock::total_frame_sizes_offset_in_bytes())); |
3020 __ bang_stack_size(rbx, rcx); | 3023 __ bang_stack_size(rbx, rcx); |
3021 } | 3024 } |
3025 #endif | |
3022 | 3026 |
3023 // Load array of frame pcs into ECX | 3027 // Load array of frame pcs into ECX |
3024 __ movptr(rcx,Address(rdi,Deoptimization::UnrollBlock::frame_pcs_offset_in_bytes())); | 3028 __ movptr(rcx,Address(rdi,Deoptimization::UnrollBlock::frame_pcs_offset_in_bytes())); |
3025 | 3029 |
3026 __ pop(rsi); // trash the old pc | 3030 __ pop(rsi); // trash the old pc |
3238 | 3242 |
3239 // Pick up the initial fp we should save | 3243 // Pick up the initial fp we should save |
3240 // restore rbp before stack bang because if stack overflow is thrown it needs to be pushed (and preserved) | 3244 // restore rbp before stack bang because if stack overflow is thrown it needs to be pushed (and preserved) |
3241 __ movptr(rbp, Address(rdi, Deoptimization::UnrollBlock::initial_info_offset_in_bytes())); | 3245 __ movptr(rbp, Address(rdi, Deoptimization::UnrollBlock::initial_info_offset_in_bytes())); |
3242 | 3246 |
3243 // Stack bang to make sure there's enough room for these interpreter frames. | 3247 #ifdef ASSERT |
3248 // Compilers generate code that bang the stack by as much as the | |
3249 // interpreter would need. So this stack banging should never | |
3250 // trigger a fault. Verify that it does not on non product builds. | |
3244 if (UseStackBanging) { | 3251 if (UseStackBanging) { |
3245 __ movl(rbx, Address(rdi ,Deoptimization::UnrollBlock::total_frame_sizes_offset_in_bytes())); | 3252 __ movl(rbx, Address(rdi ,Deoptimization::UnrollBlock::total_frame_sizes_offset_in_bytes())); |
3246 __ bang_stack_size(rbx, rcx); | 3253 __ bang_stack_size(rbx, rcx); |
3247 } | 3254 } |
3248 | 3255 #endif |
3249 | 3256 |
3250 // Load array of frame pcs into ECX | 3257 // Load array of frame pcs into ECX |
3251 __ movl(rcx,Address(rdi,Deoptimization::UnrollBlock::frame_pcs_offset_in_bytes())); | 3258 __ movl(rcx,Address(rdi,Deoptimization::UnrollBlock::frame_pcs_offset_in_bytes())); |
3252 | 3259 |
3253 __ pop(rsi); // trash the pc | 3260 __ pop(rsi); // trash the pc |