From 100509c0789f1176fc5881da45917e9af77597ca Mon Sep 17 00:00:00 2001 From: Oleg Nesterov Date: Wed, 5 Feb 2020 13:53:18 +0100 Subject: dissect: introduce reporter->r_memdef() To report where is the member of struct/union defined. Signed-off-by: Oleg Nesterov Signed-off-by: Luc Van Oostenryck --- dissect.c | 12 +++++++++++- dissect.h | 1 + test-dissect.c | 6 ++++++ 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/dissect.c b/dissect.c index 88eaab1c..60fccbdb 100644 --- a/dissect.c +++ b/dissect.c @@ -203,6 +203,12 @@ static bool deanon(struct symbol *base, struct ident *node, struct symbol *paren return true; } +static void report_memdef(struct symbol *sym, struct symbol *mem) +{ + if (sym && mem->ident) + reporter->r_memdef(sym, mem); +} + static void examine_sym_node(struct symbol *node, struct symbol *parent) { struct symbol *base; @@ -236,8 +242,12 @@ static void examine_sym_node(struct symbol *node, struct symbol *parent) if (base->ident || deanon(base, name, parent)) reporter->r_symdef(base); + + if (base->ident) + parent = base; DO_LIST(base->symbol_list, mem, - examine_sym_node(mem, base->ident ? base : parent)); + examine_sym_node(mem, parent); + report_memdef(parent, mem)); default: return; } diff --git a/dissect.h b/dissect.h index 664736ce..1f5b1d9e 100644 --- a/dissect.h +++ b/dissect.h @@ -19,6 +19,7 @@ struct reporter { void (*r_symdef)(struct symbol *); + void (*r_memdef)(struct symbol *, struct symbol *); void (*r_symbol)(unsigned, struct position *, struct symbol *); void (*r_member)(unsigned, struct position *, struct symbol *, struct symbol *); diff --git a/test-dissect.c b/test-dissect.c index af1212a0..e725eec5 100644 --- a/test-dissect.c +++ b/test-dissect.c @@ -75,10 +75,16 @@ static void r_symdef(struct symbol *sym) r_symbol(-1, &sym->pos, sym); } +static void r_memdef(struct symbol *sym, struct symbol *mem) +{ + r_member(-1, &mem->pos, sym, mem); +} + int main(int argc, char **argv) { static struct reporter reporter = { .r_symdef = r_symdef, + .r_memdef = r_memdef, .r_symbol = r_symbol, .r_member = r_member, }; -- cgit 1.2.3-korg