Fix bugs in copying loop tree info
[dyninst.git] / dyninstAPI / src / BPatch_loopTreeNode.C
1 /*
2  * See the dyninst/COPYRIGHT file for copyright information.
3  * 
4  * We provide the Paradyn Tools (below described as "Paradyn")
5  * on an AS IS basis, and do not warrant its validity or performance.
6  * We reserve the right to update, modify, or discontinue this
7  * software at any time.  We shall have no obligation to supply such
8  * updates or modifications or any other form of support to you.
9  * 
10  * By your use of Paradyn, you understand and agree that we (or any
11  * other person or entity with proprietary rights in Paradyn) are
12  * under no obligation to provide either maintenance services,
13  * update services, notices of latent defects, or correction of
14  * defects for Paradyn.
15  * 
16  * This library is free software; you can redistribute it and/or
17  * modify it under the terms of the GNU Lesser General Public
18  * License as published by the Free Software Foundation; either
19  * version 2.1 of the License, or (at your option) any later version.
20  * 
21  * This library is distributed in the hope that it will be useful,
22  * but WITHOUT ANY WARRANTY; without even the implied warranty of
23  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
24  * Lesser General Public License for more details.
25  * 
26  * You should have received a copy of the GNU Lesser General Public
27  * License along with this library; if not, write to the Free Software
28  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
29  */
30
31 #define BPATCH_FILE
32
33 #include "dyninstAPI/src/util.h"
34 #include "dyninstAPI/src/function.h"
35 #include "dyninstAPI/src/BPatch_libInfo.h"
36 #include "dyninstAPI/h/BPatch_loopTreeNode.h"
37 #include "dyninstAPI/h/BPatch_basicBlockLoop.h"
38 #include "dyninstAPI/h/BPatch_function.h"
39 #include "dyninstAPI/h/BPatch_process.h"
40 #include "BPatch_flowGraph.h"
41 #include "PatchCFG.h"
42
43 using namespace Dyninst::PatchAPI;
44
45
46 BPatch_loopTreeNode::BPatch_loopTreeNode(BPatch_flowGraph* fg, 
47                                          PatchLoopTreeNode* tree,
48                                          std::map<PatchLoop*, BPatch_basicBlockLoop*>& loopMap)
49 {
50     if (tree->loop != NULL) {
51         loop = loopMap[tree->loop];
52         hierarchicalName = strdup(tree->name());
53     } else {
54         loop = NULL;
55         hierarchicalName = NULL;
56     }
57     
58     for (auto cit = tree->children.begin(); cit != tree->children.end(); ++cit)
59         children.push_back(new BPatch_loopTreeNode(fg, *cit, loopMap));
60
61     vector<PatchFunction*> patchCallees;
62     tree->getCallees(patchCallees);
63     for (auto fit = patchCallees.begin(); fit != patchCallees.end(); ++fit)
64         callees.push_back(SCAST_FI(*fit));
65
66 }
67  
68
69 const char * 
70 BPatch_loopTreeNode::getCalleeName(unsigned int i) 
71 {
72     assert(i < callees.size());
73     assert(callees[i] != NULL);
74     return callees[i]->prettyName().c_str();
75 }
76
77 const char * 
78 BPatch_loopTreeNode::name()
79 {
80     assert(loop != NULL);
81     return hierarchicalName; 
82 }
83
84 unsigned int
85 BPatch_loopTreeNode::numCallees() { 
86     return callees.size(); 
87 }
88
89
90 BPatch_loopTreeNode::~BPatch_loopTreeNode() {
91     // Loops are deleted by BPatch_flowGraph...
92     for (unsigned i = 0; i < children.size(); i++)
93         delete children[i];
94     if (hierarchicalName)
95         free(hierarchicalName);
96     // don't delete callees!
97 }
98
99
100 BPatch_basicBlockLoop *
101 BPatch_loopTreeNode::findLoop(const char *name) 
102
103     if (loop) {
104         if (0==strcmp(name,hierarchicalName)) 
105             return loop;
106     }
107     for (unsigned i = 0; i < children.size(); i++) {
108         BPatch_basicBlockLoop *lp = children[i]->findLoop(name);
109         if (lp) return lp;
110     }
111     return NULL;
112 }
113
114 bool BPatch_loopTreeNode::getCallees(BPatch_Vector<BPatch_function *> &v,
115                                         BPatch_addressSpace *p)
116 {
117    for (unsigned i=0; i<callees.size(); i++) {
118       //  get() will not allocate a NULL entry in the map
119       BPatch_function *f = p->findOrCreateBPFunc(callees[i], NULL);
120       v.push_back(f);
121    }
122    return true;
123 }