Loops can have multiple back edges and cleaned up instrumentation removal
authorKevin Roundy <roundy@bleu.cs.wisc.edu>
Tue, 22 Jun 2010 15:10:49 +0000 (10:10 -0500)
committerKevin Roundy <roundy@bleu.cs.wisc.edu>
Tue, 22 Jun 2010 15:10:49 +0000 (10:10 -0500)
commitdffe42a1e31bd1dec4d4f62c59e80a717afe7966
tree171372de94f607d5949a35755cd82734e57d2039
parentdb7b28714cad69d827ff8a5e583ae8f147db5dc3
Loops can have multiple back edges and cleaned up instrumentation removal

1. In a previous commit I resolved a bug in our creation of a hierarchy between the natural loops in a function so that two loops with different back edges but the same set of nodes would not be assigned to be each other's parents.  This solution was unsatisfactory because it could cause confusion to a user that instruments both loops.  With this commit, if multiple back edges define a loop with the same set of blocks, we create a single loop with multiple back edges.  This required the creation of a new API function:

// returns the # of back edges and loads the edges vector
int BPatch_basicBlockLoop::getBackEdges (BPatch_Vector<BPatch_edge*> &edges);

Here is an example of two natural loops comprising the same set of nodes that are defined by two back edges, the edge from 2 to 1 and the edge from 3 to 1.
    ____
   /    \
   1<-\ |
   |  | |
/->2--/ |
|  |    |
|  3----/
\  |
 --4

2. Instrumentation removal (through BPatch_addressSpace::deleteSnippet) was leaving dangling pointers to BPatchSnippetHandles in BPatch_point objects.  I fixed this by having deleteSnippet invoke a new function in  BPatch_point to have it clean up its datastructures.
dyninstAPI/h/BPatch_basicBlockLoop.h
dyninstAPI/h/BPatch_point.h
dyninstAPI/src/BPatch_addressSpace.C
dyninstAPI/src/BPatch_basicBlockLoop.C
dyninstAPI/src/BPatch_flowGraph.C
dyninstAPI/src/BPatch_point.C