<div dir="ltr">Hi,<div><br></div><div>You can use the -finstrument-functions program option of Clang to instrument each and every function call in a way to execute code before and after the body of the functions.</div><div><br></div><div>With finstrument-functions you will not be able to replace funtions, the original function will always be called. Note that there is a prototype implementation to make it possible to replace functions (that feature might be really handy in testing legacy code) : <a href="https://github.com/martong/finstrument_mock">https://github.com/martong/finstrument_mock</a></div><div><br></div><div>I am not sure what is the exact nature of the problem you want to solve, but perhaps the compiler is not the best tool to do such instrumentation. Generally the technique you want is called Function/Method Call Interception (FCI/MCI). One very good dynamic instrumentation tool is the debugger itself. For static binary instrumentation you could use e.g. Intel PIN. There is a great article about available FCI methods here: <a href="http://onlinelibrary.wiley.com/doi/10.1002/spe.2501/abstract">http://onlinelibrary.wiley.com/doi/10.1002/spe.2501/abstract</a></div><div><br></div><div>Cheers,</div><div>Gabor<br><br></div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Jun 23, 2017 at 5:50 AM, yonggang_chen via cfe-dev <span dir="ltr"><<a href="mailto:cfe-dev@lists.llvm.org" target="_blank">cfe-dev@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">





<div lang="ZH-CN" link="#0563C1" vlink="#954F72">
<div class="m_-8765798947822312033WordSection1">
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.5pt">Hello all,<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.5pt"><u></u> <u></u></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.5pt">I have a large project which consists of several millions of C++ code. Now I want to add a log function to each line of code. If do it manually, it’s almost impossible.<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.5pt"><u></u> <u></u></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.5pt">Suppose my original code is like this:<u></u><u></u></span></p>
<p class="MsoNormal" style="text-autospace:none"><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:blue">void</span><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:black">
</span><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:blue">snapshot_handler</span><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:black">::</span><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:#880000">mouseMoveEve<wbr>nt</span><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:black">(</span><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:blue">IDocView</span><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:black">*
</span><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:navy">pDocView</span><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:black">,
</span><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:blue">QMouseEvent</span><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:black"> *
</span><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:gray">event</span><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:black">)<u></u><u></u></span></p>
<p class="MsoNormal" style="text-autospace:none"><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:black">{<u></u><u></u></span></p>
<p class="MsoNormal" style="text-autospace:none"><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:black">   
</span><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:navy">pDocView</span><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:black">-></span><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:#880000">getViewPortWidget</span><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:black">()-<wbr>></span><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:#880000">setCursor</span><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:black">(</span><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:blue">Qt</span><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:black">::</span><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:#a000a0">CrossCursor</span><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:black">);<u></u><u></u></span></p>
<p class="MsoNormal" style="text-autospace:none"><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:black">   
</span><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:navy">m_ptEnd</span><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:black">
</span><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:teal">=</span><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:black">
</span><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:gray">event</span><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:black">-></span><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:#880000">pos</span><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:black">();<u></u><u></u></span></p>
<p class="MsoNormal" style="text-autospace:none"><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:black">   
</span><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:navy">pDocView</span><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:black">-></span><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:#880000">updateView</span><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:black">();<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:black">}<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:black"><u></u> <u></u></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:black">I want to log each line of code and the function:<u></u><u></u></span></p>
<p class="MsoNormal" style="text-autospace:none"><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:blue">void</span><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:black">
</span><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:blue">snapshot_handler</span><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:black">::</span><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:#880000">mouseMoveEve<wbr>nt</span><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:black">(</span><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:blue">IDocView</span><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:black">*
</span><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:navy">pDocView</span><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:black">,
</span><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:blue">QMouseEvent</span><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:black"> *
</span><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:gray">event</span><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:black">)<u></u><u></u></span></p>
<p class="MsoNormal" style="text-autospace:none"><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:black">{<u></u><u></u></span></p>
<p class="MsoNormal" style="text-autospace:none"><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:black">    Log << “</span><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:#880000">mouseMoveEvent;</span><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:black"><u></u><u></u></span></p>
<p class="MsoNormal" style="text-autospace:none"><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:black">    Log <<
</span><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:navy">pDocView</span><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:black">-></span><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:#880000">getViewPortWidget</span><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:black">()-<wbr>></span><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:#880000">setCursor</span><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:black">(</span><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:blue">Qt</span><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:black">::</span><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:#a000a0">CrossCursor</span><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:black">);<u></u><u></u></span></p>
<p class="MsoNormal" style="text-autospace:none"><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:black">    Log <<
</span><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:navy">m_ptEnd</span><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:black">
</span><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:teal">=</span><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:black">
</span><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:gray">event</span><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:black">-></span><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:#880000">pos</span><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:black">();<u></u><u></u></span></p>
<p class="MsoNormal" style="text-autospace:none"><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:black">    Log <<
</span><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:navy">pDocView</span><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:black">-></span><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:#880000">updateView</span><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:black">();<u></u><u></u></span></p>
<p class="MsoNormal" style="text-autospace:none"><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:black">    Log << “elapsed time in seconds”;<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:black">}<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.5pt"><u></u> <u></u></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.5pt">Can Clang support doing this? If so, how can achieve such requirements?<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.5pt"><u></u> <u></u></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.5pt">Best regards<span class="HOEnZb"><font color="#888888"><u></u><u></u></font></span></span></p><span class="HOEnZb"><font color="#888888">
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.5pt">Yonggang Chen<u></u><u></u></span></p>
</font></span></div>
</div>

<br>______________________________<wbr>_________________<br>
cfe-dev mailing list<br>
<a href="mailto:cfe-dev@lists.llvm.org">cfe-dev@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/cfe-dev</a><br>
<br></blockquote></div><br></div>