> -----Original Message-----
> From: Julia Lawall [mailto:[email protected]]
> Sent: Thursday, March 01, 2018 11:46 AM
> To: Allan, Bruce W <[email protected]>
> Cc: [email protected]
> Subject: Re: [Cocci] transform needing a calculation from a Python script
> 
> 
> 
> On Thu, 1 Mar 2018, Allan, Bruce W wrote:
> 
> >
> > We have a macro that takes a right-justified contiguous set of bits and
> > shifts it left to create a bitmask:
> >
> >
> >
> > #define FOO(m, s)            (m) << (s)
> >
> >
> >
> > where m is in hex and s is an integer.  I’d like to transform occurrences of
> > it to the Linux kernel’s GENMASK(high, low) macro (which creates a
> > contiguous bitmask starting at bit position low and ending at position
> > high), but am having problems trying to figure out how to do that.
> >
> >
> >
> > For example, I’d like to transform:
> >
> >                #define BITMASK_A         FOO(0x3F, 4)
> > /* 0x3F0 */
> >
> > to
> >
> >                #define BITMASK_A         GENMASK(9, 4)                 /*
> > 0x3F0 */
> >
> >
> >
> > The value s in FOO() is the same as the value low in GENMASK(), but the
> > value high in GENMASK() must be calculated from the values m and s in
> > FOO().  One calculation would be to use the hamming weight (hweight) such
> as
> > hweight(m) + s – 1.  My Python-foo is non-existent but I have found online
> > an example for calculating the hamming weight with the Python script ‘def
> > hweight(n): return bin(n).count("1")’.  Is it possible to use this (or
> > another) Python script in a Coccinelle script to do this transform, and if
> > so, what would that look like?  If the transform cannot use Python, is there
> > another suggestion?
> 
> I think that you can follow the model of the following code
> (demos/pythontococci.cocci).  Let me know if it is not clear.

Sorry, no, it is not clear to me how this works.

> 
> julia
> 
> @a@
> identifier x;
> @@
> 
> foo(x);
> 
> @script:python b@
> x << a.x;
> y;
> z;
> @@
> 
> print y
> coccinelle.y = x
> coccinelle.z = "something"
> print y
> 
> @c@
> identifier b.y;
> identifier b.z;
> identifier a.x;
> @@
> 
> - bar();
> + matched_bar(y,z,x);
_______________________________________________
Cocci mailing list
[email protected]
https://systeme.lip6.fr/mailman/listinfo/cocci

Reply via email to