481860b396
PR breakpoints/10738 * dwarf2read.c (use_deprecated_index_sections): New global. (struct partial_die_info): New member may_be_inlined. (read_partial_die): Set may_be_inlined where appropriate. (add_partial_subprogram): Add partial symbols for partial DIEs that may be inlined. (new_symbol_full): Add inlined subroutines to the current scope. (write_psymtabs_to_index): Bump version number. (dwarf2_read_index): Read only version 6 indices unless use_deprecated_index_sections is set. * linespec.c (symbol_and_data_callback): New structure. (iterate_inline_only): New function. (iterate_over_all_matching_symtabs): New argument "include_inline". If nonzero, also call the callback for symbols representing inlined subroutines. (lookup_prefix_sym): Pass extra argument to the above. (find_function_symbols): Likewise. (add_matching_symbols_to_info): Likewise. * NEWS: Mention that GDB can now set breakpoints on inlined functions. gdb/doc: PR breakpoints/10738 * gdb.texinfo (Inline Functions): Remove the now-unnecessary @item stating that GDB cannot set breakpoints on inlined functions. (Mode Options): Document --use-deprecated-index-sections. (Index Section Format): Document new index section version format. gdb/testsuite: PR breakpoints/10738 * gdb.opt/inline-break.exp: New file. * gdb.opt/inline-break.c: Likewise. * gdb.dwarf2/inline-break.exp: Likewise. * gdb.dwarf2/inline-break.S: Likewise. * gdb.base/annota1.exp: Cope with old .gdb_index warnings. * gdb.base/async-shell.exp: Likewise. * lib/mi-support.exp (library_loaded_re): Likewise.
124 lines
4.2 KiB
Text
124 lines
4.2 KiB
Text
# Copyright 2012 Free Software Foundation, Inc.
|
|
|
|
# This program is free software; you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation; either version 3 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
# Note that the testcase gdb.opt/inline-break.exp largely mirrors
|
|
# this testcase, and should be updated if this testcase is changed.
|
|
|
|
load_lib dwarf.exp
|
|
|
|
# This test can only be run on targets which support DWARF-2 and use gas.
|
|
if ![dwarf2_support] {
|
|
return 0
|
|
}
|
|
|
|
# This test can only be run on x86_64 targets.
|
|
if {![istarget "x86_64-*-*"] || ![is_lp64_target]} {
|
|
return 0
|
|
}
|
|
|
|
set basename "inline-break"
|
|
set testfile "dw2-$basename"
|
|
|
|
if { [prepare_for_testing $testfile.exp $testfile $testfile.S {nodebug}] } {
|
|
return -1
|
|
}
|
|
|
|
#
|
|
# func1 is a static inlined function that is called once.
|
|
# The result should be a single-location breakpoint.
|
|
#
|
|
gdb_test "break func1" \
|
|
"Breakpoint.*at.* file .*$basename\\.c, line.*"
|
|
|
|
#
|
|
# func2 is a non-static inlined function that is called once.
|
|
# The result should be a breakpoint with two locations: the
|
|
# out-of-line function and the single inlined instance.
|
|
#
|
|
gdb_test "break func2" \
|
|
"Breakpoint.*at.*func2.*\\(2 locations\\)"
|
|
|
|
#
|
|
# func3b is a static inlined function that is called once from
|
|
# within another static inlined function. The result should be
|
|
# a single-location breakpoint.
|
|
#
|
|
gdb_test "break func3b" \
|
|
"Breakpoint.*at.* file .*$basename\\.c, line.*"
|
|
|
|
#
|
|
# func4b is a static inlined function that is called once from
|
|
# within a non-static inlined function. The result should be
|
|
# a breakpoint with two locations: the inlined instance within
|
|
# the inlined call to func4a in main, and the inlined instance
|
|
# within the out-of-line func4a.
|
|
#
|
|
gdb_test "break func4b" \
|
|
"Breakpoint.*at.*func4b.*\\(2 locations\\)"
|
|
|
|
#
|
|
# func5b is a non-static inlined function that is called once
|
|
# from within a static inlined function. The result should be a
|
|
# breakpoint with two locations: the out-of-line function and the
|
|
# inlined instance within the inlined call to func5a in main.
|
|
#
|
|
gdb_test "break func5b" \
|
|
"Breakpoint.*at.*func5b.*\\(2 locations\\)"
|
|
#
|
|
# func6b is a non-static inlined function that is called once from
|
|
# within another non-static inlined function. The result should be
|
|
# a breakpoint with three locations: the out-of-line function, the
|
|
# inlined instance within the out-of-line func6a, and the inlined
|
|
# instance within the inlined call to func6a in main,
|
|
#
|
|
gdb_test "break func6b" \
|
|
"Breakpoint.*at.*func6b.*\\(3 locations\\)"
|
|
|
|
#
|
|
# func7b is a static inlined function that is called twice: once from
|
|
# func7a, and once from main. The result should be a breakpoint with
|
|
# two locations: the inlined instance within the inlined instance of
|
|
# func7a, and the inlined instance within main.
|
|
#
|
|
gdb_test "break func7b" \
|
|
"Breakpoint.*at.*func7b.*\\(2 locations\\)"
|
|
|
|
#
|
|
# func8b is a non-static inlined function that is called twice: once
|
|
# func8a, and once from main. The result should be a breakpoint with
|
|
# three locations: the out-of-line function, the inlined instance
|
|
# within the inlined instance of func7a, and the inlined instance
|
|
# within main.
|
|
#
|
|
gdb_test "break func8b" \
|
|
"Breakpoint.*at.*func8b.*\\(3 locations\\)"
|
|
|
|
#
|
|
# func1 is a static inlined function. The result should be that no
|
|
# symbol is found to print.
|
|
#
|
|
gdb_test "print func1" \
|
|
"No symbol \"func1\" in current context."
|
|
|
|
#
|
|
# func2 is a non-static inlined function. The result should be that
|
|
# one symbol is found to print, and that the printed symbol is called
|
|
# "func2". Note that this does not cover the failure case that two
|
|
# symbols were found, but that gdb chose the out-of-line copy to
|
|
# print, but if this was failing the "print func1" test would likely
|
|
# fail instead.
|
|
#
|
|
gdb_test "print func2" \
|
|
"\\\$.* = {int \\(int\\)} .* <func2>"
|