aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorOleg Nesterov <oleg@redhat.com>2020-02-11 17:01:36 +0100
committerLuc Van Oostenryck <luc.vanoostenryck@gmail.com>2020-02-13 18:32:38 +0100
commit6d779f4925fda304181ec3f09b9135d35ed9b5a2 (patch)
treecabe09cbbe43a79490ebb5f3a3bdca09bbc72c08
parent7e4a5b6fded1ff9b09da41900eb01a9f6749064b (diff)
downloadsparse-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.c2
-rw-r--r--dissect.h5
-rw-r--r--test-dissect.c18
3 files changed, 20 insertions, 5 deletions
diff --git a/dissect.c b/dissect.c
index d9ca1422..823a3489 100644
--- a/dissect.c
+++ b/dissect.c
@@ -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 */
}
}
diff --git a/dissect.h b/dissect.h
index efe2c0b7..178dba5d 100644
--- a/dissect.h
+++ b/dissect.h
@@ -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));