@ rcr_md @
expression major, minor;
expression ct, name;
position fnc_expr;
statement S1,S2,S3;
@@
<+...
S1
+ devt = MKDEV(major,minor);
S2
// <+...
//- MKDEV(major,minor)
//+ devt
// ...+>
// S3
...
- register_chrdev_region
+ register_chrdev_ids
(
- MKDEV(major,minor),
+ &devt,
ct, name)
@fnc_expr // at end of fn-call expr
...+>
the above rule works on ./drivers/tty/tty_io.c as follows
diff =
--- ./drivers/tty/tty_io.c 2011-05-14 12:46:02.282840998 -0600
+++ /tmp/cocci-output-28931-46cda0-tty_io.c 2011-05-15 01:36:23.969325500
-0600
@@ -3294,14 +3294,17 @@ void console_sysfs_notify(void)
int __init tty_init(void)
{
cdev_init(&tty_cdev, &tty_fops);
+ devt = MKDEV(TTYAUX_MAJOR, 1);
if (cdev_add(&tty_cdev, MKDEV(TTYAUX_MAJOR, 0), 1) ||
register_chrdev_region(MKDEV(TTYAUX_MAJOR, 0), 1, "/dev/tty") < 0)
panic("Couldn't register /dev/tty driver\n");
+ devt = MKDEV(TTYAUX_MAJOR, 1);
device_create(tty_class, NULL, MKDEV(TTYAUX_MAJOR, 0), NULL, "tty");
+ devt = MKDEV(TTYAUX_MAJOR, 1);
cdev_init(&console_cdev, &console_fops);
if (cdev_add(&console_cdev, MKDEV(TTYAUX_MAJOR, 1), 1) ||
- register_chrdev_region(MKDEV(TTYAUX_MAJOR, 1), 1, "/dev/console") <
0)
+ register_chrdev_ids(&devt, 1, "/dev/console") < 0)
panic("Couldn't register /dev/console driver\n");
consdev = device_create(tty_class, NULL, MKDEV(TTYAUX_MAJOR, 1), NULL,
"console");
Note: processing took 24.0s: ./drivers/tty/tty_io.c
its managing to insert the devt=... code,
but its doing so 3 times, not 2, and not where Id really like it.
code looks legal, as S1, S2 seem to force statement boundaries.
If I remove S2, which seems to force inserted initializer above where
Id like it,
I get more profound problem:
previous modification:
CONTEXT
>>> devt = MKDEV(rcr_md:major, rcr_md:minor);
According to environment 2:
rcr_md.minor -> 1
rcr_md.major -> TTYAUX_MAJOR
current modification:
CONTEXT
>>> devt = MKDEV(rcr_md:major, rcr_md:minor);
According to environment 2:
rcr_md.minor -> 0
rcr_md.major -> TTYAUX_MAJOR
Fatal error: exception Failure("rcr_md: already tagged token:
C code context
File "./drivers/tty/tty_io.c", line 3296, column 32, charpos = 82361
around = ';', whole content = cdev_init(&tty_cdev, &tty_fops);")
Theres also that commented out block with S3.
If uncommented, match-&-transform fails.
Id like it to pick up the MKDEV uses in the cdev_add() calls.
Also, I cant make decl-insert at top-of-scope work.
_______________________________________________
Cocci mailing list
[email protected]
http://lists.diku.dk/mailman/listinfo/cocci
(Web access from inside DIKUs LAN only)