A quick fix is to add  disable decl_init,const_decl_init in your first 
rule r.  The problem is that it applies these isomorphisms, which relate 
to the possibility that the declared variable is initialized, even though 
within a structure declaration, no initializations are possible.  
Having multiple possibilities for the structure field causes the set of 
possible metavariable bindings to explode.

I have also done a few things that should improve the performance that 
will be in the next release (sometime this week), but it should be 
possible to get a result just with this fix.

Thanks for the feedback.

julia

On Mon, 4 Jan 2010, Németh Márton wrote:

> Julia Lawall wrote:
> > On Mon, 4 Jan 2010, Németh Márton wrote:
> > 
> >> Hi,
> >>
> >> I'm running the following SmPL using spatch 0.1.10 against Linux
> >> kernel 2.6.32-rc2, and it seems that the process stucks at a certain
> 
> Sorry, the real version I used is really 2.6.33-rc2.
> 
> >> file. My command line was the following:
> >>
> >> localhost:/usr/src/linux$ spatch -sp_file const_field2.spatch 
> >> -all_includes drivers/video/sis/initextlfb.c
> >>
> >> The spatch which causes the infinite loop is:
> >>
> >> // <smpl>
> >> @r@
> >> identifier I1, I2, x;
> >> @@
> >>    struct I1 {
> >>      ...
> >>      const struct I2 *x;
> >>      ...
> >>    };
> >> @s@
> >> identifier r.I1, y;
> >> identifier r.x, E;
> >> @@
> >>    struct I1 y = {
> >>      .x = E,
> >>    };
> >> @c@
> >> identifier r.I2;
> >> identifier s.E;
> >> @@
> >>    const struct I2 E[] = ... ;
> >> @depends on !c@
> >> identifier r.I2;
> >> identifier s.E;
> >> @@
> >> +  const
> >>    struct I2 E[] = ...;
> >> // </smpl>
> >>
> >> Should I enable some debug messages to find out more?
> > 
> > You could try the options -debug and -show_trying.
> 
> localhost:/usr/src/linux$ spatch -debug -show_trying -sp_file 
> /usr/src/spatch/const_field2.spatch -all_includes 
> drivers/video/sis/initextlfb.c
> init_defs_builtins: /usr/share/coccinelle/standard.h
> -----------------------------------------------------------------------
> processing semantic patch file: /usr/src/spatch/const_field2.spatch
> with isos from: /usr/share/coccinelle/standard.iso
> -----------------------------------------------------------------------
> // <smpl>
> @r@
> identifier I1, I2, x;
> @@
>       struct I1 {
>         ...
>         const struct I2 *x;
>         ...
>       };
> @s@
> identifier r.I1, y;
> identifier r.x, E;
> @@
>       struct I1 y = {
>         .x = E,
>       };
> @c@
> identifier r.I2;
> identifier s.E;
> @@
>       const struct I2 E[] = ... ;
> @depends on !c@
> identifier r.I2;
> identifier s.E;
> @@
> +     const
>       struct I2 E[] = ...;
> // </smpl>
> 
> HANDLING: drivers/video/sis/initextlfb.c
> -----------------------------------------------------------------------
> let's go
> -----------------------------------------------------------------------
> parse error
>  = error in include/linux/types.h; set verbose_parsing for more info
> badcount: 3
> bad: #ifdef   __KERNEL__
> bad:
> bad: #define DECLARE_BITMAP(name,bits) \
> BAD:!!!!!     unsigned long name[BITS_TO_LONGS(bits)]
> CFG: orphelin nodes, maybe something weird happened
> CFG: orphelin nodes, maybe something weird happened
> -----------------------------------------------------------------------
> r =
> -----------------------------------------------------------------------
> dependencies for rule r satisfied:
> binding in = []
> binding relevant in = []
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying variable SISIOADDRESS
>      trying something else
>      trying something else
>      trying variable IOADDRESS
>      trying variable SISIOADDRESS
>      trying variable SISIOADDRESS
>      trying variable SIS_CHIP_TYPE
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      (ONCE) PB: More that one variable in decl. Have to split
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
>      trying something else
> 
> And here no more lines are printed but the processing does not finish.
> 
> > From your semantic patch, I don't see what should cause an infinite loop.  
> > But it may be hitting a file that is very hard to parse, and so it is 
> > getting stuck there.  There are some firmware files, I think, that pose 
> > problems for parsing.  It should be printing out HANDLING messages that 
> > let you know what file is posing problems.  You may also want to unlimit 
> > your stack size.
> 
> Interesting thing is when I specify the -show_SP option an error message
> is printed and the processing stops:
> 
> $ spatch -show_SP -sp_file /usr/src/spatch/const_field2.spatch -all_includes 
> drivers/video/sis/initextlfb.c
> init_defs_builtins: /usr/share/coccinelle/standard.h
> @@
> r
> @@
> 
> 
> (
> struct r:I1 {...
> const struct r:I2 *r:x;
> ...};
> |
> struct r:I1 {...
> const struct r:I2 *r:x = r:_C_0;
> ...};
> |
> struct r:I1 {...
> const struct r:I2 *r:x = ...;
> ...};
> )
> @@
> s
> @@
> 
> struct r:I1 s:y = {.r:x = s:E,
>                    };
> @@
> c
> @@
> 
> Fatal error: exception Failure("complex array types not supported")
> 
> Regards,
> 
>       Márton Németh
> 
> 
_______________________________________________
Cocci mailing list
[email protected]
http://lists.diku.dk/mailman/listinfo/cocci
(Web access from inside DIKUs LAN only)

Reply via email to