intel: decoder: split out getting the next field and decoding it

Due to the new way we handle fields, we need *not* to forget the first
field when decoding instructions. The issue was that the advance
function was called first and skipped the first field.

Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Reviewed-by: Scott D Phillips <scott.d.phillips@intel.com>
This commit is contained in:
Lionel Landwerlin 2017-08-02 22:33:28 +01:00
parent ffa011d1e3
commit f5e5ca1e21

View file

@ -837,17 +837,14 @@ iter_advance_field(struct gen_field_iterator *iter)
return true;
}
bool
gen_field_iterator_next(struct gen_field_iterator *iter)
static void
gen_field_decode(struct gen_field_iterator *iter)
{
union {
uint64_t qw;
float f;
} v;
if (!iter_advance_field(iter))
return false;
if (iter->field->name)
strncpy(iter->name, iter->field->name, sizeof(iter->name));
else
@ -928,8 +925,6 @@ gen_field_iterator_next(struct gen_field_iterator *iter)
snprintf(iter->value + length, sizeof(iter->value) - length,
" (%s)", enum_name);
}
return true;
}
void
@ -941,9 +936,25 @@ gen_field_iterator_init(struct gen_field_iterator *iter,
memset(iter, 0, sizeof(*iter));
iter->group = group;
iter->field = group->fields;
if (group->fields)
iter->field = group->fields;
else
iter->field = group->next->fields;
iter->p = p;
iter->print_colors = print_colors;
gen_field_decode(iter);
}
bool
gen_field_iterator_next(struct gen_field_iterator *iter)
{
if (!iter_advance_field(iter))
return false;
gen_field_decode(iter);
return true;
}
static void
@ -977,7 +988,7 @@ gen_print_group(FILE *outfile, struct gen_group *group,
int last_dword = -1;
gen_field_iterator_init(&iter, group, p, color);
while (gen_field_iterator_next(&iter)) {
do {
if (last_dword != iter.dword) {
for (int i = last_dword + 1; i <= iter.dword; i++)
print_dword_header(outfile, &iter, offset, i);
@ -991,5 +1002,5 @@ gen_print_group(FILE *outfile, struct gen_group *group,
&p[iter.dword], color);
}
}
}
} while (gen_field_iterator_next(&iter));
}