summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorKenneth Graunke <[email protected]>2017-03-19 21:22:20 -0700
committerKenneth Graunke <[email protected]>2017-03-20 11:20:51 -0700
commitb2c0c1d9a5c6b1dd55d4e06f504e1ce9fe823c32 (patch)
tree2f32275c7dad0f46fffdb93f91dab569b1cad170 /src
parenta1aa78cb45cee5ba6fa9ecf1266760cdbb51f5f3 (diff)
aubinator: Make the iterator store a pointer to structure descriptions.
When the iterator encounters a structure field, it now looks up the gen_group for that structure definition and saves a pointer to it. This lets us drop a lot of ridiculous code in the caller, which looked at item->value (<struct NAME dword>), strtok'd the structure name back out, and looked it up itself. Reviewed-by: Lionel Landwerlin <[email protected]>
Diffstat (limited to 'src')
-rw-r--r--src/intel/tools/aubinator.c32
-rw-r--r--src/intel/tools/decoder.c5
-rw-r--r--src/intel/tools/decoder.h1
3 files changed, 11 insertions, 27 deletions
diff --git a/src/intel/tools/aubinator.c b/src/intel/tools/aubinator.c
index fc2efd3e46e..0c941322d68 100644
--- a/src/intel/tools/aubinator.c
+++ b/src/intel/tools/aubinator.c
@@ -102,30 +102,11 @@ print_dword_header(struct gen_field_iterator *iter, uint64_t offset)
offset + 4 * iter->dword, iter->p[iter->dword], iter->dword);
}
-static char *
-print_iterator_values(struct gen_field_iterator *iter)
-{
- char *token = NULL;
- if (strstr(iter->value, "struct") == NULL) {
- fprintf(outfile, " %s: %s\n", iter->name, iter->value);
- } else {
- token = strtok(iter->value, " ");
- if (token != NULL) {
- token = strtok(NULL, " ");
- } else {
- token = NULL;
- }
- fprintf(outfile, " %s:<struct %s>\n", iter->name, token);
- }
- return token;
-}
-
static void
decode_group(struct gen_spec *spec, struct gen_group *strct,
const uint32_t *p, int starting_dword)
{
struct gen_field_iterator iter;
- char *token = NULL;
int last_dword = 0;
uint64_t offset = 0;
@@ -141,13 +122,12 @@ decode_group(struct gen_spec *spec, struct gen_group *strct,
print_dword_header(&iter, offset);
last_dword = iter.dword;
}
- if (iter.dword >= starting_dword)
- token = print_iterator_values(&iter);
- if (token != NULL) {
- print_dword_header(&iter, offset);
- struct gen_group *struct_val = gen_spec_find_struct(spec, token);
- decode_group(spec, struct_val, &p[iter.dword], 0);
- token = NULL;
+ if (iter.dword >= starting_dword) {
+ fprintf(outfile, " %s: %s\n", iter.name, iter.value);
+ if (iter.struct_desc) {
+ print_dword_header(&iter, offset + 4 * iter.dword);
+ decode_group(spec, iter.struct_desc, &p[iter.dword], 0);
+ }
}
}
}
diff --git a/src/intel/tools/decoder.c b/src/intel/tools/decoder.c
index 8838eb2500c..a8534d7c0c7 100644
--- a/src/intel/tools/decoder.c
+++ b/src/intel/tools/decoder.c
@@ -753,6 +753,7 @@ gen_field_iterator_next(struct gen_field_iterator *iter)
f = iter->group->fields[iter->i++];
iter->name = f->name;
iter->dword = f->start / 32;
+ iter->struct_desc = NULL;
if ((f->end - f->start) > 32)
v.qw = ((uint64_t) iter->p[iter->dword+1] << 32) | iter->p[iter->dword];
@@ -794,7 +795,9 @@ 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, iter->dword);
+ "<struct %s>", f->type.gen_struct->name);
+ iter->struct_desc =
+ gen_spec_find_struct(iter->group->spec, f->type.gen_struct->name);
break;
case GEN_TYPE_UFIXED:
snprintf(iter->value, sizeof(iter->value),
diff --git a/src/intel/tools/decoder.h b/src/intel/tools/decoder.h
index 700ce21f033..576b0e08596 100644
--- a/src/intel/tools/decoder.h
+++ b/src/intel/tools/decoder.h
@@ -54,6 +54,7 @@ struct gen_field_iterator {
struct gen_group *group;
const char *name;
char value[128];
+ struct gen_group *struct_desc;
const uint32_t *p;
int dword; /**< current field starts at &p[dword] */
int i;