# Copyright 2012-2018 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. 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\\)} .* "