Hi Julia,

thanks for the long explanation. With the great help of Viresh, it is
almost done. However I miss a rule to add a comment description in the
comment cartridge of the changed function.

/**


 * cpuhp_setup_state - Setup hotplug state
 *
 * @state:      The state for which the calls
 * @name:       Name of the callback
 * @startup:    startup callback function
 * @teardown:   teardown callback function
+ * @data:       startup/teardown's cookie
 *
 * Installs the callback functions and invokes the startup
 * callback on the present cpus which have already reached
 * the @state.
 */

Apparently, coccinelle does not like the '@' symbol.

Is it possible to add such comment ?

Thanks !

  -- Daniel

On 03/11/2016 07:17, Julia Lawall wrote:

> 
> 
> On Thu, 3 Nov 2016, Daniel Lezcano wrote:
> 
>> On 02/11/2016 22:40, Julia Lawall wrote:
>>>
>>>
>>> On Wed, 2 Nov 2016, Daniel Lezcano wrote:
>>>
>>>> Hi all,
>>>>
>>>> I'm very new to coccinelle, so sorry if the question is irrelevant or was 
>>>> already asked.
>>>>
>>>> I'm trying to add a new argument to a function which has a couple of 
>>>> callbacks.
>>>>
>>>> The original function is:
>>>>
>>>> static inline int cpuhp_setup_state(enum cpuhp_state state,
>>>>                                int (*startup)(unsigned int cpu),
>>>>                                int (*teardown)(unsigned int cpu));
>>>>
>>>> I would like to pass a private pointer when setting the state and then pass
>>>> this pointer to the 'startup' / 'teardown' callbacks where there signature 
>>>> will be
>>>> different and all call sites must change their callbacks signature also.
>>>>
>>>> I tried to first add the new argument to the function, in order to have:
>>>>
>>>> static inline int cpuhp_setup_state(enum cpuhp_state state,
>>>>                                int (*startup)(unsigned int cpu),
>>>>                                int (*teardown)(unsigned int cpu),
>>>>                                void *data);
>>>>
>>>> ... with the rule:
>>>>
>>>> @rule@
>>>> identifier cpuhp_setup_state;
>>>> identifier state, name, startup, teardown, data;
>>>> @@
>>>>
>>>> static inline int cpuhp_setup_state(enum cpuhp_state state,
> 
> Here you make the name of the function a metavariable.  This will cause it
> to make the change to any function with any name that has a signature that
> looks like this.  If you want it to be only this function, you should not
> declare its name as a metavariable, but just put it directly.  For the
> parameter names, it will give the warning you have below about cpu if you
> don't either make them metavariables with identifier, or declare them with
> symbol, indicating that you know that you really want that name.  But you
> can also just ignore the warning.
> 
> The second problem is that this function is defined in a header file.
> Coccinelle does not automatically include everything that is indicated
> with #include.  Indeed, it doesn't run the C preprocessor at all.  If you
> give the option --no-includes then you will get no includes at all.  The
> default with no options is to include the local files and those with the
> same name as the .c file, ie foo.h for foo.c.  --all-includes gives all
> the include files mentioned in the .c file.  --recursive-includes gives
> all the files they include and so on.  The more include files you have,
> the more time everthing will take.  In your case, --recursive-includes
> would be needed to see the definition at the same time as the use, because
> the function is defined in include/linux/cpuhotplug.h, which is not
> included explicitly.  But that would probably take a huge amount of time.
> 
> Actually, all you want to do is process the relevant definition in the
> relevant include file once, not once for every file that it is included
> in.  So you want the options --include-headers --no-includes.  Without
> --include-headers, Coccinelle will only look at the .c files.
> 
> Since you are working on a specific function with a known name, you can
> benefit from indexing.  You may want to first rule
> coccinelle/scripts/idutile_index.sh on your kernel source tree.  Then put
> --use-idutils at the end of your command line.  You can also run mkid
> directly in your kernel source tree.  That will give the index a name that
> is different than what Coccinelle expects, and you will have to give the
> name of the index as an argument to --use-idutils.  You can also run
> Coccinelle in parallel with the -j option.
> 
> julia
> 
> 
>>>>                                     const char *name,
>>>>                                     int (*startup)(unsigned int cpu),
>>>>                                     int (*teardown)(unsigned int cpu),
>>>>                                void *data)
>>>> {
>>>>    ...
>>>> }
>>>>
>>>> @@
>>>> identifier rule.cpuhp_setup_state;
>>>> expression E1, E2, E3, E4;
>>>> @@
>>>>
>>>> cpuhp_setup_state(E1, E2, E3, E4
>>>> +                 , NULL
>>>>             )
>>>>
>>>> But the parsing gives:
>>>>
>>>> ...
>>>>
>>>> cpuhp_setup_state(E1, E2, E3, E4
>>>>                     >>> , NULL
>>>
>>> This is normal.  The >>> has to do with whether the NULL is to be put
>>> after what comes before or before what comes after. <<< would mean the
>>> opposite.  Unfortunately, I don't remember which is which, but it doesn't
>>> really matter in this case either.
>>>
>>>>                   )
>>>>
>>>>
>>>> grep tokens
>>>> cpuhp_state || cpu
>>>> No query
>>>> warning: line 8: should cpu be a metavariable?
>>>> warning: line 9: should cpu be a metavariable?
>>>
>>> I guess you would want an identifier cpu metavriable declaration in the
>>> first rule.  Otherwise, I don't really see any problems.  Do you have a .c
>>> file on which you expect to get a result?
>>
>> Yes, that is all around the linux kernel code (eg.
>> ./drivers/clocksource/qcom-timer.c)
>>
>> If I change the cocci file to:
>>
>> @@
>> expression E1, E2, E3, E4;
>> @@
>>
>> -cpuhp_setup_state(E1, E2, E3, E4)
>> +cpuhp_setup_state(E1, E2, E3, E4, NULL)
>>
>> It seems to work, except the function signature itself is not changed. I
>> can do add a manual change in the patch but if coccinelle can handle
>> both that would be nice.
>>
>> --
>>  <http://www.linaro.org/> Linaro.org │ Open source software for ARM SoCs
>>
>> Follow Linaro:  <http://www.facebook.com/pages/Linaro> Facebook |
>> <http://twitter.com/#!/linaroorg> Twitter |
>> <http://www.linaro.org/linaro-blog/> Blog
>>
>>
> 


-- 
 <http://www.linaro.org/> Linaro.org │ Open source software for ARM SoCs

Follow Linaro:  <http://www.facebook.com/pages/Linaro> Facebook |
<http://twitter.com/#!/linaroorg> Twitter |
<http://www.linaro.org/linaro-blog/> Blog

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

Reply via email to