* breakpoint.c (skip_prologue_sal): New function.
authorJoel Brobecker <brobecker@gnat.com>
Wed, 27 Feb 2008 20:27:49 +0000 (20:27 +0000)
committerJoel Brobecker <brobecker@gnat.com>
Wed, 27 Feb 2008 20:27:49 +0000 (20:27 +0000)
        (resolve_sal_pc): Adjust SAL past prologue if the SAL was
        computed from a line number.

gdb/ChangeLog
gdb/breakpoint.c

index 96dd838409d218a345be2d9853e4409a4aed1dfb..aae24615a06406325479d0fb022c149b0510a7be 100644 (file)
@@ -1,3 +1,9 @@
+2008-02-27  Joel Brobecker  <brobecker@adacore.com>
+
+       * breakpoint.c (skip_prologue_sal): New function.
+       (resolve_sal_pc): Adjust SAL past prologue if the SAL was
+       computed from a line number.
+
 2008-02-27  Joel Brobecker  <brobecker@adacore.com>
 
        * features/rs6000/power-core.xml, features/rs6000/power64-core.xml
index 019f4c8ac3e3830100ccae463c6d98482e70b97f..a689e3ae44f6c677ea0e819a89679f5e945cb67c 100644 (file)
@@ -5482,6 +5482,25 @@ set_breakpoint (char *address, char *condition,
                        0);
 }
 
+/* Adjust SAL to the first instruction past the function prologue.
+   The end of the prologue is determined using the line table from
+   the debugging information.
+
+   If SAL is already past the prologue, then do nothing.  */
+
+static void
+skip_prologue_sal (struct symtab_and_line *sal)
+{
+  struct symbol *sym = find_pc_function (sal->pc);
+  struct symtab_and_line start_sal;
+
+  if (sym == NULL)
+    return;
+
+  start_sal = find_function_start_sal (sym, 1);
+  if (sal->pc < start_sal.pc)
+    *sal = start_sal;
+}
 
 /* Helper function for break_command_1 and disassemble_command.  */
 
@@ -5496,6 +5515,11 @@ resolve_sal_pc (struct symtab_and_line *sal)
        error (_("No line %d in file \"%s\"."),
               sal->line, sal->symtab->filename);
       sal->pc = pc;
+
+      /* If this SAL corresponds to a breakpoint inserted using
+         a line number, then skip the function prologue if necessary.  */
+      if (sal->explicit_line)
+        skip_prologue_sal (sal);
     }
 
   if (sal->section == 0 && sal->symtab != NULL)