Fix breakpoint add on inlined function using function name.
authorXavier Roirand <roirand@adacore.com>
Mon, 11 Dec 2017 09:03:45 +0000 (10:03 +0100)
committerXavier Roirand <roirand@adacore.com>
Tue, 9 Jan 2018 09:02:51 +0000 (10:02 +0100)
commitb1dc1806fad00fc5b2589164e964646c02a700fa
tree58e4e01765fc82d844cdf5274d2dadce2766a985
parent6cef73f96f58ca3f0e0b2f594b324602c7590611
Fix breakpoint add on inlined function using function name.

Using this Ada example:

  package B is
    procedure Read_Small with Inline_Always;
  end B;

  package body B is
    Total : Natural := 0;
    procedure Read_Small is
    begin
      Total := Total + 1;
    end Read_Small;
  end B;

and

  with B;

  procedure M is
  begin
    B.Read_Small;
  end M;

% gnatmake -g -O0 -m m.adb -cargs -gnatn
% gdb m

Inserting a breakpoint on Read_Small inlined function does not work:

(gdb) b read_small
Breakpoint 1 at 0x40250e: file b.adb, line 5.
(gdb) info b
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x000000000040250e in b.doit at b.adb:5
(gdb)

In this exemple we should have two breakpoints set, one in package B and
the other one in the inlined instance inside procedure M), like below:

(gdb) b read_small
Breakpoint 1 at 0x40250e: b.adb:5. (2 locations)
(gdb) info b
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   <MULTIPLE>
1.1                         y     0x000000000040250e in b.doit at b.adb:5
1.2                         y     0x0000000000402540 in m at b.adb:5
(gdb)

Looking at the DWARF info for inlined instance of Read_Small:

<1><1526>: Abbrev Number: 2 (DW_TAG_subprogram)
    <1527>   DW_AT_name        : ([...], offset: 0x1e82): b__read_small
    <152b>   DW_AT_decl_file   : 2
    <152c>   DW_AT_decl_line   : 3
    <152d>   DW_AT_inline      : 3      (declared as inline and inlined)
[...]
 <2><1547>: Abbrev Number: 4 (DW_TAG_inlined_subroutine)
    <1548>   DW_AT_abstract_origin: <0x1526>
    <154c>   DW_AT_low_pc      : 0x402552
    <1554>   DW_AT_high_pc     : 0x2b
    <155c>   DW_AT_call_file   : 1
    <155d>   DW_AT_call_line   : 5
 <2><155e>: Abbrev Number: 0

During the parsing of DWARF info in order to produce partial DIE linked
list, the DW_TAG_inlined_subroutine were skipped thus not present in the
final partial dies.
Taking DW_TAG_inlined_subroutine in account during the parsing process
fixes the problem.

gdb/ChangeLog:

        * dwarf2read.c (scan_partial_symbols, add_partial_symbol)
        (add_partial_subprogram, load_partial_dies): Add
        DW_TAG_inlined_subroutine handling.

gdb/testsuite/ChangeLog:

        * gdb.ada/bp_inlined_func: New testcase.
gdb/dwarf2read.c
gdb/testsuite/gdb.ada/bp_inlined_func.exp [new file with mode: 0644]
gdb/testsuite/gdb.ada/bp_inlined_func/b.adb [new file with mode: 0644]
gdb/testsuite/gdb.ada/bp_inlined_func/b.ads [new file with mode: 0644]
gdb/testsuite/gdb.ada/bp_inlined_func/c.adb [new file with mode: 0644]
gdb/testsuite/gdb.ada/bp_inlined_func/c.ads [new file with mode: 0644]
gdb/testsuite/gdb.ada/bp_inlined_func/foo.adb [new file with mode: 0644]