From: Oleg Nesterov <oleg@redhat.com>
To: Chris Li <sparse@chrisli.org>, Luc Van Oostenryck <lucvoo@kernel.org>
Cc: Alexey Gladkov <legion@kernel.org>, linux-sparse@vger.kernel.org
Subject: [PATCH v2] sparse/dissect: don't miss inline functions when !dissect_show_all_symbols
Date: Wed, 31 Dec 2025 17:16:19 +0100 [thread overview]
Message-ID: <aVVMU0Vu-t6SN4g-@redhat.com> (raw)
In-Reply-To: <aUvQr9q1ePtvSwCs@redhat.com>
parse_function_body() doesn't do add_symbol(decl) if MOD_INLINE, this
means that dissect/semind can't see the definitions of inline functions
in translation_unit_used_list.
This change is not really needed if dissect_show_all_symbols == 1, in
this case do_file() inspects file_scope/global_scope.
Test-case:
$ cat -n INLINE.c
1 static inline void i_func1(void)
2 {
3 unkown();
4 }
5 static inline void *i_func2(void)
6 {
7 return i_func1;
8 }
9
10 void func(void)
11 {
12 i_func2();
13 }
Before this patch:
$ ./test-dissect INLINE.c
10:6 def f func void ( ... )
12:9 func --r f i_func2 void *( ... )
With this patch:
$ ./test-dissect INLINE.c
10:6 def f func void ( ... )
5:21 def f i_func2 void *( ... )
1:20 def f i_func1 void ( ... )
3:9 i_func1 --r f unkown bad type
7:16 i_func2 r-- f i_func1 void ( ... )
12:9 func --r f i_func2 void *( ... )
Signed-off-by: Oleg Nesterov <oleg@redhat.com>
---
dissect.c | 9 ++++++++-
1 file changed, 8 insertions(+), 1 deletion(-)
diff --git a/dissect.c b/dissect.c
index a825bb30..b9d4adc4 100644
--- a/dissect.c
+++ b/dissect.c
@@ -59,6 +59,7 @@ static void do_sym_list(struct symbol_list *list);
static struct symbol
*base_type(struct symbol *sym),
+ *do_symbol(struct symbol *sym),
*do_initializer(struct symbol *type, struct expression *expr),
*do_expression(usage_t mode, struct expression *expr),
*do_statement(usage_t mode, struct statement *stmt);
@@ -225,6 +226,12 @@ static void examine_sym_node(struct symbol *node, struct symbol *parent)
case SYM_FN:
node->kind = 'f';
+ if (node->ctype.modifiers & MOD_INLINE) {
+ struct symbol *dctx = dissect_ctx;
+ dissect_ctx = NULL;
+ do_symbol(node);
+ dissect_ctx = dctx;
+ }
node = base;
break;
@@ -621,7 +628,7 @@ static inline bool is_typedef(struct symbol *sym)
return (sym->namespace == NS_TYPEDEF);
}
-static inline struct symbol *do_symbol(struct symbol *sym)
+static struct symbol *do_symbol(struct symbol *sym)
{
struct symbol *type = base_type(sym);
struct symbol *dctx = dissect_ctx;
--
2.52.0
prev parent reply other threads:[~2025-12-31 16:16 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-12-24 11:38 [PATCH] sparse/dissect: introduce do_inline(struct symbol *sym) Oleg Nesterov
2025-12-31 16:15 ` Oleg Nesterov
2025-12-31 16:16 ` Oleg Nesterov [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=aVVMU0Vu-t6SN4g-@redhat.com \
--to=oleg@redhat.com \
--cc=legion@kernel.org \
--cc=linux-sparse@vger.kernel.org \
--cc=lucvoo@kernel.org \
--cc=sparse@chrisli.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.