Infrastructure for SW CallTrees and group operations
[dyninst.git] / stackwalk / src / framestepper_pimple.h
1 /*
2  * Copyright (c) 1996-2011 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 //We have lots of PIMPL (private implementation) classes for FrameSteppers.  This file
33 //contains a "template" for the common code.  Unfortunately, this isn't a real C++ template,
34 //as actual template classes wouldn't instanciate in the right place.  Instead we'll fake
35 //a template with macros.  I'm bad, but this would otherwise be a lot of repeated code.
36
37
38 #if defined(PIMPL_CLASS)
39 //Can optionally define PIMPL_IMPL_CLASS
40 //Can optionally define PIMPL_NAME
41
42 const char *PIMPL_CLASS::getName() const
43 {
44 #if defined(PIMPL_NAME)
45    return PIMPL_NAME;
46 #else
47    return "<ERROR>";
48 #endif
49 }
50
51 #if defined(PIMPL_IMPL_CLASS)
52
53 const char *PIMPL_IMPL_CLASS::getName() const
54 {
55 #if defined(PIMPL_NAME)
56    return PIMPL_NAME;
57 #else
58    return "<ERROR>";
59 #endif
60 }
61
62 PIMPL_CLASS::PIMPL_CLASS(Walker *w
63 #if defined(PIMPL_ARG1)
64                          , PIMPL_ARG1 arg1
65 #endif
66 #if defined(PIMPL_ARG2)
67                          , PIMPL_ARG2 arg2
68 #endif
69                          ) :
70   FrameStepper(w)
71 {
72 #if defined(PIMPL_NAME)
73   sw_printf("[%s:%u] - Constructing " PIMPL_NAME " at %p\n",
74             __FILE__, __LINE__, this);
75 #endif
76   impl = new PIMPL_IMPL_CLASS(w, this
77 #if defined(PIMPL_ARG1)
78                               , arg1
79 #endif
80 #if defined(PIMPL_ARG2)
81                               , arg2
82 #endif                        
83                               );
84 }
85
86 gcframe_ret_t PIMPL_CLASS::getCallerFrame(const Frame &in, Frame &out)
87 {
88   if (!impl) {
89 #if defined(PIMPL_NAME)
90     sw_printf("[%s:%u] - Error, " PIMPL_NAME " not implemented on this platform\n",
91               __FILE__, __LINE__);
92     setLastError(err_unsupported, PIMPL_NAME " not supported on this platform");
93     return gcf_error;
94 #else
95     return gcf_not_me;
96 #endif
97   }
98   return impl->getCallerFrame(in, out);
99 }
100
101 #if defined(OVERLOAD_NEWLIBRARY)
102 void PIMPL_CLASS::newLibraryNotification(LibAddrPair *la, lib_change_t change)
103 {
104   if (!impl) {
105 #if defined(PIMPL_NAME)
106     sw_printf("[%s:%u] - Error, " PIMPL_NAME " not implemented on this platform\n",
107               __FILE__, __LINE__);
108     setLastError(err_unsupported, PIMPL_NAME " not supported on this platform");
109 #endif
110     return;
111   }
112   impl->newLibraryNotification(la, change);
113 }
114 #endif
115
116 unsigned PIMPL_CLASS::getPriority() const
117 {
118   if (!impl) {
119 #if defined(PIMPL_NAME)
120     sw_printf("[%s:%u] - Error, " PIMPL_NAME " not implemented on this platform\n",
121               __FILE__, __LINE__);
122     setLastError(err_unsupported, PIMPL_NAME " not supported on this platform");
123 #endif
124     return 0;
125   }
126   return impl->getPriority();
127 }
128
129 void PIMPL_CLASS::registerStepperGroup(StepperGroup *group)
130 {
131   if (!impl) {
132 #if defined(PIMPL_NAME)
133     sw_printf("[%s:%u] - Error, " PIMPL_NAME " not implemented on this platform\n",
134               __FILE__, __LINE__);
135     setLastError(err_unsupported, PIMPL_NAME " not supported on this platform");
136 #endif
137     return;
138   }
139   impl->registerStepperGroup(group);
140 }
141
142 PIMPL_CLASS::~PIMPL_CLASS()
143 {
144 #if defined(PIMPL_NAME)
145   sw_printf("[%s:%u] - Destructing " PIMPL_NAME " at %p\n", __FILE__, __LINE__, this);
146 #endif  
147   if (impl)
148     delete impl;
149   impl = NULL;
150 }
151
152 #else
153
154 PIMPL_CLASS::PIMPL_CLASS(Walker *w
155 #if defined(PIMPL_ARG1)
156                          , PIMPL_ARG1
157 #endif
158 #if defined(PIMPL_ARG2)
159                          , PIMPL_ARG2
160 #endif
161                          ) :
162   FrameStepper(w),
163   impl(NULL)
164 {
165 }
166
167 gcframe_ret_t PIMPL_CLASS::getCallerFrame(const Frame &, Frame &)
168 {
169 #if defined(PIMPL_NAME)
170   sw_printf("[%s:%u] - Error, " PIMPL_NAME " not implemented on this platform\n",
171             __FILE__, __LINE__);
172   setLastError(err_unsupported, PIMPL_NAME " not supported on this platform");
173   return gcf_error;
174 #else
175   return gcf_not_me;
176 #endif
177 }
178
179 #if defined(OVERLOAD_NEWLIBRARY)
180 void PIMPL_CLASS::newLibraryNotification(LibAddrPair *, lib_change_t)
181 {
182 #if defined(PIMPL_NAME)
183   sw_printf("[%s:%u] - Error, " PIMPL_NAME " not implemented on this platform\n",
184             __FILE__, __LINE__);
185   setLastError(err_unsupported, PIMPL_NAME " not supported on this platform");
186 #endif
187 }
188 #endif
189
190 unsigned PIMPL_CLASS::getPriority() const
191 {
192 #if defined(PIMPL_NAME)
193   sw_printf("[%s:%u] - Error, " PIMPL_NAME " not implemented on this platform\n",
194             __FILE__, __LINE__);
195   setLastError(err_unsupported, PIMPL_NAME " not supported on this platform");
196 #endif
197   return 0;
198 }
199
200 void PIMPL_CLASS::registerStepperGroup(StepperGroup *)
201 {
202 #if defined(PIMPL_NAME)
203   sw_printf("[%s:%u] - Error, " PIMPL_NAME " not implemented on this platform\n",
204             __FILE__, __LINE__);
205   setLastError(err_unsupported, PIMPL_NAME " not supported on this platform");
206 #endif
207   return;
208 }
209
210 PIMPL_CLASS::~PIMPL_CLASS()
211 {
212 }
213
214 #endif
215
216 #endif
217