Skip to content

Commit

Permalink
[BRIGFE] fix an alloca stack underflow
Browse files Browse the repository at this point in the history
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.



git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@259942 138bc75d-0d04-0410-961f-82ee72b054a4
  • Loading branch information
visit0r committed May 4, 2018
1 parent 14c8065 commit c11ac92
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 3 deletions.
4 changes: 4 additions & 0 deletions libhsail-rt/ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
2018-05-04 Pekka Jääskeläinen <[email protected]>

* rt/workitems.c: Fix an alloca stack underflow.

2018-04-18 David Malcolm <[email protected]>

PR jit/85384
Expand Down
15 changes: 12 additions & 3 deletions libhsail-rt/rt/workitems.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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;

Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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
Expand Down

0 comments on commit c11ac92

Please sign in to comment.