* [Cocci] Can the current function name be passed to a Python snippet?
@ 2018-11-15 20:58 Timur Tabi
2018-11-15 21:29 ` Julia Lawall
0 siblings, 1 reply; 17+ messages in thread
From: Timur Tabi @ 2018-11-15 20:58 UTC (permalink / raw)
To: cocci
Is it possible for a Python code snippet to be passed the name of the
current function? I already have Python code in my .cocci file that
cleans up the text of some string literals. I want to add more code
that removes the current function name from the beginning of a string
literal. So for instance, If I have
void myfunc(void)
{
...
NV_PRINTF("myfunc: xxx\n");
I want to replace the NV_PRINTF line with:
NV_PRINTF("xxx\n");
To do that, the Python code would need to given "myfunc" as a
parameter of some kind.
_______________________________________________
Cocci mailing list
Cocci@systeme.lip6.fr
https://systeme.lip6.fr/mailman/listinfo/cocci
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [Cocci] Can the current function name be passed to a Python snippet?
2018-11-15 20:58 [Cocci] Can the current function name be passed to a Python snippet? Timur Tabi
@ 2018-11-15 21:29 ` Julia Lawall
2018-12-04 20:17 ` Timur Tabi
0 siblings, 1 reply; 17+ messages in thread
From: Julia Lawall @ 2018-11-15 21:29 UTC (permalink / raw)
To: Timur Tabi; +Cc: cocci
On Thu, 15 Nov 2018, Timur Tabi wrote:
> Is it possible for a Python code snippet to be passed the name of the
> current function? I already have Python code in my .cocci file that
> cleans up the text of some string literals. I want to add more code
> that removes the current function name from the beginning of a string
> literal. So for instance, If I have
>
> void myfunc(void)
> {
> ...
> NV_PRINTF("myfunc: xxx\n");
>
> I want to replace the NV_PRINTF line with:
>
> NV_PRINTF("xxx\n");
>
> To do that, the Python code would need to given "myfunc" as a
> parameter of some kind.
The name of the current function at a given match is available in a
position variable bound as part of that match. A position variable should
have a current_element field.
julia
_______________________________________________
Cocci mailing list
Cocci@systeme.lip6.fr
https://systeme.lip6.fr/mailman/listinfo/cocci
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [Cocci] Can the current function name be passed to a Python snippet?
2018-11-15 21:29 ` Julia Lawall
@ 2018-12-04 20:17 ` Timur Tabi
2018-12-04 20:25 ` Julia Lawall
0 siblings, 1 reply; 17+ messages in thread
From: Timur Tabi @ 2018-12-04 20:17 UTC (permalink / raw)
To: Julia Lawall; +Cc: cocci
On Thu, Nov 15, 2018 at 3:29 PM Julia Lawall <julia.lawall@lip6.fr> wrote:
> The name of the current function at a given match is available in a
> position variable bound as part of that match. A position variable should
> have a current_element field.
Unfortunately, I don't understand what you're saying. I see some
examples referencing the "position" in a Python script, but they don't
make any sense to me, e.g.
http://coccinelle.lip6.fr/docs/main_grammar016.html#sec27
The example shows:
@ r exists @
local idexpression struct device_node *n;
position p1, p2;
statement S1,S2;
expression E,E1;
I assume when you say "position parameter", you're talking about the
"position p1, p2;" above. If so, I'm completely confused.
_______________________________________________
Cocci mailing list
Cocci@systeme.lip6.fr
https://systeme.lip6.fr/mailman/listinfo/cocci
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [Cocci] Can the current function name be passed to a Python snippet?
2018-12-04 20:17 ` Timur Tabi
@ 2018-12-04 20:25 ` Julia Lawall
2018-12-04 22:02 ` Timur Tabi
0 siblings, 1 reply; 17+ messages in thread
From: Julia Lawall @ 2018-12-04 20:25 UTC (permalink / raw)
To: Timur Tabi; +Cc: cocci
On Tue, 4 Dec 2018, Timur Tabi wrote:
> On Thu, Nov 15, 2018 at 3:29 PM Julia Lawall <julia.lawall@lip6.fr> wrote:
>
> > The name of the current function at a given match is available in a
> > position variable bound as part of that match. A position variable should
> > have a current_element field.
>
> Unfortunately, I don't understand what you're saying. I see some
> examples referencing the "position" in a Python script, but they don't
> make any sense to me, e.g.
>
> http://coccinelle.lip6.fr/docs/main_grammar016.html#sec27
>
> The example shows:
>
> @ r exists @
> local idexpression struct device_node *n;
> position p1, p2;
> statement S1,S2;
> expression E,E1;
>
> I assume when you say "position parameter", you're talking about the
> "position p1, p2;" above. If so, I'm completely confused.
In the example, p1 will store the position of n. In the python rule, you
can then access p1[0].current_element to get the name of the function in
which n occurs.
julia
_______________________________________________
Cocci mailing list
Cocci@systeme.lip6.fr
https://systeme.lip6.fr/mailman/listinfo/cocci
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [Cocci] Can the current function name be passed to a Python snippet?
2018-12-04 20:25 ` Julia Lawall
@ 2018-12-04 22:02 ` Timur Tabi
2018-12-04 22:19 ` Timur Tabi
2018-12-05 6:34 ` Julia Lawall
0 siblings, 2 replies; 17+ messages in thread
From: Timur Tabi @ 2018-12-04 22:02 UTC (permalink / raw)
To: Julia Lawall; +Cc: cocci, Timur Tabi
On Tue, Dec 4, 2018 at 2:25 PM Julia Lawall <julia.lawall@lip6.fr> wrote:
>
>
>
> On Tue, 4 Dec 2018, Timur Tabi wrote:
>
> > On Thu, Nov 15, 2018 at 3:29 PM Julia Lawall <julia.lawall@lip6.fr> wrote:
> >
> > > The name of the current function at a given match is available in a
> > > position variable bound as part of that match. A position variable should
> > > have a current_element field.
> >
> > Unfortunately, I don't understand what you're saying. I see some
> > examples referencing the "position" in a Python script, but they don't
> > make any sense to me, e.g.
> >
> > http://coccinelle.lip6.fr/docs/main_grammar016.html#sec27
> >
> > The example shows:
> >
> > @ r exists @
> > local idexpression struct device_node *n;
> > position p1, p2;
> > statement S1,S2;
> > expression E,E1;
> >
> > I assume when you say "position parameter", you're talking about the
> > "position p1, p2;" above. If so, I'm completely confused.
>
> In the example, p1 will store the position of n. In the python rule, you
> can then access p1[0].current_element to get the name of the function in
> which n occurs.
What do you mean by "position of n"?
I managed to figure it out without using positional parameters. It
almost works in that it only does the replacement once:
// Look for NV_PRINTF2 calls that have the function name in the string
@r4 depends on rules@
identifier func;
expression x;
constant char[] c;
@@
func(...) {
...
NV_PRINTF2(x, c, ...)
...
}
// Get rid of the function name at the beginning of the string
@script:python s4@
c << r4.c;
c2;
f << r4.func;
@@
import re
coccinelle.c2 = re.sub('"%s[: ]*' % f, '"', c, 1)
@depends on rules@
expression x;
constant char[] r4.c;
identifier s4.c2;
@@
NV_PRINTF2(x,
-c
+c2
,...);
Based on what I've read, I need to add < > in order for spatch to run
the rule multiple times within a function. But if I change r4 to
this:
@r4 depends on rules@
identifier func;
expression x;
constant char[] c;
@@
func(...) {
<...
NV_PRINTF2(x, c, ...)
...>
}
It doesn't work at all.
_______________________________________________
Cocci mailing list
Cocci@systeme.lip6.fr
https://systeme.lip6.fr/mailman/listinfo/cocci
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [Cocci] Can the current function name be passed to a Python snippet?
2018-12-04 22:02 ` Timur Tabi
@ 2018-12-04 22:19 ` Timur Tabi
2018-12-05 6:35 ` Julia Lawall
2018-12-05 6:34 ` Julia Lawall
1 sibling, 1 reply; 17+ messages in thread
From: Timur Tabi @ 2018-12-04 22:19 UTC (permalink / raw)
To: Timur Tabi; +Cc: cocci
On Tue, Dec 4, 2018 at 4:02 PM Timur Tabi <timur@kernel.org> wrote:
> Based on what I've read, I need to add < > in order for spatch to run
> the rule multiple times within a function. But if I change r4 to
> this:
>
> @r4 depends on rules@
> identifier func;
> expression x;
> constant char[] c;
> @@
> func(...) {
> <...
> NV_PRINTF2(x, c, ...)
> ...>
> }
>
> It doesn't work at all.
Ok, I changed it to
func(...) {
<+...
NV_PRINTF2(x, c, ...)
...+>
}
and now it works. I don't know why I needed the +'s, but at least it
works now. Thanks.
_______________________________________________
Cocci mailing list
Cocci@systeme.lip6.fr
https://systeme.lip6.fr/mailman/listinfo/cocci
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [Cocci] Can the current function name be passed to a Python snippet?
2018-12-04 22:02 ` Timur Tabi
2018-12-04 22:19 ` Timur Tabi
@ 2018-12-05 6:34 ` Julia Lawall
2018-12-05 17:57 ` Timur Tabi
1 sibling, 1 reply; 17+ messages in thread
From: Julia Lawall @ 2018-12-05 6:34 UTC (permalink / raw)
To: Timur Tabi; +Cc: cocci
On Tue, 4 Dec 2018, Timur Tabi wrote:
> On Tue, Dec 4, 2018 at 2:25 PM Julia Lawall <julia.lawall@lip6.fr> wrote:
> >
> >
> >
> > On Tue, 4 Dec 2018, Timur Tabi wrote:
> >
> > > On Thu, Nov 15, 2018 at 3:29 PM Julia Lawall <julia.lawall@lip6.fr> wrote:
> > >
> > > > The name of the current function at a given match is available in a
> > > > position variable bound as part of that match. A position variable should
> > > > have a current_element field.
> > >
> > > Unfortunately, I don't understand what you're saying. I see some
> > > examples referencing the "position" in a Python script, but they don't
> > > make any sense to me, e.g.
> > >
> > > http://coccinelle.lip6.fr/docs/main_grammar016.html#sec27
> > >
> > > The example shows:
> > >
> > > @ r exists @
> > > local idexpression struct device_node *n;
> > > position p1, p2;
> > > statement S1,S2;
> > > expression E,E1;
> > >
> > > I assume when you say "position parameter", you're talking about the
> > > "position p1, p2;" above. If so, I'm completely confused.
> >
> > In the example, p1 will store the position of n. In the python rule, you
> > can then access p1[0].current_element to get the name of the function in
> > which n occurs.
>
> What do you mean by "position of n"?
The code that n matches is in some file, within some function, at some
line number, and at some column offset. All of that information is
collected in p1.
>
> I managed to figure it out without using positional parameters. It
> almost works in that it only does the replacement once:
>
> // Look for NV_PRINTF2 calls that have the function name in the string
> @r4 depends on rules@
> identifier func;
> expression x;
> constant char[] c;
> @@
> func(...) {
> ...
> NV_PRINTF2(x, c, ...)
> ...
> }
This can work, but as written it requires exactly one call to NV_PRINTF2
on every control-flow path through the function. It also has to trace
through the entire function, which will be expensive.
> // Get rid of the function name at the beginning of the string
> @script:python s4@
> c << r4.c;
> c2;
> f << r4.func;
> @@
> import re
> coccinelle.c2 = re.sub('"%s[: ]*' % f, '"', c, 1)
>
> @depends on rules@
> expression x;
> constant char[] r4.c;
> identifier s4.c2;
> @@
> NV_PRINTF2(x,
> -c
> +c2
> ,...);
>
> Based on what I've read, I need to add < > in order for spatch to run
> the rule multiple times within a function. But if I change r4 to
> this:
>
> @r4 depends on rules@
> identifier func;
> expression x;
> constant char[] c;
> @@
> func(...) {
> <...
> NV_PRINTF2(x, c, ...)
> ...>
> }
>
> It doesn't work at all.
What do you mean by doesn't work at all?
julia
_______________________________________________
Cocci mailing list
Cocci@systeme.lip6.fr
https://systeme.lip6.fr/mailman/listinfo/cocci
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [Cocci] Can the current function name be passed to a Python snippet?
2018-12-04 22:19 ` Timur Tabi
@ 2018-12-05 6:35 ` Julia Lawall
2018-12-05 17:49 ` Timur Tabi
0 siblings, 1 reply; 17+ messages in thread
From: Julia Lawall @ 2018-12-05 6:35 UTC (permalink / raw)
To: Timur Tabi; +Cc: cocci
On Tue, 4 Dec 2018, Timur Tabi wrote:
> On Tue, Dec 4, 2018 at 4:02 PM Timur Tabi <timur@kernel.org> wrote:
> > Based on what I've read, I need to add < > in order for spatch to run
> > the rule multiple times within a function. But if I change r4 to
> > this:
> >
> > @r4 depends on rules@
> > identifier func;
> > expression x;
> > constant char[] c;
> > @@
> > func(...) {
> > <...
> > NV_PRINTF2(x, c, ...)
> > ...>
> > }
> >
> > It doesn't work at all.
>
> Ok, I changed it to
>
> func(...) {
> <+...
> NV_PRINTF2(x, c, ...)
> ...+>
> }
>
> and now it works. I don't know why I needed the +'s, but at least it
> works now. Thanks.
This means that the rule only applies when there is at least one
occurrence of the pattern in between the <+... ...+>.
The previous rule matched all functions.
julia
_______________________________________________
Cocci mailing list
Cocci@systeme.lip6.fr
https://systeme.lip6.fr/mailman/listinfo/cocci
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [Cocci] Can the current function name be passed to a Python snippet?
2018-12-05 6:35 ` Julia Lawall
@ 2018-12-05 17:49 ` Timur Tabi
2018-12-05 19:33 ` Julia Lawall
0 siblings, 1 reply; 17+ messages in thread
From: Timur Tabi @ 2018-12-05 17:49 UTC (permalink / raw)
To: Julia Lawall; +Cc: cocci
On Wed, Dec 5, 2018 at 12:47 AM Julia Lawall <julia.lawall@lip6.fr> wrote:
>
> > and now it works. I don't know why I needed the +'s, but at least it
> > works now. Thanks.
>
> This means that the rule only applies when there is at least one
> occurrence of the pattern in between the <+... ...+>.
Unfortunately, on some files, adding the + significantly slows down
the script. It stalls for about 15-20 seconds a few times during
parsing. Normally the while script takes about 1-2 seconds to run. I
believe coccinelle is having trouble finding the functions because
some my source files abuse C macros.
_______________________________________________
Cocci mailing list
Cocci@systeme.lip6.fr
https://systeme.lip6.fr/mailman/listinfo/cocci
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [Cocci] Can the current function name be passed to a Python snippet?
2018-12-05 6:34 ` Julia Lawall
@ 2018-12-05 17:57 ` Timur Tabi
2018-12-05 18:32 ` Timur Tabi
` (2 more replies)
0 siblings, 3 replies; 17+ messages in thread
From: Timur Tabi @ 2018-12-05 17:57 UTC (permalink / raw)
To: Julia Lawall; +Cc: cocci, Timur Tabi
On Wed, Dec 5, 2018 at 12:44 AM Julia Lawall <julia.lawall@lip6.fr> wrote:
>
> > > In the example, p1 will store the position of n. In the python rule, you
> > > can then access p1[0].current_element to get the name of the function in
> > > which n occurs.
> >
> > What do you mean by "position of n"?
>
> The code that n matches is in some file, within some function, at some
> line number, and at some column offset. All of that information is
> collected in p1.
I'm having trouble figuring out how to access p1[0]. I tried this
// Use Python to clean up the string literals.
// Comments are still C-style though
@r depends on rules@
expression x;
position p1;
constant char[] c;
@@
NV_PRINTF2(x, c, ...)
@script:python s@
c << r.c;
c2;
p1 << r.p1;
@@
import re
print p1
But that gave me this error:
warning: r: metavariable p1 not used in the - or
_______________________________________________
Cocci mailing list
Cocci@systeme.lip6.fr
https://systeme.lip6.fr/mailman/listinfo/cocci
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [Cocci] Can the current function name be passed to a Python snippet?
2018-12-05 17:57 ` Timur Tabi
@ 2018-12-05 18:32 ` Timur Tabi
2018-12-05 19:45 ` Julia Lawall
2018-12-05 19:11 ` Timur Tabi
2018-12-05 19:32 ` Julia Lawall
2 siblings, 1 reply; 17+ messages in thread
From: Timur Tabi @ 2018-12-05 18:32 UTC (permalink / raw)
To: Timur Tabi; +Cc: cocci
[-- Attachment #1: Type: text/plain, Size: 402 bytes --]
Another thing that I don't understand is why do I need to have two
rules for every Python script? I've attached my .cocci file. Each
Python script is in between a pair of //---- comments. They all have
the same format:
1. One rule to specify the pattern to match
2. A Python script
3. Another rule to specify how to process the output of the Python script
Can't I combine 1) and 3) into one rule?
[-- Attachment #2: nv_printf.cocci --]
[-- Type: application/octet-stream, Size: 4989 bytes --]
/*
* Coccinelle file to replace DBG_PRINTF() calls with NV_PRINTF()
*
* To work around an odd behavior of Coccinelle, we temporarily change
* the DBG_PRINTx statements into NV_PRINT2, and do all our work on that
* macro name. Only at the very end do we change NV_PRINT2 to NV_PRINTF.
* We do this so that Coccinelle won't touch existing NV_PRINTF statements.
*
* Python rules come in three parts:
* 1. A rule to determine if the Python code should be run
* 2. The Python code itself, inside a rule
* 3. A final rule that applies the output of the Python script
*/
// Remove the double-parentheses in DBG_PRINTF statements
@rule0@
@@
DBG_PRINTF(
-(
...
-)
);
// Replace DBG_PRINTF with NV_PRINTF2
@rule1 depends on rule0@
expression x;
expression list y;
@@
-DBG_PRINTF(x, y);
+NV_PRINTF2(y);
// Replace DBG_PRINT_STRING with NV_PRINTF2
@rule2@
expression list x;
@@
-DBG_PRINT_STRING(x);
+NV_PRINTF2(x);
// Replace DBG_PRINT_STRING_VALUE with NV_PRINTF2
@rule3@
expression x;
expression list y;
@@
-DBG_PRINT_STRING_VALUE(x, y);
+NV_PRINTF2(x, "%s 0x%x\n", y);
// Replace DBG_PRINT_STRING_PTR with NV_PRINTF2
@rule4@
expression x;
expression list y;
@@
-DBG_PRINT_STRING_PTR(x, y);
+NV_PRINTF2(x, "%s %p\n", y);
// Replace DBG_PRINT_STRING_VAL64 with NV_PRINTF2
@rule5@
expression x;
expression list y;
@@
-DBG_PRINT_STRING_VAL64(x, y);
+NV_PRINTF2(x, "%s 0x%llx\n", y);
// Collect all the previous rules as a dependecy, so that the rules below
// can depend only on "rules" instead of "rule1 || rule2 || ..."
@rules depends on rule1 || rule2 || rule3 || rule4 || rule5@
@@
NV_PRINTF2
// Replace the DBG_xxx or DEBUGLEVEL_xxx with LEVEL_xxx
@depends on rules@
@@
NV_PRINTF2(...,
-\(DBG_LEVEL_INFO \| DEBUGLEVEL_TRACEINFO \| DBG_LEVEL_SETUPINFO \| DEBUGLEVEL_SETUPINFO\)
+LEVEL_INFO
, ...);
@depends on rules@
@@
NV_PRINTF2(...,
-\(DBG_LEVEL_USERERRORS \| DEBUGLEVEL_USERERRORS\)
+LEVEL_NOTICE
, ...);
@depends on rules@
@@
NV_PRINTF2(...,
-\(DBG_LEVEL_WARNINGS \| DEBUGLEVEL_WARNINGS\)
+LEVEL_WARNING
, ...);
@depends on rules@
@@
NV_PRINTF2(...,
-\(DBG_LEVEL_ERRORS \| DEBUGLEVEL_ERRORS\)
+LEVEL_ERROR
, ...);
// -------------------------------
// Use Python to clean up the string literals.
// Comments are still C-style though
@r depends on rules@
expression x;
constant char[] c;
position p1, p2;
@@
NV_PRINTF2(x, c, ...)
@script:python s@
c << r.c;
c2;
p1 << r.p1;
p2 << r.p2;
@@
import re
print 'p1=', p1
print 'p2=', p2
// Convert a malformed multi-line string literal into one line
// Coccinelle sometimes takes care of this for us, but sometimes it doesn't
c = re.sub(r'\\\n[ ]*', '', c, re.DOTALL)
// Combine "xxx" "yyy" into "xxxyyy"
while True:
m = re.match(r'(.*)"([^"]+)" "(.*)', c)
if not m:
break
c = '%s"%s%s' % (m.group(1), m.group(2), m.group(3))
// Finally, remove the "NXXX: " prefix
c = re.sub(r'"N[\-A-Z]+[\: ]*', '"', c, 1)
coccinelle.c2 = c
@depends on rules@
expression x;
constant char[] r.c;
identifier s.c2;
@@
NV_PRINTF2(x,
-c
+c2
,...)
// -------------------------------
// Look for NV_PRINTF2 calls that have __FUNCTION__ or __func__ as the first parameter
@r2 depends on rules@
constant char[] c;
expression x;
symbol __func__;
@@
NV_PRINTF2(x, c, __FUNCTION__, ...)
// Get rid of __FUNCTION__ at the beginning of the string
@script:python s2@
c << r2.c;
c2;
@@
import re
coccinelle.c2 = re.sub('%s[: ]*', '', c, 1)
@depends on rules@
expression x;
constant char[] r2.c;
identifier s2.c2;
@@
NV_PRINTF2(x,
-c, __FUNCTION__
+c2
,...);
// -------------------------------
// Look for NV_PRINTF2 calls that have __FUNCTION__ or __func__ as the last parameter
@r3 depends on rules@
constant char[] c;
expression x;
symbol __func__;
@@
NV_PRINTF2(x, c, ..., __FUNCTION__)
// Get rid of __FUNCTION__ at the end of the string
@script:python s3@
c << r3.c;
c2;
@@
import re
print 'Start'
// Find the last [: ]*%s, and remove it
pos = [i.span() for i in re.finditer('[: ]*%s', c)][-1]
coccinelle.c2 = c[:pos[0]] + c[pos[1]:]
print 'End'
@depends on rules@
expression x;
constant char[] r3.c;
identifier s3.c2;
@@
NV_PRINTF2(x,
-c
+c2
,...);
// -------------------------------
// Look for NV_PRINTF2 calls that have the function name in the string
@r4 depends on rules@
identifier func;
expression x;
constant char[] c;
@@
func(...) {
<+...
NV_PRINTF2(x, c, ...)
...+>
}
// Get rid of the function name at the beginning of the string
@script:python s4@
c << r4.c;
c2;
f << r4.func;
@@
import re
coccinelle.c2 = re.sub('"%s[: ]*' % f, '"', c, 1)
@depends on rules@
expression x;
constant char[] r4.c;
identifier s4.c2;
@@
NV_PRINTF2(x,
-c
+c2
,...);
// -------------------------------
// Remove any unnecessary braces
//@depends on rules@
//expression list x;
//@@
//-{
//NV_PRINTF2(x);
//-}
// Finally, change NV_PRINT2 to NV_PRINTF. This has the side-effect of
// also compressing all the parameters into as few lines as possible.
@depends on rules@
expression list x;
@@
-NV_PRINTF2(x)
+NV_PRINTF(x)
[-- Attachment #3: Type: text/plain, Size: 136 bytes --]
_______________________________________________
Cocci mailing list
Cocci@systeme.lip6.fr
https://systeme.lip6.fr/mailman/listinfo/cocci
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [Cocci] Can the current function name be passed to a Python snippet?
2018-12-05 17:57 ` Timur Tabi
2018-12-05 18:32 ` Timur Tabi
@ 2018-12-05 19:11 ` Timur Tabi
2018-12-05 23:27 ` Timur Tabi
2018-12-05 19:32 ` Julia Lawall
2 siblings, 1 reply; 17+ messages in thread
From: Timur Tabi @ 2018-12-05 19:11 UTC (permalink / raw)
To: Julia Lawall; +Cc: cocci
On Wed, Dec 5, 2018 at 11:57 AM Timur Tabi <timur@kernel.org> wrote:
>
> @script:python s@
> c << r.c;
> c2;
> p1 << r.p1;
> @@
> import re
>
> print p1
>
> But that gave me this error:
>
> warning: r: metavariable p1 not used in the - or
Never mind, I now understand how the @p1 is supposed to be used. I
have it working now.
_______________________________________________
Cocci mailing list
Cocci@systeme.lip6.fr
https://systeme.lip6.fr/mailman/listinfo/cocci
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [Cocci] Can the current function name be passed to a Python snippet?
2018-12-05 17:57 ` Timur Tabi
2018-12-05 18:32 ` Timur Tabi
2018-12-05 19:11 ` Timur Tabi
@ 2018-12-05 19:32 ` Julia Lawall
2 siblings, 0 replies; 17+ messages in thread
From: Julia Lawall @ 2018-12-05 19:32 UTC (permalink / raw)
To: Timur Tabi; +Cc: cocci
On Wed, 5 Dec 2018, Timur Tabi wrote:
> On Wed, Dec 5, 2018 at 12:44 AM Julia Lawall <julia.lawall@lip6.fr> wrote:
> >
> > > > In the example, p1 will store the position of n. In the python rule, you
> > > > can then access p1[0].current_element to get the name of the function in
> > > > which n occurs.
> > >
> > > What do you mean by "position of n"?
> >
> > The code that n matches is in some file, within some function, at some
> > line number, and at some column offset. All of that information is
> > collected in p1.
>
> I'm having trouble figuring out how to access p1[0]. I tried this
>
> // Use Python to clean up the string literals.
> // Comments are still C-style though
> @r depends on rules@
> expression x;
> position p1;
> constant char[] c;
> @@
> NV_PRINTF2(x, c, ...)
You need to attach p1 to something. For example, you could say c@p1 or
x@p1 or )@p1
julia
>
> @script:python s@
> c << r.c;
> c2;
> p1 << r.p1;
> @@
> import re
>
> print p1
>
> But that gave me this error:
>
> warning: r: metavariable p1 not used in the - or
>
_______________________________________________
Cocci mailing list
Cocci@systeme.lip6.fr
https://systeme.lip6.fr/mailman/listinfo/cocci
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [Cocci] Can the current function name be passed to a Python snippet?
2018-12-05 17:49 ` Timur Tabi
@ 2018-12-05 19:33 ` Julia Lawall
0 siblings, 0 replies; 17+ messages in thread
From: Julia Lawall @ 2018-12-05 19:33 UTC (permalink / raw)
To: Timur Tabi; +Cc: cocci
On Wed, 5 Dec 2018, Timur Tabi wrote:
> On Wed, Dec 5, 2018 at 12:47 AM Julia Lawall <julia.lawall@lip6.fr> wrote:
> >
> > > and now it works. I don't know why I needed the +'s, but at least it
> > > works now. Thanks.
> >
> > This means that the rule only applies when there is at least one
> > occurrence of the pattern in between the <+... ...+>.
>
> Unfortunately, on some files, adding the + significantly slows down
> the script. It stalls for about 15-20 seconds a few times during
> parsing. Normally the while script takes about 1-2 seconds to run. I
> believe coccinelle is having trouble finding the functions because
> some my source files abuse C macros.
That wouldn't change by using <+... ...+>
Could you send the rule again? I could make another suggestion.
julia
_______________________________________________
Cocci mailing list
Cocci@systeme.lip6.fr
https://systeme.lip6.fr/mailman/listinfo/cocci
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [Cocci] Can the current function name be passed to a Python snippet?
2018-12-05 18:32 ` Timur Tabi
@ 2018-12-05 19:45 ` Julia Lawall
0 siblings, 0 replies; 17+ messages in thread
From: Julia Lawall @ 2018-12-05 19:45 UTC (permalink / raw)
To: Timur Tabi; +Cc: cocci
On Wed, 5 Dec 2018, Timur Tabi wrote:
> Another thing that I don't understand is why do I need to have two
> rules for every Python script? I've attached my .cocci file. Each
> Python script is in between a pair of //---- comments. They all have
> the same format:
>
> 1. One rule to specify the pattern to match
> 2. A Python script
> 3. Another rule to specify how to process the output of the Python script
>
> Can't I combine 1) and 3) into one rule?
No. It is possible to attach script code to metavariable declarations,
but only to express predicates. For example:
constant c : script:ocaml() { is_less_than_6 c };
is_less_than_6 would be defined in the @initialize:ocaml@ rule, and
takes a string as an argument, which is the potential term to bind to c,
and returns true or false.
julia
_______________________________________________
Cocci mailing list
Cocci@systeme.lip6.fr
https://systeme.lip6.fr/mailman/listinfo/cocci
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [Cocci] Can the current function name be passed to a Python snippet?
2018-12-05 19:11 ` Timur Tabi
@ 2018-12-05 23:27 ` Timur Tabi
2018-12-06 6:33 ` Julia Lawall
0 siblings, 1 reply; 17+ messages in thread
From: Timur Tabi @ 2018-12-05 23:27 UTC (permalink / raw)
To: Timur Tabi; +Cc: cocci
On Wed, Dec 5, 2018 at 1:11 PM Timur Tabi <timur@kernel.org> wrote:
>
> Never mind, I now understand how the @p1 is supposed to be used. I
> have it working now.
I spoke too soon, I'm getting a weird error:
rule starting on line 232: already tagged token:
C code context
File "/tmp/cocci_small_output-22474-8398df.c", line 43, column 23,
charpos = 1216
around = '"init_PllId: Error programming clock. Stopping script.\n"',
whole content = "init_PllId: Error
programming clock. Stopping script.\n");
Line 232 is the "depends on rule" in this snippet:
// Get rid of the function name at the beginning of the string
@script:python s4@
c << r4.c;
c2;
p1 << r4.p1;
@@
import re
f = p1[0].current_element
coccinelle.c2 = re.sub('"%s[: ]*' % f, '"', c, 1)
@depends on rules@
expression x;
constant char[] r4.c;
identifier s4.c2;
@@
NV_PRINTF2(x,
-c
+c2
,...);
_______________________________________________
Cocci mailing list
Cocci@systeme.lip6.fr
https://systeme.lip6.fr/mailman/listinfo/cocci
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [Cocci] Can the current function name be passed to a Python snippet?
2018-12-05 23:27 ` Timur Tabi
@ 2018-12-06 6:33 ` Julia Lawall
0 siblings, 0 replies; 17+ messages in thread
From: Julia Lawall @ 2018-12-06 6:33 UTC (permalink / raw)
To: Timur Tabi; +Cc: cocci
On Wed, 5 Dec 2018, Timur Tabi wrote:
> On Wed, Dec 5, 2018 at 1:11 PM Timur Tabi <timur@kernel.org> wrote:
> >
> > Never mind, I now understand how the @p1 is supposed to be used. I
> > have it working now.
>
> I spoke too soon, I'm getting a weird error:
>
> rule starting on line 232: already tagged token:
> C code context
> File "/tmp/cocci_small_output-22474-8398df.c", line 43, column 23,
> charpos = 1216
> around = '"init_PllId: Error programming clock. Stopping script.\n"',
> whole content = "init_PllId: Error
> programming clock. Stopping script.\n");
>
> Line 232 is the "depends on rule" in this snippet:
>
> // Get rid of the function name at the beginning of the string
> @script:python s4@
> c << r4.c;
> c2;
> p1 << r4.p1;
> @@
> import re
>
> f = p1[0].current_element
> coccinelle.c2 = re.sub('"%s[: ]*' % f, '"', c, 1)
>
> @depends on rules@
> expression x;
> constant char[] r4.c;
> identifier s4.c2;
> @@
> NV_PRINTF2(x,
> -c
> +c2
> ,...);
Probably the same string occurs in multiple functions, so you get multiple
new propositions for it. To guard against this, you should reuse the
position variable:
@depends on rules@
expression x;
constant char[] r4.c;
position r4.p1;
identifier s4.c2;
@@
NV_PRINTF2(x,
-c@p1
+c2
,...);
You may need to move the @p1. It should be in the same place that it
appears in r4.
julia
_______________________________________________
Cocci mailing list
Cocci@systeme.lip6.fr
https://systeme.lip6.fr/mailman/listinfo/cocci
^ permalink raw reply [flat|nested] 17+ messages in thread
end of thread, other threads:[~2018-12-06 6:34 UTC | newest]
Thread overview: 17+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-11-15 20:58 [Cocci] Can the current function name be passed to a Python snippet? Timur Tabi
2018-11-15 21:29 ` Julia Lawall
2018-12-04 20:17 ` Timur Tabi
2018-12-04 20:25 ` Julia Lawall
2018-12-04 22:02 ` Timur Tabi
2018-12-04 22:19 ` Timur Tabi
2018-12-05 6:35 ` Julia Lawall
2018-12-05 17:49 ` Timur Tabi
2018-12-05 19:33 ` Julia Lawall
2018-12-05 6:34 ` Julia Lawall
2018-12-05 17:57 ` Timur Tabi
2018-12-05 18:32 ` Timur Tabi
2018-12-05 19:45 ` Julia Lawall
2018-12-05 19:11 ` Timur Tabi
2018-12-05 23:27 ` Timur Tabi
2018-12-06 6:33 ` Julia Lawall
2018-12-05 19:32 ` Julia Lawall
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).