[Mesa-dev] [PATCH 09/11] intel/tools: Refactor gen_disasm_disassemble() to use annotations

Iago Toral itoral at igalia.com
Tue May 2 13:03:07 UTC 2017


On Mon, 2017-05-01 at 13:54 -0700, Matt Turner wrote:
> Which will allow us to print validation errors found in shader
> assembly
> in GPU hang error states.
> ---
>  src/intel/tools/disasm.c | 71 +++++++++++++++++++++++++++++---------
> ----------
>  1 file changed, 43 insertions(+), 28 deletions(-)
> 
> diff --git a/src/intel/tools/disasm.c b/src/intel/tools/disasm.c
> index 62256d2..361885b 100644
> --- a/src/intel/tools/disasm.c
> +++ b/src/intel/tools/disasm.c
> @@ -43,52 +43,67 @@ is_send(uint32_t opcode)
>             opcode == BRW_OPCODE_SENDSC );
>  }
>  
> -void
> -gen_disasm_disassemble(struct gen_disasm *disasm, void *assembly,
> -                       int start, FILE *out)
> +static int
> +gen_disasm_find_end(struct gen_disasm *disasm, void *assembly, int
> start)
>  {
>     struct gen_device_info *devinfo = &disasm->devinfo;
> -   bool dump_hex = false;
>     int offset = start;
>  
>     /* This loop exits when send-with-EOT or when opcode is 0 */
>     while (true) {
>        brw_inst *insn = assembly + offset;
> -      brw_inst uncompacted;
> -      bool compacted = brw_inst_cmpt_control(devinfo, insn);
> -      if (0)
> -         fprintf(out, "0x%08x: ", offset);
> -
> -      if (compacted) {
> -         brw_compact_inst *compacted = (void *)insn;
> -         if (dump_hex) {
> -            fprintf(out, "0x%08x 0x%08x                       ",
> -                   ((uint32_t *)insn)[1],
> -                   ((uint32_t *)insn)[0]);
> -         }
> -
> -         brw_uncompact_instruction(devinfo, &uncompacted,
> compacted);
> -         insn = &uncompacted;
> +
> +      if (brw_inst_cmpt_control(devinfo, insn)) {
>           offset += 8;
>        } else {
> -         if (dump_hex) {
> -            fprintf(out, "0x%08x 0x%08x 0x%08x 0x%08x ",
> -                   ((uint32_t *)insn)[3],
> -                   ((uint32_t *)insn)[2],
> -                   ((uint32_t *)insn)[1],
> -                   ((uint32_t *)insn)[0]);
> -         }
>           offset += 16;
>        }
>  
> -      brw_disassemble_inst(out, devinfo, insn, compacted);
> -
>        /* Simplistic, but efficient way to terminate disasm */
>        uint32_t opcode = brw_inst_opcode(devinfo, insn);
>        if (opcode == 0 || (is_send(opcode) && brw_inst_eot(devinfo,
> insn))) {
>           break;
>        }
>     }
> +
> +   return offset;
> +}
> +
> +void
> +gen_disasm_disassemble(struct gen_disasm *disasm, void *assembly,
> +                       int start, FILE *out)
> +{
> +   struct gen_device_info *devinfo = &disasm->devinfo;
> +   int end = gen_disasm_find_end(disasm, assembly, start);
> +
> +   /* Make a dummy annotation structure that
> brw_validate_instructions
> +    * can work from.
> +    */
> +   struct annotation_info annotation_info = {
> +      .ann_count = 1,
> +      .ann_size = 2,
> +   };
> +   annotation_info.mem_ctx = ralloc_context(NULL);
> +   annotation_info.ann = rzalloc_array(annotation_info.mem_ctx,
> +                                       struct annotation,
> +                                       annotation_info.ann_size);
> +   annotation_info.ann[0].offset = start;
> +   annotation_info.ann[1].offset = end;
> +   brw_validate_instructions(devinfo, assembly, start, end,
> &annotation_info);
> +   struct annotation *annotation = annotation_info.ann;
> +
> +   for (int i = 0; i < annotation_info.ann_count; i++) {
> +      int start_offset = annotation[i].offset;
> +      int end_offset = annotation[i + 1].offset;

I was going to say that this code seems to overflow when i
== annotation_info.ann_count - 1, but then I noticed that there are
similar loops in other parts of the code and that you initialized
ann_count to just 1 even though you have two initial annotations, so I
guess this is how this is supposed to work, right?

> +
> +      brw_disassemble(devinfo, assembly, start_offset, end_offset,
> stdout);
> +
> +      if (annotation[i].error) {
> +         fputs(annotation[i].error, stdout);
> +      }
> +   }
> +
> +   ralloc_free(annotation_info.mem_ctx);
>  }
>  
>  struct gen_disasm *


More information about the mesa-dev mailing list