# Copyright 2012-2021 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"

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\\)} .* <func2>"
