<div dir="ltr"><div>Sorry, not sure how to actually do that - I work on my own compiler project (a Pascal compiler), and dabble in changing Clang on the odd occasion, but I don't work with the parts that would be useful here. <br></div><div><br>If I wanted to do this, I would probably look for "CallExpr" (or something similar) in the AST, and then go from there - but you may have to introduce your own temporary variables, as those are probably not present at the AST level - they certainly aren't in my compiler, the return value is just "used" as is, without being stored. Adding variables may not be trivial, as you need to do that in a way that matches the behavious expected by the rest of the compiler - you can't necessarily introduce new variables inside a function call for example - so you perhaps can't do `int temp2 = foo(int temp1 = foo(42));`, even if that's what you conceptually would like to have. I'm not sure exactly how you actually go about writing code for this... <br></div><div><br>--<br></div>Mats<br></div><div class="gmail_extra"><br><div class="gmail_quote">On 8 August 2017 at 18:27, Marcel Schaible <span dir="ltr"><<a href="mailto:marcel@schaible-consulting.de" target="_blank">marcel@schaible-consulting.de</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">I would think (in fact, I _KNOW_) that the compiler already does the transformation to temp1 = foo(42) and temp2 = foo(temp1) already. So it'd just be a case, at the LLVM-IR level at least, to insert some code to inspect temp1 and temp2.<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
</blockquote></span>
Good hint. I'll check that.<span class=""><br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Of course, it may be a slightly more interesting challenge to find your "interesting functions" (particularly if interesting functions aren't a well defined set of functions) when looking at the LLVM-IR - including the fact that for example member functions gets mangled during compilation.<br>
<br>
</blockquote></span>
"Interesting functions" are marked by the developer.<span class=""><br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Also interesting/challenging is function pointers:<br>
<br>
    pf = foo;<br>
    var = 42 + pf(pf(42));<br>
<br>
Consider where pf is passed into the function you're currently looking at, or comes from a table of function pointers, with a non-constant determining the index into the table.<br>
A similar problem is of course virtual function calls - they are just function pointer tables after all [but the table itself is the variable part there, rather than the index, unless we're talking virtual member function pointers, which isn't a common creature by any means]<br>
</blockquote>
<br></span>
At the first shot I'll attack the trivial cases. So function pointer are on my list but come at a later point in time. Because the target are embedded devices, which in my case are programmed exclusively in plain "C"<br>
I'll ignore for the moment vtables.<br>
<br>
Anyway I would like to implement the dissecting of the expression my self with the clang frontend. Any hints on that?<br>
--<br>
Marcel<br>
</blockquote></div><br></div>