On Wed, Jul 02, 2014 at 04:34:24PM -0500, Aaron Watry wrote:
> Previously, we were assuming that kernel metadata nodes only had 1 operand.
> 
> Kernels which have attributes can have more than 1, e.g.:
> !0 = metadata !{void (i32 addrspace(1)*)* @testKernel, metadata !1}
> !1 = metadata !{metadata !"work_group_size_hint", i32 4, i32 1, i32 1}
> 
> Attempting to get the kernel without the correct number of attributes led
> to memory corruption and luxrays crashing out.
> 
> Fixes the cl/program/execute/attributes.cl piglit test.
>

Thanks for tracking this down.

Reviewed-by: Tom Stellard <thomas.stell...@amd.com>

> Signed-off-by: Aaron Watry <awa...@gmail.com>
> CC: Tom Stellard <thomas.stell...@amd.com>
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=76223
> ---
>  src/gallium/drivers/radeon/radeon_llvm_util.c | 10 +++++++---
>  1 file changed, 7 insertions(+), 3 deletions(-)
> 
> diff --git a/src/gallium/drivers/radeon/radeon_llvm_util.c 
> b/src/gallium/drivers/radeon/radeon_llvm_util.c
> index 2ace91f..ec11559 100644
> --- a/src/gallium/drivers/radeon/radeon_llvm_util.c
> +++ b/src/gallium/drivers/radeon/radeon_llvm_util.c
> @@ -100,13 +100,17 @@ LLVMModuleRef 
> radeon_llvm_get_kernel_module(LLVMContextRef ctx, unsigned index,
>       kernel_metadata = MALLOC(num_kernels * sizeof(LLVMValueRef));
>       LLVMGetNamedMetadataOperands(mod, "opencl.kernels", kernel_metadata);
>       for (i = 0; i < num_kernels; i++) {
> -             LLVMValueRef kernel_signature, kernel_function;
> +             LLVMValueRef kernel_signature, *kernel_function;
> +             unsigned num_kernel_md_operands;
>               if (i == index) {
>                       continue;
>               }
>               kernel_signature = kernel_metadata[i];
> -             LLVMGetMDNodeOperands(kernel_signature, &kernel_function);
> -             LLVMDeleteFunction(kernel_function);
> +             num_kernel_md_operands = 
> LLVMGetMDNodeNumOperands(kernel_signature);
> +             kernel_function = MALLOC(num_kernel_md_operands * sizeof 
> (LLVMValueRef));
> +             LLVMGetMDNodeOperands(kernel_signature, kernel_function);
> +             LLVMDeleteFunction(*kernel_function);
> +             FREE(kernel_function);
>       }
>       FREE(kernel_metadata);
>       radeon_llvm_optimize(mod);
> -- 
> 1.9.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

Reply via email to