<div dir="ltr">Hi Julia,<div><br></div><div>Thanks a lot! This patch works great :)</div><div><br></div><div><br></div><div>FYI, after applying the patch to remove the MACROs the compiler was complaining because the variable that was previously assigned the return value is now initialized.</div><div>I have extended the patch to fix this compilation error and I ended up with the following:</div><div><br></div><div><div>@bad_func_ret@</div><div>statement S;</div><div>position p;</div><div>identifier virtual.FUNC;</div><div>identifier r, f;</div><div>@@</div><div><br></div><div>r = f(..., FUNC(...)@S@p, ...);</div><div><br></div><div><br></div><div>@@</div><div>statement bad_func_ret.S;</div><div>position bad_func_ret.p;</div><div>identifier bad_func_ret.r;</div><div>identifier virtual.RET;</div><div>@@</div><div><br></div><div>+#if 0</div><div>S@p</div><div>+#else</div><div>+r = RET;</div><div>+#endif</div><div><br></div><div>@bad_func_ret2@</div><div>statement S;</div><div>position p;</div><div>identifier virtual.FUNC;</div><div>identifier r, f;</div><div>@@</div><div><br></div><div>r = FUNC(...)@S@p;</div><div><br></div><div><br></div><div>@@</div><div>statement bad_func_ret2.S;</div><div>position bad_func_ret2.p;</div><div>identifier bad_func_ret2.r;</div><div>identifier virtual.RET;</div><div>@@</div><div><br></div><div>+#if 0</div><div>S@p</div><div>+#else</div><div>+r = RET;</div><div>+#endif</div></div><div><br></div><div><br></div><div><br></div><div>The two cases are required (?) to make sure that patch works both when the MACRO is used inside another function (case 1) or as a standalone function (case 2).</div><div>There is some repetition, but it is still much better than my original patch!</div><div><br></div><div>Thanks!<br>Andrea</div><div><br></div><div><br></div></div><br><div class="gmail_quote"><div dir="ltr">On Thu, Apr 20, 2017 at 11:31 PM Julia Lawall <<a href="mailto:julia.lawall@lip6.fr">julia.lawall@lip6.fr</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><br>
<br>
On Mon, 17 Apr 2017, Andrea Grandi wrote:<br>
<br>
> Hello!<br>
><br>
> I am back porting a set of old header files into a recent version of my C<br>
> project. The old header files don't have the definition of various macros<br>
> (i.e. #define) that are currently used in the library. This is causing<br>
> various compilation errors.<br>
><br>
> I'd like to use Coccinelle to place #if 0 around the expressions as a<br>
> temporary workaround in order to fix the compilation errors.<br>
><br>
> I know it's a very powerful tool, but I have just started using it and I<br>
> would need some help writing the semantic patch.<br>
><br>
> Here is a very simple example of what I have done so far:<br>
><br>
> @@<br>
> identifier a;<br>
> expression P, N;<br>
> @@<br>
> -a = MACRO(P, N);<br>
> +// TODO: MACRO does not exist in old header<br>
> +#if 0<br>
> +a = MACRO (P, N);<br>
> +#endif<br>
> +a = 0;<br>
><br>
> In some case, the macro is used inside a function call. In order to catch<br>
> this scenario I had to write something more verbose and less generic like:<br>
><br>
> @@<br>
> expression E, D, err, P;<br>
> identifier f;<br>
> @@<br>
> -err = f(P, MACRO(E, 0), D);<br>
> +// TODO: MACRO does not exist in old header<br>
> +#if 0<br>
> +err = f(P, MACRO(E, 0), D);<br>
> +#endif<br>
> +err = OK;<br>
><br>
> Finally, there are cases where the macro is used inside an if condition. For<br>
> example:<br>
><br>
> if (a > MACRO(A, B)) {<br>
>    // Various lines of code<br>
> }<br>
><br>
> What I'd like to do here would be to put #if 0 around the whole block of<br>
> code.<br>
><br>
> #if 0<br>
> if (a > MACRO(A, B)) {<br>
>    // Various lines of code<br>
> }<br>
> #endif<br>
><br>
> Is there a way in Coccinelle to cover all the three cases above with a<br>
> single expression?<br>
<br>
@bad@<br>
statement S;<br>
position p;<br>
@@<br>
<br>
MACRO(...)@S@p<br>
<br>
@@<br>
statement bad.S;<br>
position bad.p;<br>
@@<br>
<br>
+#if 0<br>
S@p<br>
+#endif<br>
<br>
<br>
><br>
> Also, considering that I should replace a number of macros, is there a way<br>
> to create a generic semantic patch and use it multiple times by simply<br>
> providing different macro names? Sort of like calling a function multiple<br>
> times with different arguments.<br>
<br>
Replace the first rule by:<br>
<br>
@bad@<br>
statement S;<br>
position p;<br>
identifier virtual.MACRO;<br>
@@<br>
<br>
MACRO(...)@S@p<br>
<br>
Then on the command line, you can do -D MACRO=macro_name<br>
<br>
julia</blockquote></div>