diff options
author | Oleg Nesterov <oleg@redhat.com> | 2020-02-11 17:01:36 +0100 |
---|---|---|
committer | Luc Van Oostenryck <luc.vanoostenryck@gmail.com> | 2020-02-13 18:32:38 +0100 |
commit | 6d779f4925fda304181ec3f09b9135d35ed9b5a2 (patch) | |
tree | cabe09cbbe43a79490ebb5f3a3bdca09bbc72c08 | |
parent | 7e4a5b6fded1ff9b09da41900eb01a9f6749064b (diff) | |
download | sparse-6d779f4925fda304181ec3f09b9135d35ed9b5a2.tar.gz |
dissect: introduce sym_is_local() for reporter
Can be used to filter out the usage of local variables.
Signed-off-by: Oleg Nesterov <oleg@redhat.com>
Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
-rw-r--r-- | dissect.c | 2 | ||||
-rw-r--r-- | dissect.h | 5 | ||||
-rw-r--r-- | test-dissect.c | 18 |
3 files changed, 20 insertions, 5 deletions
@@ -165,7 +165,7 @@ static inline struct symbol *expr_symbol(struct expression *expr) if (!sym) { sym = alloc_symbol(expr->pos, SYM_BAD); bind_symbol(sym, expr->symbol_name, NS_SYMBOL); - sym->ctype.modifiers = MOD_EXTERN; + sym->ctype.modifiers = MOD_EXTERN | MOD_TOPLEVEL; sym->kind = expr->op ?: 'v'; /* see EXPR_CALL */ } } @@ -27,6 +27,11 @@ struct reporter extern struct symbol *dissect_ctx; +static inline bool sym_is_local(struct symbol *sym) +{ + return sym->kind == 'v' && !(sym->ctype.modifiers & MOD_TOPLEVEL); +} + extern void dissect(struct symbol_list *, struct reporter *); #endif diff --git a/test-dissect.c b/test-dissect.c index ece22536..c4b454c6 100644 --- a/test-dissect.c +++ b/test-dissect.c @@ -37,6 +37,16 @@ static void print_usage(struct position *pos, struct symbol *sym, unsigned mode) } +static char symscope(struct symbol *sym) +{ + if (sym_is_local(sym)) { + if (!dissect_ctx) + warning(sym->pos, "no context"); + return '.'; + } + return ' '; +} + static void r_symbol(unsigned mode, struct position *pos, struct symbol *sym) { print_usage(pos, sym, mode); @@ -44,8 +54,8 @@ static void r_symbol(unsigned mode, struct position *pos, struct symbol *sym) if (!sym->ident) sym->ident = built_in_ident("__asm__"); - printf("%c %-32.*s %s\n", - sym->kind, sym->ident->len, sym->ident->name, + printf("%c %c %-32.*s %s\n", + symscope(sym), sym->kind, sym->ident->len, sym->ident->name, show_typename(sym->ctype.base_type)); switch (sym->kind) { @@ -80,8 +90,8 @@ static void r_member(unsigned mode, struct position *pos, struct symbol *sym, st /* mem == NULL means entire struct accessed */ mi = mem ? mem->ident : built_in_ident("*"); - printf("m %.*s.%-*.*s %s\n", - si->len, si->name, + printf("%c m %.*s.%-*.*s %s\n", + symscope(sym), si->len, si->name, 32-1 - si->len, mi->len, mi->name, show_typename(mem ? mem->ctype.base_type : sym)); |