GDB (API)
/home/stan/gdb/src/gdb/dummy-frame.c
Go to the documentation of this file.
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 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Defines