[BRIGFE] fix an alloca stack underflow

We didn't preserve additional space for the alloca frame pointers that
are needed to be saved in the alloca space.

Fixes libgomp.c++/target-6.C execution test.

From-SVN: r259942
This commit is contained in:
Pekka Jääskeläinen 2018-05-04 16:40:50 +00:00 committed by Pekka Jääskeläinen
parent 534fe82334
commit 1b40975c87
2 changed files with 16 additions and 3 deletions

View File

@ -1,3 +1,7 @@
2018-05-04 Pekka Jääskeläinen <pekka.jaaskelainen@parmance.com>
* rt/workitems.c: Fix an alloca stack underflow.
2018-04-18 David Malcolm <dmalcolm@redhat.com>
PR jit/85384

View File

@ -63,6 +63,12 @@ static clock_t start_time;
#define FIBER_STACK_SIZE (64*1024)
#define GROUP_SEGMENT_ALIGN 256
/* Preserve this amount of additional space in the alloca stack as we need to
store the alloca frame pointer to the alloca frame, thus must preserve
space for it. This thus supports at most 1024 functions with allocas in
a call chain. */
#define ALLOCA_OVERHEAD 1024*4
uint32_t __hsail_workitemabsid (uint32_t dim, PHSAWorkItem *context);
uint32_t __hsail_workitemid (uint32_t dim, PHSAWorkItem *context);
@ -246,7 +252,7 @@ phsa_execute_wi_gang (PHSAKernelLaunchData *context, void *group_base_ptr,
!= 0)
phsa_fatal_error (3);
wg.alloca_stack_p = wg.private_segment_total_size;
wg.alloca_stack_p = wg.private_segment_total_size + ALLOCA_OVERHEAD;
wg.alloca_frame_p = wg.alloca_stack_p;
wg.initial_group_offset = group_local_offset;
@ -446,7 +452,7 @@ phsa_execute_work_groups (PHSAKernelLaunchData *context, void *group_base_ptr,
!= 0)
phsa_fatal_error (3);
wg.alloca_stack_p = dp->private_segment_size * wg_size;
wg.alloca_stack_p = dp->private_segment_size * wg_size + ALLOCA_OVERHEAD;
wg.alloca_frame_p = wg.alloca_stack_p;
wg.private_base_ptr = private_base_ptr;
@ -867,9 +873,12 @@ uint32_t
__hsail_alloca (uint32_t size, uint32_t align, PHSAWorkItem *wi)
{
volatile PHSAWorkGroup *wg = wi->wg;
uint32_t new_pos = wg->alloca_stack_p - size;
int64_t new_pos = wg->alloca_stack_p - size;
while (new_pos % align != 0)
new_pos--;
if (new_pos < 0)
phsa_fatal_error (2);
wg->alloca_stack_p = new_pos;
#ifdef DEBUG_ALLOCA