Julia Lawall wrote:
> At the moment, I think it is not possible, because the SmPL language does 
> not include attributes. But they do seem to be in the C AST, so perhaps 
> they could be added.  I will look into it.

The __devinitdata and __devinitconst are defined in linux/init.h using the
__section macro. The __section macro is defined in linux/compiler.h and ends
in an attribute, so it seems that this is really not possible with the current
SmPL language:

#define __devinitdata    __section(.devinit.data)
#define __devinitconst   __section(.devinit.rodata)
#define __section(S) __attribute__ ((__section__(#S)))

Regards,

        Márton Németh

> On Mon, 4 Jan 2010, Németh Márton wrote:
> 
>> Németh Márton wrote:
>>> Julia Lawall wrote:
>>>> My thought was to find a field that is declared as const, then find a 
>>>> static initialization of that field, and then convert the initialized 
>>>> value to const.  So it would be something like:
>>>>
>>> [snip]
>>>> You would of course have to check that const is not already there as you 
>>>> have done in your previous rule.
>>>>
>>>> I have not tested this at all.
>>> Here is the working version based on your one. This one can find the
>>> control descriptor the same like the original SmPL did. The "-all_includes"
>>> option has to be used.
>>>
>>> [snip]
>> I run the SmPL against the Linux kernel 2.6.32-rc2. In some cases there is
>> the __devinitdata is also specified. When adding "const" the __devinitdata 
>> has
>> to be also changed to __devinitconst. I tried like this, but something is 
>> needed
>> to tell spatch about "__devinitdata":
>>
>> // <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[] = ... ;
>> @i depends on !c@
>> identifier r.I2;
>> identifier s.E;
>> @@
>> +    const
>>      struct I2
>> -    __devinitdata
>> +    __devinitconst
>>      E[] = ...;
>> @depends on !c && !i@
>> identifier r.I2;
>> identifier s.E;
>> @@
>> +    const
>>      struct I2 E[] = ...;
>> // </smpl>
>>
>> Here is the test c file:
>> ---8<---- cut here ---8<---
>>
>> struct A {
>>      int aa;
>>      const int ab;
>>      int ac;
>> };
>>
>> struct B {
>>      int ba;
>>      const int bb;
>> };
>>
>> struct C {
>>      const struct A *pa;
>>      struct B *pb;
>> };
>>
>> struct A __devinitdata x[] = {
>>      {
>>              0,
>>              1,
>>              2
>>      }
>> };
>>
>> struct B __devinitdata z[] = {
>>      {
>>              7,
>>              8,
>>      }
>> };
>>
>> struct C __devinitdata q = {
>>      .pa = x,
>>      .pb = z,
>> };
>> ---8<---- cut here ---8<---
>>
>> The expected patch would be:
>> --- test4.c     2010-01-04 06:54:51.000000000 +0100
>> +++ /tmp/cocci-output-6242-194b66-test4.c       2010-01-04 
>> 07:11:11.000000000 +0100
>> @@ -15,7 +15,7 @@ struct C {
>>         struct B *pb;
>>  };
>>
>> -struct A __devinitdata x[] = {
>> +const struct A __devinitconst x[] = {
>>         {
>>                 0,
>>                 1,
>>
>> How can I express the "__devinitdata" in SmPL?
>>
>> 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