From: Nicolai Hähnle <nicolai.haeh...@amd.com> exec_node::get_prev() does not guard against going past the beginning of the list, so we need to add explicit checks here.
Found by ASAN in piglit arb_shader_storage_buffer_object-rendering. Cc: mesa-sta...@lists.freedesktop.org --- src/mesa/state_tracker/st_glsl_to_tgsi.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp index 630f5af..fac41b8 100644 --- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp +++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp @@ -3603,24 +3603,31 @@ glsl_to_tgsi_visitor::visit_ssbo_intrinsic(ir_call *ir) } /* The emit_asm() might have actually split the op into pieces, e.g. for * double stores. We have to go back and fix up all the generated ops. */ unsigned op = inst->op; do { inst->resource = buffer; if (access) inst->buffer_access = access->value.u[0]; + + if (inst == this->instructions.get_head_raw()) + break; inst = (glsl_to_tgsi_instruction *)inst->get_prev(); - if (inst->op == TGSI_OPCODE_UADD) + + if (inst->op == TGSI_OPCODE_UADD) { + if (inst == this->instructions.get_head_raw()) + break; inst = (glsl_to_tgsi_instruction *)inst->get_prev(); - } while (inst && inst->op == op && inst->resource.file == PROGRAM_UNDEFINED); + } + } while (inst->op == op && inst->resource.file == PROGRAM_UNDEFINED); } void glsl_to_tgsi_visitor::visit_membar_intrinsic(ir_call *ir) { switch (ir->callee->intrinsic_id) { case ir_intrinsic_memory_barrier: emit_asm(ir, TGSI_OPCODE_MEMBAR, undef_dst, st_src_reg_for_int(TGSI_MEMBAR_SHADER_BUFFER | TGSI_MEMBAR_ATOMIC_BUFFER | -- 2.9.3 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev