The dissect client uses struct symbol's fields 'examined' & 'evaluated' to avoid reprocessing the same symbols. But these fields are used internally by sparse for type examination & evaluation and despite dissect not doing these operations explicitly, they can be done implicitly (for example to handle static assertions or when the value of a constant expression is needed). So, add a new field to struct symbol: 'inspected' and use it, as well as the existing 'visited', instead of 'evaluated' & 'examined'. Note: when used on the kernel, this patch avoids a lot of warnings: "warning: r_member bad sym type=7 kind=0" "warning: r_member bad mem->kind = 0" and creates substantially more normal output. Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@xxxxxxxxx> --- dissect.c | 8 ++++---- symbol.h | 1 + 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/dissect.c b/dissect.c index fd09707dbf67..582e8fc32e46 100644 --- a/dissect.c +++ b/dissect.c @@ -204,9 +204,9 @@ static void examine_sym_node(struct symbol *node, struct symbol *parent) struct ident *name = node->ident; struct symbol *base, *dctx; - if (node->examined) + if (node->visited) return; - node->examined = 1; + node->visited = 1; node->kind = 'v'; while ((base = node->ctype.base_type) != NULL) @@ -228,9 +228,9 @@ static void examine_sym_node(struct symbol *node, struct symbol *parent) break; case SYM_STRUCT: case SYM_UNION: //case SYM_ENUM: - if (base->evaluated) + if (base->inspected) return; - base->evaluated = 1; + base->inspected = 1; base->kind = 's'; if (!base->symbol_list) diff --git a/symbol.h b/symbol.h index c2b60ce91c27..08d1134a7d82 100644 --- a/symbol.h +++ b/symbol.h @@ -209,6 +209,7 @@ struct symbol { struct { /* sparse ctags */ char kind; unsigned char visited:1; + unsigned char inspected:1; }; }; pseudo_t pseudo; -- 2.28.0