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?

The following script covers all cases now:

@@
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

Attachment: signature.asc
Description: PGP signature

_______________________________________________
Cocci mailing list
[email protected]
https://systeme.lip6.fr/mailman/listinfo/cocci

Reply via email to