Initial commit of StackwalkerAPI
[dyninst.git] / stackwalk / src / steppergroup.C
1 /*
2  * Copyright (c) 1996-2007 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 #include "steppergroup.h"
33 #include "framestepper.h"
34 //#include "addrRange.h"
35
36 using namespace Dyninst;
37 using namespace Dyninst::Stackwalker;
38
39 FrameStepper *StepperWrapper::getStepper() const {
40     return stepper;
41 }
42
43 StepperGroup::StepperGroup(Walker *new_walker) :
44     walker(new_walker)
45 {
46     assert(walker);
47 }
48
49 StepperGroup::~StepperGroup() 
50 {
51 }
52
53 Walker *StepperGroup::getWalker() const 
54 {
55     assert(walker);
56     return walker;
57 }
58
59 typedef struct {
60   std::vector< std::pair<Address, Address> > ranges;
61   AddrRangeStepper *stepper;
62 } AddrRangeStepperPair;
63
64 bool operator<(const std::pair<Address, Address> &a, 
65                const std::pair<Address, Address> &b)
66 {
67   return a.first < a.second;
68 }
69
70 bool AddrRangeGroup::addStepper(FrameStepper *stepper) 
71 {
72     assert(stepper);
73     bool result;
74
75     swk_printf("[%s:%u] - Adding stepper %p to group %p\n",
76                __FILE__, __LINE__, stepper, this);
77
78     AddrRangeStepperPair *new_pair = new AddrRangeStepperPair();
79     assert(new_pair);
80
81     result = stepper->getAddressRanges(new_pair->ranges);
82     if (!result) {
83         swk_printf("[%s:%u] - FrameStepper::getAddressRanges returned error\n",
84                    __FILE__, __LINE__);
85         return false;
86     }
87
88     std::sort(new_pair->ranges.begin(), new_pair->ranges.end());
89
90     swk_printf("[%s:%u] - Stepper %p has %u ranges\n", 
91                __FILE__, __LINE__, stepper, new_pair->ranges.size());
92     for (unsigned i=0; i<new_pair->ranges.size(); i++) {
93         swk_printf("[%s:%u] - Range %d is from 0x%lx to 0x%lx\n", __FILE__, 
94                    __LINE__, i, new_pair->ranges[i].first, 
95                    new_pair->ranges[i].second);
96         if (ranges[i].second < ranges[i].first) {
97             //TODO: Error return
98         }
99
100         /**
101          * Remove any overlapping ranges.
102          **/
103         if (i+1 >= new_pair->ranges.size())
104           //Don't need to test last element
105           continue;
106         if (ranges[i].second <= ranges[i+1].first) 
107           //Elements are not overlapping
108           continue;
109         if (ranges[i].second >= ranges[i+1].second)
110           //
111
112     }
113
114
115     
116 }
117
118 bool StepperGroup::findStepperForAddr(Address addr, FrameStepper* &out, 
119                                       const FrameStepper *last_tried)
120 {
121
122 }
123
124
125