# 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"

standard_testfile .S

if { [prepare_for_testing $testfile.exp $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>"
