* alpha-mdebug-tdep.c (alpha_mdebug_frame_p): Reject prologues.
authorRichard Henderson <rth@redhat.com>
Sat, 31 May 2003 00:27:46 +0000 (00:27 +0000)
committerRichard Henderson <rth@redhat.com>
Sat, 31 May 2003 00:27:46 +0000 (00:27 +0000)
        (alpha_mdebug_frame_unwind_cache): Don't call the heuristic unwinder.
        (alpha_mdebug_frame_this_id): Likewise.
        (alpha_mdebug_frame_prev_register): Likewise.
        (alpha_mdebug_frame_base_address): Likewise.
        (alpha_mdebug_frame_locals_address): Likewise.
        (alpha_mdebug_frame_args_address): Likewise.
        (struct alpha_mdebug_unwind_cache): Remove in_prologue_cache.
        * alpha-tdep.c (alpha_heuristic_proc_start): Use get_pc_function_start.
        (alpha_heuristic_frame_unwind_cache): Make static; add missing
        loop increment.
        (alpha_heuristic_frame_this_id): Make static.
        (alpha_heuristic_frame_prev_register): Likewise.
        (alpha_heuristic_frame_base_address): Likewise.
        * alpha-tdep.h: Update.

gdb/ChangeLog
gdb/alpha-mdebug-tdep.c
gdb/alpha-tdep.c
gdb/alpha-tdep.h

index b31281d..7404eb6 100644 (file)
@@ -1,3 +1,21 @@
+2003-05-30  Richard Henderson  <rth@redhat.com>
+
+       * alpha-mdebug-tdep.c (alpha_mdebug_frame_p): Reject prologues.
+       (alpha_mdebug_frame_unwind_cache): Don't call the heuristic unwinder.
+       (alpha_mdebug_frame_this_id): Likewise.
+       (alpha_mdebug_frame_prev_register): Likewise.
+       (alpha_mdebug_frame_base_address): Likewise.
+       (alpha_mdebug_frame_locals_address): Likewise.
+       (alpha_mdebug_frame_args_address): Likewise.
+       (struct alpha_mdebug_unwind_cache): Remove in_prologue_cache.
+       * alpha-tdep.c (alpha_heuristic_proc_start): Use get_pc_function_start.
+       (alpha_heuristic_frame_unwind_cache): Make static; add missing
+       loop increment.
+       (alpha_heuristic_frame_this_id): Make static.
+       (alpha_heuristic_frame_prev_register): Likewise.
+       (alpha_heuristic_frame_base_address): Likewise.
+       * alpha-tdep.h: Update.
+
 2003-05-30  Mark Kettenis  <kettenis@gnu.org>
 
        * i386-tdep.h (i386bsd_sigcontext_addr): Remove prototype.
 2003-05-15  David Carlton  <carlton@bactrian.org>
        
        Committed by Elena Zannoni <ezannoni@redhat.com>    
-        * symtab.c (lookup_symbol_aux): Delete calls to
-        lookup_symbol_aux_minsyms.
-        (lookup_symbol_aux_minsyms): Comment out function and
-        prototype. Delete lookup by mangled name.
+       * symtab.c (lookup_symbol_aux): Delete calls to
+       lookup_symbol_aux_minsyms.
+       (lookup_symbol_aux_minsyms): Comment out function and
+       prototype. Delete lookup by mangled name.
 
 2003-05-14  Kevin Buettner  <kevinb@redhat.com>
 
 2003-04-18  Jim Blandy  <jimb@redhat.com>
 
        * s390-tdep.c (s390_frame_align): New function.
-        (s390_gdbarch_init): Register it with the gdbarch object.
+       (s390_gdbarch_init): Register it with the gdbarch object.
 
 2003-04-17  Richard Henderson  <rth@redhat.com>
 
 2003-04-17  Elena Zannoni  <ezannoni@redhat.com>
 
        * values.c (value_being_returned): Don't fetch the return
-        value if the return type is void.
+       value if the return type is void.
 
 2003-04-17  Jeff Johnston  <jjohnstn@redhat.com>
 
 
 2003-04-08  Elena Zannoni  <ezannoni@redhat.com>
 
-        * infrun.c (stop_soon): Rename from stop_soon_quietly.
+       * infrun.c (stop_soon): Rename from stop_soon_quietly.
        (struct inferior_status): Rename stop_soon_quietly field to stop_soon.
        (clear_proceed_status): Rename stop_soon_quietly to stop_soon.
        (start_remote): Ditto.
        (restore_inferior_status): Ditto.
        * infcmd.c (attach_command): Ditto.
        * fork-child.c (startup_inferior): Ditto.
-        * inferior.h (stop_soon): Rename from stop_soon_quietly.
+       * inferior.h (stop_soon): Rename from stop_soon_quietly.
        * alpha-tdep.c (heuristic_proc_start): Ditto.
        * mips-tdep.c (heuristic_proc_start): Ditto.
        * solib-svr4.c (svr4_solib_create_inferior_hook): Ditto.
 2003-04-07  Elena Zannoni  <ezannoni@redhat.com>
 
        * disasm.c (dump_insns):  Move variables inside loop, or they will
-        be freed more than once, causing wild memory corruptions.
+       be freed more than once, causing wild memory corruptions.
        (gdb_disassembly): Look for the substring "-thread",
-        instead of "-threads" in the target name, to make sure to find
-        the 'multi-thread' target.  Also, make sure we do the right thing 
-        with the "core" target.
+       instead of "-threads" in the target name, to make sure to find
+       the 'multi-thread' target.  Also, make sure we do the right thing 
+       with the "core" target.
 
 2003-04-07  Kevin Buettner  <kevinb@redhat.com>
 
 
 2003-04-04  Elena Zannoni  <ezannoni@redhat.com>
 
-        * x86-64-tdep.c (x86_64_push_arguments): Handle correctly the
-        signed integer case.
-        (classify_argument): Handle enumerations and references.
+       * x86-64-tdep.c (x86_64_push_arguments): Handle correctly the
+       signed integer case.
+       (classify_argument): Handle enumerations and references.
 
 2003-04-04  Andrew Cagney  <cagney@redhat.com>
 
        * language.c (language_demangle): New function.
        (unk_lang_demangle): Likewise.
        (unknown_language_defn, auto_language_defn, local_language_defn):
-        Add ukn_lang_demangle.
+       Add ukn_lang_demangle.
        * ada-lang.c (ada_language_defn): Add NULL for la_demangle element.
-        * f-lang.c, m2-lang.c, p-lang.c, scm-lang.c: Likewise.
+       * f-lang.c, m2-lang.c, p-lang.c, scm-lang.c: Likewise.
        * c-lang.c (c_language_defn, asm_language_defn): Likewise.
        (cplus_language_defn): Add cplus_demangle for la_demangle element.
        * jv-lang.c (java_demangle): New function
        (java_language_defn): Use it for la_demangle element.
-        * objc-lang.c (objc_demangle): Add options argument
-        (objc_language_defn): Use objc_demangle for la_demangle element.
+       * objc-lang.c (objc_demangle): Add options argument
+       (objc_language_defn): Use objc_demangle for la_demangle element.
        * maint.c (maintenance_demangle): Replace switch with
        call to language_demangle.
        * utils.c (fprintf_symbol_filtered): Likewise.
 2003-03-30  Andrew Cagney  <cagney@redhat.com>
 
        2002-11-10 Klee Dienes <kdienes@apple.com>
-        * value.h (struct value): Update comment.
+       * value.h (struct value): Update comment.
 
 2003-03-30  Andrew Cagney  <cagney@redhat.com>
 
 
 2003-03-28  Bob Rossi  <bob_rossi@cox.net>
 
-        * MAINTAINERS (write after approval): Add myself.
+       * MAINTAINERS (write after approval): Add myself.
 
 2003-03-27  Theodore A. Roth  <troth@openavr.org>
 
 
 2003-03-13  D. Venkatasubramanian <dvenkat@noida.hcltech.com>
 
-        * MAINTAINERS (write after approval): Alphabetically
+       * MAINTAINERS (write after approval): Alphabetically
        listing corrected.
 
 2003-03-13  D. Venkatasubramanian <dvenkat@noida.hcltech.com>
 
-        * MAINTAINERS (write after approval): Add myself.
+       * MAINTAINERS (write after approval): Add myself.
 
 2003-03-12  Andrew Cagney  <cagney@redhat.com>
 
 2003-02-20  Adam Fedor  <fedor@gnu.org>
 
        * objc-lang.h (find_methods): Remove declaration.
-        * objc-lang.c (find_methods): Make static.
+       * objc-lang.c (find_methods): Make static.
 
 2003-02-20  Christopher Faylor  <cgf@redhat.com>
 
 2003-02-18  Elena Zannoni  <ezannoni@redhat.com>
 
        From Jim Ingham   <jingham@apple.com>:
-        * dbxread.c (process_one_symbol): Use last_function_start rather
-        than function_start_offset to find the real beginning of the
-        current function.  The latter is just the text section offset on
-        some systems, the former is always the real function start.
+       * dbxread.c (process_one_symbol): Use last_function_start rather
+       than function_start_offset to find the real beginning of the
+       current function.  The latter is just the text section offset on
+       some systems, the former is always the real function start.
 
 2003-02-17  Andrew Cagney  <cagney@redhat.com>
 
        
 2003-02-14  Elena Zannoni  <ezannoni@redhat.com>
 
-        From Brian Ford  <ford@vss.fsi.com>
+       From Brian Ford  <ford@vss.fsi.com>
 
        * cli/cli-decode.c (lookup_cmd_composition) [TUI]: Properly
        conditionalize tui_active test.
 
 2003-02-12  Jason Molenda  (jmolenda@apple.com)
 
-        * symmisc.c (print_objfile_statistics): Include information about
-        the number of psymtabs and symtabs in each object file.
+       * symmisc.c (print_objfile_statistics): Include information about
+       the number of psymtabs and symtabs in each object file.
 
 2003-02-13  Keith R Seitz  <keiths@redhat.com>
 
        (threads_continue_all_with_signals): Ditto.
   
 2003-02-05  Jim Ingham <jingham@apple.com>
-            Keith Seitz  <keiths@redhat.com>
-            Elena Zannoni  <ezannoni@redhat.com>
-            Andrew Cagney  <ac131313@redhat.com>
+           Keith Seitz  <keiths@redhat.com>
+           Elena Zannoni  <ezannoni@redhat.com>
+           Andrew Cagney  <ac131313@redhat.com>
 
        * Makefile.in (SUBDIR_CLI_OBS): Add "cli-interp.o".
        (SUBDIR_CLI_SRCS): Add "cli/cli-interp.c".
 
        From Kevin Buettner  <kevinb@redhat.com>:
        * ui-out.h (make_cleanup_ui_out_table_begin_end): New function.
-        * ui-out.c (make_cleanup_ui_out_table_begin_end)
-        (do_cleanup_table_end):  New functions.
-        * breakpoint.c (print_it_typical, print_one_breakpoint, mention):
-        Use cleanups to invoke_ui_out_tuple_end().
-        (breakpoint_1): Use cleanup to invoke ui_out_table_end().
+       * ui-out.c (make_cleanup_ui_out_table_begin_end)
+       (do_cleanup_table_end):  New functions.
+       * breakpoint.c (print_it_typical, print_one_breakpoint, mention):
+       Use cleanups to invoke_ui_out_tuple_end().
+       (breakpoint_1): Use cleanup to invoke ui_out_table_end().
        * cli/cli-setshow.c (cmd_show_list): Use
        make_cleanup_ui_out_tuple_begin_end.
        
 2003-02-01  Andrew Cagney  <ac131313@redhat.com>
 
        From 2002-11-09 Jason Molenda (jason-cl@molenda.com)
-        * stack.c (print_frame_info_base): Output complete FRAME tuple
-        for synthesized frames.
+       * stack.c (print_frame_info_base): Output complete FRAME tuple
+       for synthesized frames.
 
 2003-02-02  Andrew Cagney  <ac131313@redhat.com>
 
index 2f84d6d..2f49e08 100644 (file)
@@ -174,7 +174,6 @@ struct alpha_mdebug_unwind_cache
   alpha_extra_func_info_t proc_desc;
   CORE_ADDR vfp;
   CORE_ADDR *saved_regs;
-  void *in_prologue_cache;
 };
 
 /* Extract all of the information about the frame from PROC_DESC
@@ -205,21 +204,6 @@ alpha_mdebug_frame_unwind_cache (struct frame_info *next_frame,
   info->proc_desc = proc_desc;
   gdb_assert (proc_desc != NULL);
 
-  /* If we're in the prologue, the PDR for this frame is not yet valid.  */
-  /* ??? We could have said "no" in alpha_mdebug_frame_p, and we'd
-     walk down the list of unwinders and try the heuristic unwinder
-     and things would have been fine. However, since we have the PDR,
-     we know how to skip the search for the start of the procedure,
-     and all the uncertainty involved there.  So instead, arrange for
-     us to defer to the heuristic unwinder directly.  */
-  if (alpha_mdebug_in_prologue (pc, proc_desc))
-    {
-      alpha_heuristic_frame_unwind_cache (next_frame,
-                                         &info->in_prologue_cache,
-                                         PROC_LOW_ADDR (proc_desc));
-      return info;
-    }
-
   info->saved_regs = frame_obstack_zalloc (SIZEOF_FRAME_SAVED_REGS);
 
   /* The VFP of the frame is at FRAME_REG+FRAME_OFFSET.  */
@@ -275,12 +259,7 @@ alpha_mdebug_frame_this_id (struct frame_info *next_frame,
   struct alpha_mdebug_unwind_cache *info
     = alpha_mdebug_frame_unwind_cache (next_frame, this_prologue_cache);
 
-  /* If we're in the prologue, defer to the heuristic unwinder.  */
-  if (info->in_prologue_cache)
-    alpha_heuristic_frame_this_id (next_frame, &info->in_prologue_cache,
-                                  this_id);
-  else
-    *this_id = frame_id_build (info->vfp, frame_func_unwind (next_frame));
+  *this_id = frame_id_build (info->vfp, frame_func_unwind (next_frame));
 }
 
 /* Retrieve the value of REGNUM in FRAME.  Don't give up!  */
@@ -295,16 +274,6 @@ alpha_mdebug_frame_prev_register (struct frame_info *next_frame,
   struct alpha_mdebug_unwind_cache *info
     = alpha_mdebug_frame_unwind_cache (next_frame, this_prologue_cache);
 
-  /* If we're in the prologue, defer to the heuristic unwinder.  */
-  if (info->in_prologue_cache)
-    {
-      alpha_heuristic_frame_prev_register (next_frame,
-                                          &info->in_prologue_cache,
-                                          regnum, optimizedp, lvalp,
-                                          addrp, realnump, bufferp);
-      return;
-    }
-
   /* The PC of the previous frame is stored in the link register of
      the current frame.  Frob regnum so that we pull the value from
      the correct place.  */
@@ -359,6 +328,11 @@ alpha_mdebug_frame_p (CORE_ADDR pc)
   if (proc_desc == NULL)
     return NULL;
 
+  /* If we're in the prologue, the PDR for this frame is not yet valid.
+     Say no here and we'll fall back on the heuristic unwinder.  */
+  if (alpha_mdebug_in_prologue (pc, proc_desc))
+    return NULL;
+
   return &alpha_mdebug_frame_unwind;
 }
 
@@ -369,11 +343,7 @@ alpha_mdebug_frame_base_address (struct frame_info *next_frame,
   struct alpha_mdebug_unwind_cache *info
     = alpha_mdebug_frame_unwind_cache (next_frame, this_prologue_cache);
 
-  if (info->in_prologue_cache)
-    return alpha_heuristic_frame_base_address (next_frame,
-                                              &info->in_prologue_cache);
-  else
-    return info->vfp;
+  return info->vfp;
 }
 
 static CORE_ADDR
@@ -382,15 +352,8 @@ alpha_mdebug_frame_locals_address (struct frame_info *next_frame,
 {
   struct alpha_mdebug_unwind_cache *info
     = alpha_mdebug_frame_unwind_cache (next_frame, this_prologue_cache);
-  CORE_ADDR vfp;
 
-  if (info->in_prologue_cache)
-    vfp = alpha_heuristic_frame_base_address (next_frame,
-                                             &info->in_prologue_cache);
-  else
-    vfp = info->vfp;
-
-  return vfp - PROC_LOCALOFF (info->proc_desc);
+  return info->vfp - PROC_LOCALOFF (info->proc_desc);
 }
 
 static CORE_ADDR
@@ -399,15 +362,8 @@ alpha_mdebug_frame_args_address (struct frame_info *next_frame,
 {
   struct alpha_mdebug_unwind_cache *info
     = alpha_mdebug_frame_unwind_cache (next_frame, this_prologue_cache);
-  CORE_ADDR vfp;
-
-  if (info->in_prologue_cache)
-    vfp = alpha_heuristic_frame_base_address (next_frame,
-                                             &info->in_prologue_cache);
-  else
-    vfp = info->vfp;
 
-  return vfp - ALPHA_NUM_ARG_REGS * 8;
+  return info->vfp - ALPHA_NUM_ARG_REGS * 8;
 }
 
 static const struct frame_base alpha_mdebug_frame_base = {
index 2bd3b26..cd29c95 100644 (file)
@@ -666,10 +666,18 @@ alpha_heuristic_proc_start (CORE_ADDR pc)
   CORE_ADDR last_non_nop = pc;
   CORE_ADDR fence = pc - heuristic_fence_post;
   CORE_ADDR orig_pc = pc;
+  CORE_ADDR func;
 
   if (pc == 0)
     return 0;
 
+  /* First see if we can find the start of the function from minimal
+     symbol information.  This can succeed with a binary that doesn't
+     have debug info, but hasn't been stripped.  */
+  func = get_pc_function_start (pc);
+  if (func)
+    return func;
+
   if (heuristic_fence_post == UINT_MAX
       || fence < tdep->vm_min_address)
     fence = tdep->vm_min_address;
@@ -725,7 +733,7 @@ Otherwise, you told GDB there was a function where there isn't one, or\n\
   return 0;
 }
 
-struct alpha_heuristic_unwind_cache *
+static struct alpha_heuristic_unwind_cache *
 alpha_heuristic_frame_unwind_cache (struct frame_info *next_frame,
                                    void **this_prologue_cache,
                                    CORE_ADDR start_pc)
@@ -882,7 +890,7 @@ alpha_heuristic_frame_unwind_cache (struct frame_info *next_frame,
 /* Given a GDB frame, determine the address of the calling function's
    frame.  This will be used to create a new GDB frame struct.  */
 
-void
+static void
 alpha_heuristic_frame_this_id (struct frame_info *next_frame,
                                 void **this_prologue_cache,
                                 struct frame_id *this_id)
@@ -890,12 +898,17 @@ alpha_heuristic_frame_this_id (struct frame_info *next_frame,
   struct alpha_heuristic_unwind_cache *info
     = alpha_heuristic_frame_unwind_cache (next_frame, this_prologue_cache, 0);
 
+  /* This is meant to halt the backtrace at "_start".  Make sure we
+     don't halt it at a generic dummy frame. */
+  if (inside_entry_file (info->start_pc))
+    return;
+
   *this_id = frame_id_build (info->vfp, info->start_pc);
 }
 
 /* Retrieve the value of REGNUM in FRAME.  Don't give up!  */
 
-void
+static void
 alpha_heuristic_frame_prev_register (struct frame_info *next_frame,
                                     void **this_prologue_cache,
                                     int regnum, int *optimizedp,
@@ -954,7 +967,7 @@ alpha_heuristic_frame_p (CORE_ADDR pc)
   return &alpha_heuristic_frame_unwind;
 }
 
-CORE_ADDR
+static CORE_ADDR
 alpha_heuristic_frame_base_address (struct frame_info *next_frame,
                                    void **this_prologue_cache)
 {
index 412ec37..5def15a 100644 (file)
@@ -99,19 +99,7 @@ struct gdbarch_tdep
 
 extern unsigned int alpha_read_insn (CORE_ADDR pc);
 extern void alpha_software_single_step (enum target_signal, int);
-
-/* Let other files poke at the heuristic unwinder.  */
 extern CORE_ADDR alpha_after_prologue (CORE_ADDR pc);
-extern struct alpha_heuristic_unwind_cache *
-  alpha_heuristic_frame_unwind_cache (struct frame_info *, void **, CORE_ADDR);
-extern void alpha_heuristic_frame_this_id (struct frame_info *, void **,
-                                          struct frame_id *);
-extern void alpha_heuristic_frame_prev_register (struct frame_info *,
-                                                void **, int, int *,
-                                                enum lval_type *,
-                                                CORE_ADDR *, int *, void *);
-extern CORE_ADDR alpha_heuristic_frame_base_address (struct frame_info *,
-                                                    void **);
 
 extern void alpha_mdebug_init_abi (struct gdbarch_info, struct gdbarch *);