Add StackwalkerAPI frame stepper that walks through instrumentation.
[dyninst.git] / stackwalk / src / framestepper.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 "stackwalk/h/framestepper.h"
33 #include "stackwalk/h/walker.h"
34 #include "stackwalk/h/procstate.h"
35 #include "stackwalk/h/swk_errors.h"
36 #include "stackwalk/h/steppergroup.h"
37
38 #include "stackwalk/src/sw.h"
39
40 #include <assert.h>
41
42 using namespace Dyninst;
43 using namespace Dyninst::Stackwalker;
44
45 FrameStepper::FrameStepper(Walker *w) :
46   walker(w)
47 {
48   sw_printf("[%s:%u] - Creating FrameStepper %p with walker %p\n", 
49             __FILE__, __LINE__, this, walker);
50   assert(walker);
51 }
52
53 FrameStepper::~FrameStepper() 
54 {
55   walker = NULL;
56   sw_printf("[%s:%u] - Deleting FrameStepper %p\n", __FILE__, __LINE__, this);
57 }
58
59 Walker *FrameStepper::getWalker()
60 {
61   assert(walker);
62   return walker;
63 }
64
65 ProcessState *FrameStepper::getProcessState() 
66 {
67   return getWalker()->getProcessState();
68 }
69
70 void FrameStepper::newLibraryNotification(LibAddrPair *, lib_change_t)
71 {
72 }
73
74 void FrameStepper::registerStepperGroup(StepperGroup *group)
75 {
76    unsigned addr_width = group->getWalker()->getProcessState()->getAddressWidth();
77    if (addr_width == 4)
78       group->addStepper(this, 0, 0xffffffff);
79 #if defined(arch_64bit)
80    else if (addr_width == 8)
81       group->addStepper(this, 0, 0xffffffffffffffff);
82 #endif
83    else
84       assert(0 && "Unknown architecture word size");
85 }
86
87
88 FrameFuncHelper::FrameFuncHelper(ProcessState *proc_) :
89    proc(proc_)
90 {
91 }
92
93 FrameFuncHelper::~FrameFuncHelper()
94 {
95 }
96
97 //FrameFuncStepper defined here
98 #define PIMPL_IMPL_CLASS FrameFuncStepperImpl
99 #define PIMPL_CLASS FrameFuncStepper
100 #define PIMPL_NAME "FrameFuncStepper"
101 #define PIMPL_ARG1 FrameFuncHelper*
102 #include "framestepper_pimple.h"
103 #undef PIMPL_CLASS
104 #undef PIMPL_NAME
105 #undef PIMPL_IMPL_CLASS
106 #undef PIMPL_ARG1
107
108 //DyninstInstrStepper defined here
109 #if defined(cap_stackwalker_use_symtab)
110 #include "stackwalk/src/symtab-swk.h"
111 #define PIMPL_IMPL_CLASS DyninstInstrStepperImpl
112 #endif
113 #define PIMPL_CLASS DyninstInstrStepper
114 #define PIMPL_NAME "DyninstInstrStepper"
115 #include "framestepper_pimple.h"
116 #undef PIMPL_CLASS
117 #undef PIMPL_IMPL_CLASS
118 #undef PIMPL_NAME
119
120 //BottomOfStackStepper defined here
121 #if defined(cap_stackwalker_use_symtab) && defined(os_linux)
122 #include "stackwalk/src/linux-swk.h"
123 #define PIMPL_IMPL_CLASS BottomOfStackStepperImpl
124 #endif
125 #define PIMPL_CLASS BottomOfStackStepper
126 #define PIMPL_NAME "BottomOfStackStepper"
127 #include "framestepper_pimple.h"
128 #undef PIMPL_CLASS
129 #undef PIMPL_IMPL_CLASS
130 #undef PIMPL_NAME
131
132 //DebugStepper defined here
133 #if defined(os_linux) && (defined(arch_x86) || defined(arch_x86_64)) && defined(cap_stackwalker_use_symtab)
134 #include "stackwalk/src/dbgstepper-impl.h"
135 #define PIMPL_IMPL_CLASS DebugStepperImpl
136 #endif
137 #define PIMPL_CLASS DebugStepper
138 #define PIMPL_NAME "DebugStepper"
139 #include "framestepper_pimple.h"
140 #undef PIMPL_CLASS
141 #undef PIMPL_IMPL_CLASS
142 #undef PIMPL_NAME
143
144 //StepperWanderer defined here
145 #if defined(arch_x86) || defined(arch_x86_64)
146 #include "stackwalk/src/x86-swk.h"
147 #define PIMPL_IMPL_CLASS StepperWandererImpl
148 #endif
149 #define PIMPL_CLASS StepperWanderer
150 #define PIMPL_NAME "StepperWanderer"
151 #define PIMPL_ARG1 WandererHelper*
152 #define PIMPL_ARG2 FrameFuncHelper*
153 #include "framestepper_pimple.h"
154 #undef PIMPL_CLASS
155 #undef PIMPL_IMPL_CLASS
156 #undef PIMPL_NAME
157 #undef PIMPL_ARG1
158 #undef PIMPL_ARG2
159
160 //SigHandlerStepper defined here
161 #if defined(os_linux)
162 #include "stackwalk/src/linux-swk.h"
163 #define PIMPL_IMPL_CLASS SigHandlerStepperImpl
164 #endif
165 #define PIMPL_CLASS SigHandlerStepper
166 #define PIMPL_NAME "SigHandlerStepper"
167 #include "framestepper_pimple.h"
168 #undef PIMPL_CLASS
169 #undef PIMPL_IMPL_CLASS
170 #undef PIMPL_NAME