gdb: detect main function even when there's no matching msymbol
authorAndrew Burgess <andrew.burgess@embecosm.com>
Thu, 8 Oct 2020 11:28:19 +0000 (12:28 +0100)
committerAndrew Burgess <andrew.burgess@embecosm.com>
Sun, 11 Oct 2020 17:35:39 +0000 (18:35 +0100)
Currently, GDB will only stop the backtrace at the main function if
there is a minimal symbol with the matching name.  In Fortran programs
compiled with gfortran this is not the case.  The main function is
present in the DWARF, and as marked as DW_AT_main_subprogram, but
there's no minimal symbol.

This commit extends `inside_main_func` to check the full symbols if no
matching minimal symbol is found.

There's an updated test case that covers this change.

gdb/ChangeLog:

* frame.c (inside_main_func): Check full symbols as well as
minimal symbols.

gdb/testsuite/ChangeLog:

* gdb.fortran/mixed-lang-stack.exp (run_tests): Update expected
output of backtrace.

gdb/ChangeLog
gdb/frame.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.fortran/mixed-lang-stack.exp

index de66f5aae794ea789113c1805037cd60bcc28671..26623c6067c8ce14d23b4a653fba67c4a537c1c1 100644 (file)
@@ -1,3 +1,8 @@
+2020-10-11  Andrew Burgess  <andrew.burgess@embecosm.com>
+
+       * frame.c (inside_main_func): Check full symbols as well as
+       minimal symbols.
+
 2020-10-09  Joel Brobecker  <brobecker@adacore.com>
 
        * ada-lang.c (advance_wild_match): Rewrite the function's
index 5ae8611a8e64a851bf46325b1d01f229b7383ac2..b4af734c2eeac11d172828db48d6a1033deaebe4 100644 (file)
@@ -2295,19 +2295,33 @@ inside_main_func (frame_info *this_frame)
   if (symfile_objfile == nullptr)
     return false;
 
+  CORE_ADDR sym_addr;
+  const char *name = main_name ();
   bound_minimal_symbol msymbol
-    = lookup_minimal_symbol (main_name (), NULL, symfile_objfile);
+    = lookup_minimal_symbol (name, NULL, symfile_objfile);
   if (msymbol.minsym == nullptr)
-    return false;
+    {
+      /* In some language (for example Fortran) there will be no minimal
+        symbol with the name of the main function.  In this case we should
+        search the full symbols to see if we can find a match.  */
+      struct block_symbol bs = lookup_symbol (name, NULL, VAR_DOMAIN, 0);
+      if (bs.symbol == nullptr)
+       return false;
+
+      const struct block *block = SYMBOL_BLOCK_VALUE (bs.symbol);
+      gdb_assert (block != nullptr);
+      sym_addr = BLOCK_START (block);
+    }
+  else
+    sym_addr = BMSYMBOL_VALUE_ADDRESS (msymbol);
 
-  /* Make certain that the code, and not descriptor, address is
-     returned.  */
-  CORE_ADDR maddr
+  /* Convert any function descriptor addresses into the actual function
+     code address.  */
+  sym_addr
     = gdbarch_convert_from_func_ptr_addr (get_frame_arch (this_frame),
-                                         BMSYMBOL_VALUE_ADDRESS (msymbol),
-                                         current_top_target ());
+                                         sym_addr, current_top_target ());
 
-  return maddr == get_frame_func (this_frame);
+  return sym_addr == get_frame_func (this_frame);
 }
 
 /* Test whether THIS_FRAME is inside the process entry point function.  */
index d7e80954b1d380c8576d505fd22aefce6cfaee23..2e8efd9374683eb45a0bda328aae8b68fca47490 100644 (file)
@@ -1,3 +1,8 @@
+2020-10-11  Andrew Burgess  <andrew.burgess@embecosm.com>
+
+       * gdb.fortran/mixed-lang-stack.exp (run_tests): Update expected
+       output of backtrace.
+
 2020-10-09  Tom Tromey  <tromey@adacore.com>
 
        * gdb.ada/scalar_storage/storage.adb (Another_Range): New type.
index edf2508537dda9332003e5de6cf59538685565d2..8d1f2bc0123b190039123cc51501eaf1c0cebb16 100644 (file)
@@ -73,8 +73,7 @@ proc run_tests { lang } {
                 "#6\\s+$hex in mixed_func_1c \\(\[^\r\n\]+\\) at \[^\r\n\]+" \
                 "#7\\s+$hex in mixed_func_1b \\($1b_args\\) at \[^\r\n\]+" \
                 "#8\\s+$hex in mixed_func_1a \\(\\) at \[^\r\n\]+" \
-                "#9\\s+$hex in mixed_stack_main \\(\\) at \[^\r\n\]+" \
-                "#10\\s+$hex in main \\(\[^\r\n\]+\\) at .*" ]
+                "#9\\s+$hex in mixed_stack_main \\(\\) at \[^\r\n\]+" ]
        gdb_test "bt -frame-arguments all" $bt_stack
 
        # Check the language for frame #0.