# Copyright 2012-2024 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 .
# 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.
require dwarf2_support
# This test can only be run on x86_64 targets.
require is_x86_64_m64_target
set basename "inline-break"
standard_testfile .S
if { [prepare_for_testing "failed to prepare" $testfile $srcfile {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\\)} .* "