2003-07-15 Andrew Cagney <cagney@redhat.com>
authorAndrew Cagney <cagney@redhat.com>
Tue, 15 Jul 2003 17:23:32 +0000 (17:23 +0000)
committerAndrew Cagney <cagney@redhat.com>
Tue, 15 Jul 2003 17:23:32 +0000 (17:23 +0000)
* frame.c (get_prev_frame): Move disabled inside_entry_func to
before code inhibiting repeated unwind attempts.  Add to
commentary on that test's problems.
* blockframe.c (inside_main_func): Look for "main" in the minimal
symbol table.
* d10v-tdep.c (d10v_frame_this_id): Delete check that frames are
identical.

Index: testsuite/ChangeLog
2003-07-15  Andrew Cagney  <cagney@redhat.com>

* gdb.asm/asm-source.exp: Do not allow "start" in the backtrace.

gdb/ChangeLog
gdb/blockframe.c
gdb/d10v-tdep.c
gdb/frame.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.asm/asm-source.exp

index 32921f7..8973053 100644 (file)
@@ -1,5 +1,15 @@
 2003-07-15  Andrew Cagney  <cagney@redhat.com>
 
+       * frame.c (get_prev_frame): Move disabled inside_entry_func to
+       before code inhibiting repeated unwind attempts.  Add to
+       commentary on that test's problems.
+       * blockframe.c (inside_main_func): Look for "main" in the minimal
+       symbol table.
+       * d10v-tdep.c (d10v_frame_this_id): Delete check that frames are
+       identical.
+
+2003-07-15  Andrew Cagney  <cagney@redhat.com>
+
        * complaints.c (struct explanation): Define.
        (struct complaints): Change type of "explanation" to "struct
        explanation".
index 23ee66c..9a11c90 100644 (file)
@@ -106,6 +106,47 @@ inside_main_func (CORE_ADDR pc)
            BLOCK_END (SYMBOL_BLOCK_VALUE (mainsym));
        }
     }
+
+  /* Not in the normal symbol tables, see if "main" is in the partial
+     symbol table.  If it's not, then give up.  */
+  {
+    struct minimal_symbol *msymbol
+      = lookup_minimal_symbol (main_name (), NULL, symfile_objfile);
+    if (msymbol != NULL && MSYMBOL_TYPE (msymbol) == mst_text)
+      {
+       struct obj_section *osect
+         = find_pc_sect_section (SYMBOL_VALUE_ADDRESS (msymbol),
+                                 msymbol->ginfo.bfd_section);
+       if (osect != NULL)
+         {
+           int i;
+           /* Step over other symbols at this same address, and
+              symbols in other sections, to find the next symbol in
+              this section with a different address.  */
+           for (i = 1; SYMBOL_LINKAGE_NAME (msymbol + i) != NULL; i++)
+             {
+               if (SYMBOL_VALUE_ADDRESS (msymbol + i) != SYMBOL_VALUE_ADDRESS (msymbol)
+                   && SYMBOL_BFD_SECTION (msymbol + i) == SYMBOL_BFD_SECTION (msymbol))
+                 break;
+             }
+
+           symfile_objfile->ei.main_func_lowpc = SYMBOL_VALUE_ADDRESS (msymbol);
+
+           /* Use the lesser of the next minimal symbol in the same
+              section, or the end of the section, as the end of the
+              function.  */
+           if (SYMBOL_LINKAGE_NAME (msymbol + i) != NULL
+               && SYMBOL_VALUE_ADDRESS (msymbol + i) < osect->endaddr)
+             symfile_objfile->ei.main_func_highpc = SYMBOL_VALUE_ADDRESS (msymbol + i);
+           else
+             /* We got the start address from the last msymbol in the
+                objfile.  So the end address is the end of the
+                section.  */
+             symfile_objfile->ei.main_func_highpc = osect->endaddr;
+         }
+      }
+  }
+
   return (symfile_objfile->ei.main_func_lowpc <= pc &&
          symfile_objfile->ei.main_func_highpc > pc);
 }
index 135a0dd..eafe0cc 100644 (file)
@@ -1417,15 +1417,6 @@ d10v_frame_this_id (struct frame_info *next_frame,
 
   id = frame_id_build (base, func);
 
-  /* Check that we're not going round in circles with the same frame
-     ID (but avoid applying the test to sentinel frames which do go
-     round in circles).  Can't use frame_id_eq() as that doesn't yet
-     compare the frame's PC value.  */
-  if (frame_relative_level (next_frame) >= 0
-      && get_frame_type (next_frame) != DUMMY_FRAME
-      && frame_id_eq (get_frame_id (next_frame), id))
-    return;
-
   (*this_id) = id;
 }
 
index 1e364bd..73895e2 100644 (file)
@@ -1816,6 +1816,44 @@ get_prev_frame (struct frame_info *this_frame)
       return NULL;
     }
 
+  /* If we're already inside the entry function for the main objfile,
+     then it isn't valid.  Don't apply this test to a dummy frame -
+     dummy frame PC's typically land in the entry func.  Don't apply
+     this test to the sentinel frame.  Sentinel frames should always
+     be allowed to unwind.  */
+  /* NOTE: cagney/2003-02-25: Don't enable until someone has found
+     hard evidence that this is needed.  */
+  /* NOTE: cagney/2003-07-07: Fixed a bug in inside_main_func - wasn't
+     checking for "main" in the minimal symbols.  With that fixed
+     asm-source tests now stop in "main" instead of halting the
+     backtrace in wierd and wonderful ways somewhere inside the entry
+     file.  Suspect that inside_entry_file and inside_entry_func tests
+     were added to work around that (now fixed) case.  */
+  /* NOTE: cagney/2003-07-15: danielj (if I'm reading it right)
+     suggested having the inside_entry_func test use the
+     inside_main_func msymbol trick (along with entry_point_address I
+     guess) to determine the address range of the start function.
+     That should provide a far better stopper than the current
+     heuristics.  */
+  /* NOTE: cagney/2003-07-15: Need to add a "set backtrace
+     beyond-entry-func" command so that this can be selectively
+     disabled.  */
+  if (0
+#if 0
+      && backtrace_beyond_entry_func
+#endif
+      && this_frame->type != DUMMY_FRAME && this_frame->level >= 0
+      && inside_entry_func (get_frame_pc (this_frame)))
+    {
+      if (frame_debug)
+       {
+         fprintf_unfiltered (gdb_stdlog, "-> ");
+         fprint_frame (gdb_stdlog, NULL);
+         fprintf_unfiltered (gdb_stdlog, "// inside entry func }\n");
+       }
+      return NULL;
+    }
+
   /* Only try to do the unwind once.  */
   if (this_frame->prev_p)
     {
@@ -1863,26 +1901,6 @@ get_prev_frame (struct frame_info *this_frame)
     }
 #endif
 
-  /* If we're already inside the entry function for the main objfile,
-     then it isn't valid.  Don't apply this test to a dummy frame -
-     dummy frame PC's typically land in the entry func.  Don't apply
-     this test to the sentinel frame.  Sentinel frames should always
-     be allowed to unwind.  */
-  /* NOTE: cagney/2003-02-25: Don't enable until someone has found
-     hard evidence that this is needed.  */
-  if (0
-      && this_frame->type != DUMMY_FRAME && this_frame->level >= 0
-      && inside_entry_func (get_frame_pc (this_frame)))
-    {
-      if (frame_debug)
-       {
-         fprintf_unfiltered (gdb_stdlog, "-> ");
-         fprint_frame (gdb_stdlog, NULL);
-         fprintf_unfiltered (gdb_stdlog, "// inside entry func }\n");
-       }
-      return NULL;
-    }
-
   /* If any of the old frame initialization methods are around, use
      the legacy get_prev_frame method.  */
   if (legacy_frame_p (current_gdbarch))
index 60d1a6e..2e12313 100644 (file)
@@ -1,3 +1,7 @@
+2003-07-15  Andrew Cagney  <cagney@redhat.com>
+
+       * gdb.asm/asm-source.exp: Do not allow "start" in the backtrace.
+
 2003-07-15  Michael Chastain  <mec@shout.net>
 
        * gdb.base/gdb1250.exp: New file.
index e482dd1..3745e60 100644 (file)
@@ -244,7 +244,7 @@ gdb_test "n" "12\[  \]*.*foo3" "n in foo2"
 # doesn't fall off the stack.
 
 gdb_test "bt 10" \
-       "\#0.*foo2.*asmsrc2\[.\]s:12.*\#1.*main.*asmsrc1\[.\]s:33(.*\#2.*start\[^\r\n\]*)?" \
+       "\#0.*foo2.*asmsrc2\[.\]s:12.*\#1.*main.*asmsrc1\[.\]s:33" \
        "bt ALL in foo2"
 
 # See if a capped `bt' prints the right source files.