diff options
Diffstat (limited to 'gdb/linespec.c')
-rw-r--r-- | gdb/linespec.c | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/gdb/linespec.c b/gdb/linespec.c index 9043ca6..a00cffe 100644 --- a/gdb/linespec.c +++ b/gdb/linespec.c @@ -1833,11 +1833,27 @@ minsym_found (int funfirstline, struct minimal_symbol *msymbol) values.sals[0].section = SYMBOL_BFD_SECTION (msymbol); if (funfirstline) { + struct symtab_and_line sal; + values.sals[0].pc += gdbarch_deprecated_function_start_offset (current_gdbarch); values.sals[0].pc = gdbarch_skip_prologue (current_gdbarch, values.sals[0].pc); + + sal = find_pc_sect_line (values.sals[0].pc, values.sals[0].section, 0); + + /* Check if SKIP_PROLOGUE left us in mid-line, and the next + line is still part of the same function. If there is no + line information here, sal.pc will be the passed in PC. */ + if (sal.pc != values.sals[0].pc + && (lookup_minimal_symbol_by_pc_section (values.sals[0].pc, + values.sals[0].section) + == lookup_minimal_symbol_by_pc_section (sal.end, + values.sals[0].section))) + /* Recalculate the line number (might not be N+1). */ + values.sals[0] = find_pc_sect_line (sal.end, values.sals[0].section, 0); } + values.nelts = 1; return values; } |