[BRIGFE] fix an alloca stack underflow
authorPekka Jääskeläinen <pekka.jaaskelainen@parmance.com>
Fri, 4 May 2018 16:40:50 +0000 (16:40 +0000)
committerPekka Jääskeläinen <visit0r@gcc.gnu.org>
Fri, 4 May 2018 16:40:50 +0000 (16:40 +0000)
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

libhsail-rt/ChangeLog
libhsail-rt/rt/workitems.c

index 3c16d0ee7f50ac7b15a41ad077ba2111af93dc31..5ab9e8515f00573deec1274933a8b119e86edbf1 100644 (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
index 39daf27295cf905a2c5dcb63331e28785615e687..36c91691a71450c186a50ac1346560cf4ef51b38 100644 (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