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