FP targets analysis enhacements.

1) Function-pointer targets analysis now tracks annotated fp vars across assignments and method calls (i.e. you can pass an annotated fp var to a method and the analysis will follow the annotated set of targets into the method). So if you did:

void (*myfp)() = foo;
m(myfp);

void m(void(*fp)()) {
  fp();
}

Then the analysis would know that the call fp() would call foo.

2) Call graph is now iteratively updated during the FP-targets analysis. The call graph is updated every time the FP-targets analysis learns about the targets of a fp call, and this updated call graph is used by the FP-targets analysis when doing interprocedural propagation. Thus, you could do something like:

void (*myfp)() = foo;
m(myfp);

void m(void(*fp)()) {
  fp(fp);
}

void foo(void(*fp)()) {
  fp();
}

and the analysis would work out that the call fp() inside foo would call foo.