* symtab.c (find_function_start_sal): Never return SAL pointing
authorUlrich Weigand <uweigand@de.ibm.com>
Fri, 9 Apr 2010 15:31:41 +0000 (15:31 +0000)
committerUlrich Weigand <uweigand@de.ibm.com>
Fri, 9 Apr 2010 15:31:41 +0000 (15:31 +0000)
before function start address, even if line info is missing.

gdb/ChangeLog
gdb/symtab.c

index f7c76c73532dac6ae8adf580f90070e7bbca0497..4b4b82e28caaa54d03962e35f549438b5f895d36 100644 (file)
@@ -1,3 +1,8 @@
+2010-04-09  Ulrich Weigand  <uweigand@de.ibm.com>
+
+       * symtab.c (find_function_start_sal): Never return SAL pointing
+       before function start address, even if line info is missing.
+
 2010-04-09  Pedro  Alves  <pedro@codesourcery.com>
 
        * NEWS: Mention tracepoints support.
index b10cdc8620c20a849490d707a4ca6c7533d17fc0..29142dab47f8077297d661f7f6c68f46bccb0c55 100644 (file)
@@ -2295,6 +2295,18 @@ find_function_start_sal (struct symbol *sym, int funfirstline)
   sal = find_pc_sect_line (BLOCK_START (SYMBOL_BLOCK_VALUE (sym)),
                           SYMBOL_OBJ_SECTION (sym), 0);
 
+  /* We always should have a line for the function start address.
+     If we don't, something is odd.  Create a plain SAL refering
+     just the PC and hope that skip_prologue_sal (if requested)
+     can find a line number for after the prologue.  */
+  if (sal.pc < BLOCK_START (SYMBOL_BLOCK_VALUE (sym)))
+    {
+      init_sal (&sal);
+      sal.pspace = current_program_space;
+      sal.pc = BLOCK_START (SYMBOL_BLOCK_VALUE (sym));
+      sal.section = SYMBOL_OBJ_SECTION (sym);
+    }
+
   if (funfirstline)
     skip_prologue_sal (&sal);