dissect: introduce sym_is_local() for reporter
PATCH 1/1 dissect: introduce sym_is_local() for reporter
Can be used to filter out the usage of local variables.
--- dissect.c | 2 +- dissect.h | 5 +++++ test-dissect.c | 18 ++++++++++++++---- 3 files changed, 20 insertions(+), 5 deletions(-)
dissect.c +1 -1
@@ -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 */ } }
dissect.h +5 -0
@@ -27,6 +27,11 @@ struct reporterextern 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
test-dissect.c +14 -4
@@ -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));
Signature · 1 line
2.5.0
Quoted 1 line · Oleg Nesterov
Can be used to filter out the usage of local variables.
...
dissect.h struct reporter · line 34
Quoted 13 lines
dissect.h +5
-0@@ -27,6 +27,11 @@ struct reporterextern struct symbol *dissect_ctx; +static inline bool sym_is_local (struct symbol *sym) +{ +return sym->kind =='v' && !(sym->ctype.modifiers &MOD_TOPLEVEL ); +} +
Shouldn't MOD_STATIC be added to the test?
It depends on what exactly you want for 'local'.
-- Luc
Quoted 14 lines · Luc Van Oostenryck
Quoted 1 line · Oleg Nesterov
Can be used to filter out the usage of local variables.
...
Quoted 8 lines
dissect.h +0
-0@@ -27,6 +27,11 @@ struct reporterextern struct symbol *dissect_ctx;
Quoted 7 lines
dissect.h struct reporter · line 34
Quoted 5 lines
dissect.h +5
-0+static inline bool sym_is_local (struct symbol *sym) +{ +return sym->kind =='v' && !(sym->ctype.modifiers &MOD_TOPLEVEL ); +} +Shouldn't
MOD_STATICbe added to the test?
perhaps I misread bind_symbol() ... but it seems to me MOD_TOPLEVEL is enough. bind_symbol() does
scope = block_scope;
if (ns == NS_SYMBOL && toplevel(scope)) {
mod = MOD_ADDRESSABLE | MOD_TOPLEVEL;
...
sym->ctype.modifiers |= mod;
}toplevel(block_scope) should be true after start_file_scope() sets "block_scope = file_scope" and until start_function_scope(), right?
Quoted 1 line
It depends on what exactly you want for 'local'.
Yes, it should only return T if the symbol was defined inside some function. If we have
static int I;
in file scope, sym_is_local() should return false and so it does, test-dissect outputs
1:12 def v I int
Thanks for looking!
Oleg.
Quoted 6 lines · Oleg Nesterov
Quoted 1 line · Luc Van Oostenryck
It depends on what exactly you want for 'local'.
Yes, it should only return T if the symbol was defined inside some function. If we have
Quoted 6 lines
static int I;in file scope,
sym_is_local()should return false and so it does, test-dissect outputs1:12 def v I int
OK, then everything is fine.
Quoted 1 line
Thanks for looking!
You're welcome!
This and the other pending ones are now pushed to main.
-- Luc