On Tue, 12 Mar 2019, Maxime Ripard wrote:

> Hi Julia,
>
> Thanks a lot for your answer,
>
> On Tue, Mar 12, 2019 at 10:03:57AM +0100, Julia Lawall wrote:
> > > @@
> > > expression arg;
> > > identifier fb;
> > > @@
> > > ...
> > > struct drm_framebuffer *fb;
> > > ...
> > > - drm_format_num_planes(arg)
> > > + fb->format->num_planes
> > >
> > > // This one seems to work in some cases, such as
> > > // 
> > > https://elixir.bootlin.com/linux/v5.0/source/drivers/gpu/drm/vc4/vc4_plane.c#L490
> > > // But it also matches in cases where fb hasn't been properly assigned 
> > > before, such as:
> > > // 
> > > https://elixir.bootlin.com/linux/v5.0/source/drivers/gpu/drm/tegra/fb.c#L142
> >
> > OK, it looks like what you want is:
> >
> > @@
> > struct drm_framebuffer *fb;
> > expression e.
> > @@
> >
> > fb = e;
> > <...
> > - drm_format_num_planes(arg)
> > + fb->format->num_planes
> > ...>
> >
> > That is, you find an assignment of fb, and then anywhere after that you
> > have a call, you can replace it.  This is <... ...> rather than <+...
> > ...+> so that it can match several 0 or more occurrences.
>
> It looks however that there's a difference between a variable
> declaration and assignment, and only an assignment.
>
> The snippet above doesn't match
> https://elixir.bootlin.com/linux/v5.0/source/drivers/gpu/drm/vc4/vc4_plane.c#L490
>
> Whereas using
>
> @@
> identifier fb;
> expression arg;
> expression e;
> @@
>
>   struct drm_framebuffer *fb = e;
>   <...
> - drm_format_num_planes(arg)
> + fb->format->num_planes
>   ...>
>
> Work for example. Is there a way to match both an assignment and a
> declaration + assignment?

Try dropping the ; on the assignment fb = e

>
> The following script covers all cases now:

Great!

julia

> @@
> identifier fn;
> identifier dev, cmd;
> @@
>
> fn (struct drm_device *dev,
>     ...,
>     struct drm_mode_fb_cmd2 *cmd,
>     ...)
> {
> + const struct drm_format_info *info = drm_get_format_info(dev, cmd);
>   <+...
> - drm_format_num_planes(cmd->pixel_format)
> + info->num_planes
>   ...+>
> }
>
> @@
> struct drm_framebuffer *fb;
> @@
>
> - drm_format_num_planes(fb->format->format)
> + fb->format->num_planes
>
> @@
> identifier fb;
> expression arg;
> expression e;
> @@
>
>   struct drm_framebuffer *fb = e;
>   <...
> - drm_format_num_planes(arg)
> + fb->format->num_planes
>   ...>
>
> @@
> struct drm_format_info *info;
> @@
>
> - drm_format_num_planes(info->format)
> + info->num_planes
>
> @@
> identifier val;
> expression arg;
> @@
>
> {
> + const struct drm_format_info *info;
>   <+...
> - val = drm_format_num_planes(arg);
> + info = drm_format_info(arg);
> + val = info->num_planes;
>   ...+>
> }
>
> @ rfunc @
> identifier f = drm_format_num_planes;
> identifier fourcc;
> typedef uint32_t;
> @@
>
> - int f(uint32_t fourcc)
> - {
> - ...
> - }
>
> @@
> identifier rfunc.f;
> declarer name EXPORT_SYMBOL;
> @@
>
> - EXPORT_SYMBOL(f);
>
> Thanks again!
> Maxime
>
> --
> Maxime Ripard, Bootlin
> Embedded Linux and Kernel engineering
> https://bootlin.com
>
_______________________________________________
Cocci mailing list
[email protected]
https://systeme.lip6.fr/mailman/listinfo/cocci

Reply via email to