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