aubinator: Track the current field's starting dword offset.
authorKenneth Graunke <kenneth@whitecape.org>
Mon, 20 Mar 2017 04:45:20 +0000 (21:45 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Mon, 20 Mar 2017 18:20:51 +0000 (11:20 -0700)
The iterator code already computed this value, then we stored it in
the structure name, strtok'd it back out, and also manually computed
it when printing dword headers.

Just put the value in the struct and use it.  Way simpler.

Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
src/intel/tools/aubinator.c
src/intel/tools/decoder.c
src/intel/tools/decoder.h

index 1f6a1fe4b1d016090761b259350cdc091143071d..fc2efd3e46ebd455cdc29f70dd23a13433caae16 100644 (file)
@@ -96,23 +96,14 @@ valid_offset(uint32_t offset)
 }
 
 static void
-print_dword_val(struct gen_field_iterator *iter, uint64_t offset,
-                int *dword_num)
+print_dword_header(struct gen_field_iterator *iter, uint64_t offset)
 {
-   struct gen_field *f;
-
-   f = iter->group->fields[iter->i - 1];
-   const int dword = f->start / 32;
-
-   if (*dword_num != dword) {
-      fprintf(outfile, "0x%08"PRIx64":  0x%08x : Dword %d\n",
-              offset + 4 * dword,  iter->p[dword], dword);
-      *dword_num = dword;
-   }
+   fprintf(outfile, "0x%08"PRIx64":  0x%08x : Dword %d\n",
+           offset + 4 * iter->dword, iter->p[iter->dword], iter->dword);
 }
 
 static char *
-print_iterator_values(struct gen_field_iterator *iter, int *idx)
+print_iterator_values(struct gen_field_iterator *iter)
 {
     char *token = NULL;
     if (strstr(iter->value, "struct") == NULL) {
@@ -121,7 +112,6 @@ print_iterator_values(struct gen_field_iterator *iter, int *idx)
         token = strtok(iter->value, " ");
         if (token != NULL) {
             token = strtok(NULL, " ");
-            *idx = atoi(strtok(NULL, ">"));
         } else {
             token = NULL;
         }
@@ -136,7 +126,7 @@ decode_group(struct gen_spec *spec, struct gen_group *strct,
 {
    struct gen_field_iterator iter;
    char *token = NULL;
-   int idx = 0, dword_num = 0;
+   int last_dword = 0;
    uint64_t offset = 0;
 
    if (option_print_offsets)
@@ -147,15 +137,16 @@ decode_group(struct gen_spec *spec, struct gen_group *strct,
    gen_field_iterator_init(&iter, strct, p,
                            option_color == COLOR_ALWAYS);
    while (gen_field_iterator_next(&iter)) {
-      idx = 0;
-      print_dword_val(&iter, offset, &dword_num);
-      if (dword_num >= starting_dword)
-         token = print_iterator_values(&iter, &idx);
+      if (last_dword != iter.dword) {
+         print_dword_header(&iter, offset);
+         last_dword = iter.dword;
+      }
+      if (iter.dword >= starting_dword)
+         token = print_iterator_values(&iter);
       if (token != NULL) {
-         fprintf(outfile, "0x%08"PRIx64":  0x%08x : Dword %d\n",
-                 offset + 4 * idx, p[idx], idx);
+         print_dword_header(&iter, offset);
          struct gen_group *struct_val = gen_spec_find_struct(spec, token);
-         decode_group(spec, struct_val, &p[idx], 0);
+         decode_group(spec, struct_val, &p[iter.dword], 0);
          token = NULL;
       }
    }
index ec94ae4d92a55a2dee4e7bbf9665736e77f5e80a..8838eb2500cc7cadeb246ba666a7fd50c7340cf8 100644 (file)
@@ -752,12 +752,12 @@ gen_field_iterator_next(struct gen_field_iterator *iter)
 
    f = iter->group->fields[iter->i++];
    iter->name = f->name;
-   int index = f->start / 32;
+   iter->dword = f->start / 32;
 
    if ((f->end - f->start) > 32)
-      v.qw = ((uint64_t) iter->p[index+1] << 32) | iter->p[index];
+      v.qw = ((uint64_t) iter->p[iter->dword+1] << 32) | iter->p[iter->dword];
    else
-      v.qw = iter->p[index];
+      v.qw = iter->p[iter->dword];
 
    const char *enum_name = NULL;
 
@@ -794,7 +794,7 @@ gen_field_iterator_next(struct gen_field_iterator *iter)
       break;
    case GEN_TYPE_STRUCT:
       snprintf(iter->value, sizeof(iter->value),
-               "<struct %s %d>", f->type.gen_struct->name, (f->start / 32));
+               "<struct %s %d>", f->type.gen_struct->name, iter->dword);
       break;
    case GEN_TYPE_UFIXED:
       snprintf(iter->value, sizeof(iter->value),
index 7b14ef4a64728eb38b30c45a37291e4510483d2a..700ce21f0339c4dd0f2338e63d9d792a9df3fc11 100644 (file)
@@ -55,6 +55,7 @@ struct gen_field_iterator {
    const char *name;
    char value[128];
    const uint32_t *p;
+   int dword; /**< current field starts at &p[dword] */
    int i;
    bool print_colors;
 };