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] sparse/pre-process: introduce "dissect_mode" option to fix dissect/semind
Date: Wed, 17 Dec 2025 16:17:44 +0100 [thread overview]
Message-ID: <aULJmGi8yib_XH0P@redhat.com> (raw)
I don't quite understand why does expand() -> collect_arg() path
update ->pos for each token in the input *list, but this breaks
dissect and thus semind.
Test-case:
$ cat -n PP_POS.c
1 #define READ_ONCE(x) x
2 #define WRITE_ONCE(x, y) x = y
3
4 int R, W;
5
6 void func(void)
7 {
8 WRITE_ONCE(
9 W,
10 READ_ONCE(R)
11 );
12 }
$ ./test-dissect PP_POS.c
4:5 def v R int
4:8 def v W int
6:6 def f func void ( ... )
8:3 func -w- v W int
8:3 func -r- v R int
The reported positions of the usage of R and W are wrong,
and thus ./semind doesn't work:
$ ./semind add PP_POS.c
$ ./semind search -l PP_POS.c:10:16
With this patch:
$ ./test-dissect PP_POS.c
4:5 def v R int
4:8 def v W int
6:6 def f func void ( ... )
9:6 func -w- v W int
10:16 func -r- v R int
$ ./semind add PP_POS.c
$ ./semind search -l PP_POS.c:10:16
(def) PP_POS.c 4 5 int R, W;
(-r-) PP_POS.c 10 16 func READ_ONCE(R)
Signed-off-by: Oleg Nesterov <oleg@redhat.com>
---
dissect.c | 1 +
options.c | 1 +
options.h | 1 +
pre-process.c | 8 +++++---
4 files changed, 8 insertions(+), 3 deletions(-)
diff --git a/dissect.c b/dissect.c
index a6003afa..5fed8e22 100644
--- a/dissect.c
+++ b/dissect.c
@@ -714,6 +714,7 @@ end:
void dissect(struct reporter *rep, struct string_list *filelist)
{
+ dissect_mode = 1;
reporter = rep;
DO_LIST(filelist, file, do_file(file));
diff --git a/options.c b/options.c
index 6ee4d878..0f207e80 100644
--- a/options.c
+++ b/options.c
@@ -71,6 +71,7 @@ int dump_macro_defs = 0;
int dump_macros_only = 0;
int dissect_show_all_symbols = 0;
+int dissect_mode = 0;
unsigned long fdump_ir;
int fhosted = 1;
diff --git a/options.h b/options.h
index c2a9551a..b559254d 100644
--- a/options.h
+++ b/options.h
@@ -71,6 +71,7 @@ extern int dump_macro_defs;
extern int dump_macros_only;
extern int dissect_show_all_symbols;
+extern int dissect_mode;
extern unsigned long fdump_ir;
extern int fhosted;
diff --git a/pre-process.c b/pre-process.c
index 3fb25082..64445881 100644
--- a/pre-process.c
+++ b/pre-process.c
@@ -294,9 +294,11 @@ static struct token *collect_arg(struct token *prev, int vararg, struct position
} else if (match_op(next, ',') && !nesting && !vararg) {
break;
}
- next->pos.stream = pos->stream;
- next->pos.line = pos->line;
- next->pos.pos = pos->pos;
+ if (!dissect_mode) {
+ next->pos.stream = pos->stream;
+ next->pos.line = pos->line;
+ next->pos.pos = pos->pos;
+ }
next->pos.newline = 0;
p = &next->next;
}
--
2.52.0
next reply other threads:[~2025-12-17 15:26 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-12-17 15:17 Oleg Nesterov [this message]
2026-01-16 23:29 ` [PATCH] sparse/pre-process: introduce "dissect_mode" option to fix dissect/semind Chris Li
2026-01-17 14:19 ` Oleg Nesterov
2026-01-17 16:32 ` Oleg Nesterov
2026-01-19 0:23 ` Chris Li
2026-01-19 12:32 ` Oleg Nesterov
2026-01-19 0:21 ` Chris Li
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=aULJmGi8yib_XH0P@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.