GDB (API)
|
00001 /* Code dealing with dummy stack frames, for GDB, the GNU debugger. 00002 00003 Copyright (C) 1986-2013 Free Software Foundation, Inc. 00004 00005 This file is part of GDB. 00006 00007 This program is free software; you can redistribute it and/or modify 00008 it under the terms of the GNU General Public License as published by 00009 the Free Software Foundation; either version 3 of the License, or 00010 (at your option) any later version. 00011 00012 This program is distributed in the hope that it will be useful, 00013 but WITHOUT ANY WARRANTY; without even the implied warranty of 00014 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00015 GNU General Public License for more details. 00016 00017 You should have received a copy of the GNU General Public License 00018 along with this program. If not, see <http://www.gnu.org/licenses/>. */ 00019 00020 00021 #include "defs.h" 00022 #include "dummy-frame.h" 00023 #include "regcache.h" 00024 #include "frame.h" 00025 #include "inferior.h" 00026 #include "gdb_assert.h" 00027 #include "frame-unwind.h" 00028 #include "command.h" 00029 #include "gdbcmd.h" 00030 #include "gdb_string.h" 00031 #include "observer.h" 00032 #include "gdbthread.h" 00033 00034 /* Dummy frame. This saves the processor state just prior to setting 00035 up the inferior function call. Older targets save the registers 00036 on the target stack (but that really slows down function calls). */ 00037 00038 struct dummy_frame 00039 { 00040 struct dummy_frame *next; 00041 /* This frame's ID. Must match the value returned by 00042 gdbarch_dummy_id. */ 00043 struct frame_id id; 00044 /* The caller's state prior to the call. */ 00045 struct infcall_suspend_state *caller_state; 00046 }; 00047 00048 static struct dummy_frame *dummy_frame_stack = NULL; 00049 00050 /* Push the caller's state, along with the dummy frame info, onto the 00051 dummy-frame stack. */ 00052 00053 void 00054 dummy_frame_push (struct infcall_suspend_state *caller_state, 00055 const struct frame_id *dummy_id) 00056 { 00057 struct dummy_frame *dummy_frame; 00058 00059 dummy_frame = XZALLOC (struct dummy_frame); 00060 dummy_frame->caller_state = caller_state; 00061 dummy_frame->id = (*dummy_id); 00062 dummy_frame->next = dummy_frame_stack; 00063 dummy_frame_stack = dummy_frame; 00064 } 00065 00066 /* Remove *DUMMY_PTR from the dummy frame stack. */ 00067 00068 static void 00069 remove_dummy_frame (struct dummy_frame **dummy_ptr) 00070 { 00071 struct dummy_frame *dummy = *dummy_ptr; 00072 00073 *dummy_ptr = dummy->next; 00074 discard_infcall_suspend_state (dummy->caller_state); 00075 xfree (dummy); 00076 } 00077 00078 /* Delete any breakpoint B which is a momentary breakpoint for return from 00079 inferior call matching DUMMY_VOIDP. */ 00080 00081 static int 00082 pop_dummy_frame_bpt (struct breakpoint *b, void *dummy_voidp) 00083 { 00084 struct dummy_frame *dummy = dummy_voidp; 00085 00086 if (b->thread == pid_to_thread_id (inferior_ptid) 00087 && b->disposition == disp_del && frame_id_eq (b->frame_id, dummy->id)) 00088 { 00089 while (b->related_breakpoint != b) 00090 delete_breakpoint (b->related_breakpoint); 00091 00092 delete_breakpoint (b); 00093 00094 /* Stop the traversal. */ 00095 return 1; 00096 } 00097 00098 /* Continue the traversal. */ 00099 return 0; 00100 } 00101 00102 /* Pop *DUMMY_PTR, restoring program state to that before the 00103 frame was created. */ 00104 00105 static void 00106 pop_dummy_frame (struct dummy_frame **dummy_ptr) 00107 { 00108 struct dummy_frame *dummy = *dummy_ptr; 00109 00110 restore_infcall_suspend_state (dummy->caller_state); 00111 00112 iterate_over_breakpoints (pop_dummy_frame_bpt, dummy); 00113 00114 /* restore_infcall_control_state frees inf_state, 00115 all that remains is to pop *dummy_ptr. */ 00116 *dummy_ptr = dummy->next; 00117 xfree (dummy); 00118 00119 /* We've made right mess of GDB's local state, just discard 00120 everything. */ 00121 reinit_frame_cache (); 00122 } 00123 00124 /* Look up DUMMY_ID. 00125 Return NULL if not found. */ 00126 00127 static struct dummy_frame ** 00128 lookup_dummy_frame (struct frame_id dummy_id) 00129 { 00130 struct dummy_frame **dp; 00131 00132 for (dp = &dummy_frame_stack; *dp != NULL; dp = &(*dp)->next) 00133 { 00134 if (frame_id_eq ((*dp)->id, dummy_id)) 00135 return dp; 00136 } 00137 00138 return NULL; 00139 } 00140 00141 /* Pop the dummy frame DUMMY_ID, restoring program state to that before the 00142 frame was created. 00143 On return reinit_frame_cache has been called. 00144 If the frame isn't found, flag an internal error. 00145 00146 NOTE: This can only pop the one frame, even if it is in the middle of the 00147 stack, because the other frames may be for different threads, and there's 00148 currently no way to tell which stack frame is for which thread. */ 00149 00150 void 00151 dummy_frame_pop (struct frame_id dummy_id) 00152 { 00153 struct dummy_frame **dp; 00154 00155 dp = lookup_dummy_frame (dummy_id); 00156 gdb_assert (dp != NULL); 00157 00158 pop_dummy_frame (dp); 00159 } 00160 00161 /* Drop dummy frame DUMMY_ID. Do nothing if it is not found. Do not restore 00162 its state into inferior, just free its memory. */ 00163 00164 void 00165 dummy_frame_discard (struct frame_id dummy_id) 00166 { 00167 struct dummy_frame **dp; 00168 00169 dp = lookup_dummy_frame (dummy_id); 00170 if (dp) 00171 remove_dummy_frame (dp); 00172 } 00173 00174 /* There may be stale dummy frames, perhaps left over from when an uncaught 00175 longjmp took us out of a function that was called by the debugger. Clean 00176 them up at least once whenever we start a new inferior. */ 00177 00178 static void 00179 cleanup_dummy_frames (struct target_ops *target, int from_tty) 00180 { 00181 while (dummy_frame_stack != NULL) 00182 remove_dummy_frame (&dummy_frame_stack); 00183 } 00184 00185 /* Return the dummy frame cache, it contains both the ID, and a 00186 pointer to the regcache. */ 00187 struct dummy_frame_cache 00188 { 00189 struct frame_id this_id; 00190 struct regcache *prev_regcache; 00191 }; 00192 00193 static int 00194 dummy_frame_sniffer (const struct frame_unwind *self, 00195 struct frame_info *this_frame, 00196 void **this_prologue_cache) 00197 { 00198 struct dummy_frame *dummyframe; 00199 struct frame_id this_id; 00200 00201 /* When unwinding a normal frame, the stack structure is determined 00202 by analyzing the frame's function's code (be it using brute force 00203 prologue analysis, or the dwarf2 CFI). In the case of a dummy 00204 frame, that simply isn't possible. The PC is either the program 00205 entry point, or some random address on the stack. Trying to use 00206 that PC to apply standard frame ID unwind techniques is just 00207 asking for trouble. */ 00208 00209 /* Don't bother unless there is at least one dummy frame. */ 00210 if (dummy_frame_stack != NULL) 00211 { 00212 /* Use an architecture specific method to extract this frame's 00213 dummy ID, assuming it is a dummy frame. */ 00214 this_id = gdbarch_dummy_id (get_frame_arch (this_frame), this_frame); 00215 00216 /* Use that ID to find the corresponding cache entry. */ 00217 for (dummyframe = dummy_frame_stack; 00218 dummyframe != NULL; 00219 dummyframe = dummyframe->next) 00220 { 00221 if (frame_id_eq (dummyframe->id, this_id)) 00222 { 00223 struct dummy_frame_cache *cache; 00224 00225 cache = FRAME_OBSTACK_ZALLOC (struct dummy_frame_cache); 00226 cache->prev_regcache = get_infcall_suspend_state_regcache 00227 (dummyframe->caller_state); 00228 cache->this_id = this_id; 00229 (*this_prologue_cache) = cache; 00230 return 1; 00231 } 00232 } 00233 } 00234 return 0; 00235 } 00236 00237 /* Given a call-dummy dummy-frame, return the registers. Here the 00238 register value is taken from the local copy of the register buffer. */ 00239 00240 static struct value * 00241 dummy_frame_prev_register (struct frame_info *this_frame, 00242 void **this_prologue_cache, 00243 int regnum) 00244 { 00245 struct dummy_frame_cache *cache = (*this_prologue_cache); 00246 struct gdbarch *gdbarch = get_frame_arch (this_frame); 00247 struct value *reg_val; 00248 00249 /* The dummy-frame sniffer always fills in the cache. */ 00250 gdb_assert (cache != NULL); 00251 00252 /* Describe the register's location. Generic dummy frames always 00253 have the register value in an ``expression''. */ 00254 reg_val = value_zero (register_type (gdbarch, regnum), not_lval); 00255 00256 /* Use the regcache_cooked_read() method so that it, on the fly, 00257 constructs either a raw or pseudo register from the raw 00258 register cache. */ 00259 regcache_cooked_read (cache->prev_regcache, regnum, 00260 value_contents_writeable (reg_val)); 00261 return reg_val; 00262 } 00263 00264 /* Assuming that THIS_FRAME is a dummy, return its ID. That ID is 00265 determined by examining the NEXT frame's unwound registers using 00266 the method dummy_id(). As a side effect, THIS dummy frame's 00267 dummy cache is located and saved in THIS_PROLOGUE_CACHE. */ 00268 00269 static void 00270 dummy_frame_this_id (struct frame_info *this_frame, 00271 void **this_prologue_cache, 00272 struct frame_id *this_id) 00273 { 00274 /* The dummy-frame sniffer always fills in the cache. */ 00275 struct dummy_frame_cache *cache = (*this_prologue_cache); 00276 00277 gdb_assert (cache != NULL); 00278 (*this_id) = cache->this_id; 00279 } 00280 00281 const struct frame_unwind dummy_frame_unwind = 00282 { 00283 DUMMY_FRAME, 00284 default_frame_unwind_stop_reason, 00285 dummy_frame_this_id, 00286 dummy_frame_prev_register, 00287 NULL, 00288 dummy_frame_sniffer, 00289 }; 00290 00291 static void 00292 fprint_dummy_frames (struct ui_file *file) 00293 { 00294 struct dummy_frame *s; 00295 00296 for (s = dummy_frame_stack; s != NULL; s = s->next) 00297 { 00298 gdb_print_host_address (s, file); 00299 fprintf_unfiltered (file, ":"); 00300 fprintf_unfiltered (file, " id="); 00301 fprint_frame_id (file, s->id); 00302 fprintf_unfiltered (file, "\n"); 00303 } 00304 } 00305 00306 static void 00307 maintenance_print_dummy_frames (char *args, int from_tty) 00308 { 00309 if (args == NULL) 00310 fprint_dummy_frames (gdb_stdout); 00311 else 00312 { 00313 struct cleanup *cleanups; 00314 struct ui_file *file = gdb_fopen (args, "w"); 00315 00316 if (file == NULL) 00317 perror_with_name (_("maintenance print dummy-frames")); 00318 cleanups = make_cleanup_ui_file_delete (file); 00319 fprint_dummy_frames (file); 00320 do_cleanups (cleanups); 00321 } 00322 } 00323 00324 extern void _initialize_dummy_frame (void); 00325 00326 void 00327 _initialize_dummy_frame (void) 00328 { 00329 add_cmd ("dummy-frames", class_maintenance, maintenance_print_dummy_frames, 00330 _("Print the contents of the internal dummy-frame stack."), 00331 &maintenanceprintlist); 00332 00333 observer_attach_inferior_created (cleanup_dummy_frames); 00334 }