[Mesa-dev] [PATCH 09/11] intel/tools: Refactor gen_disasm_disassemble() to use annotations
Pohjolainen, Topi
topi.pohjolainen at gmail.com
Sat May 13 04:42:50 UTC 2017
On Thu, May 04, 2017 at 11:27:57AM -0700, Matt Turner wrote:
> On Tue, May 2, 2017 at 6:03 AM, Iago Toral <itoral at igalia.com> wrote:
> > 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?
>
> Yeah, exactly. I'm not sure it's a good way to handle it though. To be
> honest, I had a hard time remembering how it was supposed to work and
> I wrote the annotation system.
>
> I think a linked list would be a lot more natural than the array/count.
Sounds like it. While not ideal I think we can live with this for now:
Reviewed-by: Topi Pohjolainen <topi.pohjolainen at intel.com>
More information about the mesa-dev
mailing list