[cfe-dev] source-to-source transformation to insert instrumentation calls
Jan Smets
jan.smets at alcatel-lucent.com
Mon Sep 24 14:07:49 PDT 2012
On 24/09/2012 18:57, Ronan Keryell wrote:
>>>>>> On Mon, 24 Sep 2012 18:50:36 +0300, Dmitri Gribenko <gribozavr at gmail.com> said:
> Dmitri> On Mon, Sep 24, 2012 at 6:43 PM, Jan Smets <jan.smets at alcatel-lucent.com> wrote:
> >> That's OK. I'm aware that I won't be 100% accurate.
>
> Dmitri> OK, good to know.
>
> >> Now I just need to figure out a good location to insert the call!
> >> :)
>
> Dmitri> I think that there are cases where inserting instrumentation
> Dmitri> calls will require non-trivial rewriting. For example:
>
> Dmitri> int f(int, int);
> Dmitri> int g(int *);
> Dmitri> int test(int *a) {
> Dmitri> f(*a, g(a));
> Dmitri> }
>
> Dmitri> Function argument evaluation order is unspecified, so we can
> Dmitri> not simply insert an instrumentation call for *a before f()
> Dmitri> because *a can be evaluated after g(a), which can change *a.
>
> Dmitri> So we need to make an arbitrary decision ourselves and
> Dmitri> rewrite this to something like:
>
> Dmitri> int test(int *a) { int tmp1 = *a; int tmp2 = g(a); f(tmp1,
> Dmitri> tmp2); }
>
> Dmitri> I didn't give this much thought, but I suspect there are
> Dmitri> much more cases like this.
>
> Yes, for example with side effect operators like ++ or -=, etc.
>
> To deal with this kind of stuff in our own source-to-source compiler we
> use the "," sequence operator to capture some values right from inside
> the battle field.
>
> For example you could compile this to:
> int f(int, int);
> int g(int *);
> int test(int *a) {
> f((instrument_read(*a, 4), *a), (instrument_read(a, 4), g(a)));
> }
>
> That should work if the function formal argument evaluation order is
> consistent for any call.
>
> But, well, I guess we have enough work to deal with well-written
> programs before dealing with all this wicked stuff... :-)
I realize that it won't be easy to handle these exceptional things, my
basic aim is at the trivial assignments, compares, things inside
if/while/for etc. The basic stuff.
So I would like to know how I can do just that.
As I said, I think I need to walk up the AST tree and find the
intersection point with the CompountStmt. How can I do that? How do I
get the parent?
Thanks again.
More information about the cfe-dev
mailing list