Reviewed-by: Marek Olšák <marek.ol...@amd.com> Marek
On Wed, Oct 29, 2014 at 8:58 AM, Michel Dänzer <mic...@daenzer.net> wrote: > From: Michel Dänzer <michel.daen...@amd.com> > > This prevents us from silently overflowing the stack arrays, and allows > arbitrary stack depths. > > Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=85454 > > Reported-and-Tested-by: Nick Sarnie <commendsar...@gmail.com> > Signed-off-by: Michel Dänzer <michel.daen...@amd.com> > --- > src/gallium/drivers/radeon/radeon_llvm.h | 10 ++++--- > .../drivers/radeon/radeon_setup_tgsi_llvm.c | 33 > ++++++++++++++++++++-- > 2 files changed, 37 insertions(+), 6 deletions(-) > > diff --git a/src/gallium/drivers/radeon/radeon_llvm.h > b/src/gallium/drivers/radeon/radeon_llvm.h > index 00714fb..8612ef8 100644 > --- a/src/gallium/drivers/radeon/radeon_llvm.h > +++ b/src/gallium/drivers/radeon/radeon_llvm.h > @@ -33,10 +33,10 @@ > > #define RADEON_LLVM_MAX_INPUTS 32 * 4 > #define RADEON_LLVM_MAX_OUTPUTS 32 * 4 > -#define RADEON_LLVM_MAX_BRANCH_DEPTH 16 > -#define RADEON_LLVM_MAX_LOOP_DEPTH 16 > #define RADEON_LLVM_MAX_ARRAYS 16 > > +#define RADEON_LLVM_INITIAL_CF_DEPTH 4 > + > #define RADEON_LLVM_MAX_SYSTEM_VALUES 4 > > struct radeon_llvm_branch { > @@ -122,11 +122,13 @@ struct radeon_llvm_context { > > /*=== Private Members ===*/ > > - struct radeon_llvm_branch branch[RADEON_LLVM_MAX_BRANCH_DEPTH]; > - struct radeon_llvm_loop loop[RADEON_LLVM_MAX_LOOP_DEPTH]; > + struct radeon_llvm_branch *branch; > + struct radeon_llvm_loop *loop; > > unsigned branch_depth; > + unsigned branch_depth_max; > unsigned loop_depth; > + unsigned loop_depth_max; > > struct tgsi_declaration_range arrays[RADEON_LLVM_MAX_ARRAYS]; > unsigned num_arrays; > diff --git a/src/gallium/drivers/radeon/radeon_setup_tgsi_llvm.c > b/src/gallium/drivers/radeon/radeon_setup_tgsi_llvm.c > index 2fa23ed..c30a9d0 100644 > --- a/src/gallium/drivers/radeon/radeon_setup_tgsi_llvm.c > +++ b/src/gallium/drivers/radeon/radeon_setup_tgsi_llvm.c > @@ -446,7 +446,19 @@ static void bgnloop_emit( > endloop_block, "LOOP"); > LLVMBuildBr(gallivm->builder, loop_block); > LLVMPositionBuilderAtEnd(gallivm->builder, loop_block); > - ctx->loop_depth++; > + > + if (++ctx->loop_depth > ctx->loop_depth_max) { > + unsigned new_max = ctx->loop_depth_max << 1; > + > + if (!new_max) > + new_max = RADEON_LLVM_INITIAL_CF_DEPTH; > + > + ctx->loop = REALLOC(ctx->loop, ctx->loop_depth_max * > + sizeof(ctx->loop[0]), > + new_max * sizeof(ctx->loop[0])); > + ctx->loop_depth_max = new_max; > + } > + > ctx->loop[ctx->loop_depth - 1].loop_block = loop_block; > ctx->loop[ctx->loop_depth - 1].endloop_block = endloop_block; > } > @@ -577,7 +589,18 @@ static void if_cond_emit( > LLVMBuildCondBr(gallivm->builder, cond, if_block, else_block); > LLVMPositionBuilderAtEnd(gallivm->builder, if_block); > > - ctx->branch_depth++; > + if (++ctx->branch_depth > ctx->branch_depth_max) { > + unsigned new_max = ctx->branch_depth_max << 1; > + > + if (!new_max) > + new_max = RADEON_LLVM_INITIAL_CF_DEPTH; > + > + ctx->branch = REALLOC(ctx->branch, ctx->branch_depth_max * > + sizeof(ctx->branch[0]), > + new_max * sizeof(ctx->branch[0])); > + ctx->branch_depth_max = new_max; > + } > + > ctx->branch[ctx->branch_depth - 1].endif_block = endif_block; > ctx->branch[ctx->branch_depth - 1].if_block = if_block; > ctx->branch[ctx->branch_depth - 1].else_block = else_block; > @@ -1440,4 +1463,10 @@ void radeon_llvm_dispose(struct radeon_llvm_context * > ctx) > LLVMContextDispose(ctx->soa.bld_base.base.gallivm->context); > FREE(ctx->temps); > ctx->temps = NULL; > + FREE(ctx->loop); > + ctx->loop = NULL; > + ctx->loop_depth_max = 0; > + FREE(ctx->branch); > + ctx->branch = NULL; > + ctx->branch_depth_max = 0; > } > -- > 2.1.1 > > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev