aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorEric Anholt <[email protected]>2019-09-03 14:19:36 -0700
committerEric Anholt <[email protected]>2019-09-16 22:02:43 +0000
commiteea6f21cbdcd758a7a071485b854723ce32d1641 (patch)
tree375b8375d3dfe84fb121ec4f609277e8b638ed44 /src
parentd9d6305b80b957ec80b2eb6ccffeab84f6766f19 (diff)
freedreno: Fix invalid read when a block has no instructions.
We can't deref list_(first/last)_entries unless we know we have at least one. Instead, just use our IP we've been tracking as we go to set up the start ip, and fill in the end IP as we walk instructions. Fixes a complaint in valgrind on dEQP-GLES3.functional.transform_feedback.* which sometimes has an empty main (non-END) block when the VS inputs are just directly mapped to outputs without any ALU ops. Reviewed-by: Rob Clark <[email protected]>
Diffstat (limited to 'src')
-rw-r--r--src/freedreno/ir3/ir3.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/src/freedreno/ir3/ir3.c b/src/freedreno/ir3/ir3.c
index feec723abd0..68e83f7495e 100644
--- a/src/freedreno/ir3/ir3.c
+++ b/src/freedreno/ir3/ir3.c
@@ -1071,11 +1071,12 @@ ir3_count_instructions(struct ir3 *ir)
{
unsigned cnt = 0;
list_for_each_entry (struct ir3_block, block, &ir->block_list, node) {
+ block->start_ip = cnt;
+ block->end_ip = cnt;
list_for_each_entry (struct ir3_instruction, instr, &block->instr_list, node) {
instr->ip = cnt++;
+ block->end_ip = instr->ip;
}
- block->start_ip = list_first_entry(&block->instr_list, struct ir3_instruction, node)->ip;
- block->end_ip = list_last_entry(&block->instr_list, struct ir3_instruction, node)->ip;
}
return cnt;
}