NVPTX does not support alloca or variable-length stack allocations, thus
heap allocation needs to be used instead.  I've opted to make this a generic
change instead of guarding it with an #ifdef: libgomp usually leaves thread
stack size up to libc, so avoiding unbounded stack allocation makes sense.

        * task.c (GOMP_task): Use a fixed-size on-stack buffer or a heap
        allocation instead of a variable-size on-stack allocation.
---
 libgomp/task.c | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/libgomp/task.c b/libgomp/task.c
index 74920d5..ffb7ed2 100644
--- a/libgomp/task.c
+++ b/libgomp/task.c
@@ -162,11 +162,16 @@ GOMP_task (void (*fn) (void *), void *data, void (*cpyfn) 
(void *, void *),
       thr->task = &task;
       if (__builtin_expect (cpyfn != NULL, 0))
        {
-         char buf[arg_size + arg_align - 1];
+         long buf_size = arg_size + arg_align - 1;
+         char buf_fixed[2048], *buf = buf_fixed;
+         if (sizeof(buf_fixed) < buf_size)
+           buf = gomp_malloc (buf_size);
          char *arg = (char *) (((uintptr_t) buf + arg_align - 1)
                                & ~(uintptr_t) (arg_align - 1));
          cpyfn (arg, data);
          fn (arg);
+         if (buf != buf_fixed)
+           free (buf);
        }
       else
        fn (data);

Reply via email to