aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorOleg Nesterov <oleg@redhat.com>2020-02-06 18:01:32 +0100
committerLuc Van Oostenryck <luc.vanoostenryck@gmail.com>2020-02-07 14:53:51 +0100
commit5778d8fe517bd147861c53e9ec4d14d93d7b7ebb (patch)
treef64b67a221c36da0b8aeb9fc64136f9d18fb2822
parent100509c0789f1176fc5881da45917e9af77597ca (diff)
downloadsparse-5778d8fe517bd147861c53e9ec4d14d93d7b7ebb.tar.gz
dissect: introduce dissect_ctx
Points to the current function or to the global variable in case of compound initializer. Kill the ugly test-dissect.c:storage() and change print_usage() to report dissect_ctx->ident instead. Signed-off-by: Oleg Nesterov <oleg@redhat.com> Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
-rw-r--r--dissect.c17
-rw-r--r--dissect.h2
-rw-r--r--test-dissect.c21
3 files changed, 25 insertions, 15 deletions
diff --git a/dissect.c b/dissect.c
index 60fccbdb..54e11d2f 100644
--- a/dissect.c
+++ b/dissect.c
@@ -51,6 +51,8 @@
typedef unsigned usage_t;
+struct symbol *dissect_ctx;
+
static struct reporter *reporter;
static struct symbol *return_type;
@@ -211,7 +213,7 @@ static void report_memdef(struct symbol *sym, struct symbol *mem)
static void examine_sym_node(struct symbol *node, struct symbol *parent)
{
- struct symbol *base;
+ struct symbol *base, *dctx;
struct ident *name;
if (node->examined)
@@ -240,6 +242,9 @@ static void examine_sym_node(struct symbol *node, struct symbol *parent)
return;
base->evaluated = 1;
+ dctx = dissect_ctx;
+ dissect_ctx = NULL;
+
if (base->ident || deanon(base, name, parent))
reporter->r_symdef(base);
@@ -248,6 +253,7 @@ static void examine_sym_node(struct symbol *node, struct symbol *parent)
DO_LIST(base->symbol_list, mem,
examine_sym_node(mem, parent);
report_memdef(parent, mem));
+ dissect_ctx = dctx;
default:
return;
}
@@ -582,6 +588,7 @@ static struct symbol *do_initializer(struct symbol *type, struct expression *exp
static inline struct symbol *do_symbol(struct symbol *sym)
{
struct symbol *type = base_type(sym);
+ struct symbol *dctx = dissect_ctx;
reporter->r_symdef(sym);
@@ -590,14 +597,20 @@ static inline struct symbol *do_symbol(struct symbol *sym)
if (!sym->initializer)
break;
reporter->r_symbol(U_W_VAL, &sym->pos, sym);
+ if (!dctx)
+ dissect_ctx = sym;
do_initializer(type, sym->initializer);
+ dissect_ctx = dctx;
break; case SYM_FN:
- do_sym_list(type->arguments);
+ dissect_ctx = sym;
return_type = base_type(type);
+ do_sym_list(type->arguments);
do_statement(U_VOID, sym->ctype.modifiers & MOD_INLINE
? type->inline_stmt
: type->stmt);
+ dissect_ctx = dctx;
+ return_type = NULL;
}
return type;
diff --git a/dissect.h b/dissect.h
index 1f5b1d9e..efe2c0b7 100644
--- a/dissect.h
+++ b/dissect.h
@@ -25,6 +25,8 @@ struct reporter
void (*r_member)(unsigned, struct position *, struct symbol *, struct symbol *);
};
+extern struct symbol *dissect_ctx;
+
extern void dissect(struct symbol_list *, struct reporter *);
#endif
diff --git a/test-dissect.c b/test-dissect.c
index e725eec5..d93a2a04 100644
--- a/test-dissect.c
+++ b/test-dissect.c
@@ -2,17 +2,6 @@
static unsigned dotc_stream;
-static inline char storage(struct symbol *sym)
-{
- int t = sym->type;
- unsigned m = sym->ctype.modifiers;
-
- if (m & MOD_INLINE || t == SYM_STRUCT || t == SYM_UNION /*|| t == SYM_ENUM*/)
- return sym->pos.stream == dotc_stream ? 's' : 'g';
-
- return (m & MOD_STATIC) ? 's' : (m & MOD_NONLOCAL) ? 'g' : 'l';
-}
-
static inline const char *show_mode(unsigned mode)
{
static char str[3];
@@ -32,14 +21,20 @@ static inline const char *show_mode(unsigned mode)
static void print_usage(struct position *pos, struct symbol *sym, unsigned mode)
{
static unsigned curr_stream = -1;
+ static struct ident null;
+ struct ident *ctx = &null;
if (curr_stream != pos->stream) {
curr_stream = pos->stream;
printf("\nFILE: %s\n\n", stream_name(curr_stream));
}
- printf("%4d:%-3d %c %-5.3s",
- pos->line, pos->pos, storage(sym), show_mode(mode));
+ if (dissect_ctx)
+ ctx = dissect_ctx->ident;
+
+ printf("%4d:%-3d %-16.*s %-5.3s",
+ pos->line, pos->pos, ctx->len, ctx->name, show_mode(mode));
+
}
static void r_symbol(unsigned mode, struct position *pos, struct symbol *sym)