| # Copyright 2003 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 2 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, write to the Free Software |
| # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
| |
| # This file was written by Caroline Tice <ctice@apple.com> |
| |
| # This test case tests that gcc's linetable information for |
| # "blocks" is correct.. |
| |
| |
| if $tracelevel then { |
| strace $tracelevel |
| } |
| |
| # |
| # test running programs |
| # |
| |
| set prms_id 0 |
| set bug_id 0 |
| |
| set testfile "blocks-linetables2" |
| set srcfile ${testfile}.c |
| set binfile ${objdir}/${subdir}/${testfile} |
| |
| set additional_flags "additional_flags=-mmacosx-version-min=10.6" |
| if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable [list debug $additional_flags]] != "" } { |
| gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." |
| } |
| |
| if {$debug_default_format_is_dwarf == 0 } then { |
| return; |
| } |
| |
| # Start with a fresh gdb |
| gdb_exit |
| gdb_start |
| gdb_reinitialize_dir $srcdir/$subdir |
| gdb_load "${binfile}" |
| |
| runto_main |
| |
| # Set breakpoints on block functions |
| |
| set bp_at_first_block_function [gdb_get_line_number "Breakpoint for first Block function."] |
| set bp_at_second_block_function [gdb_get_line_number "Breakpoint for second Block function."] |
| set bp_at_third_block_function [gdb_get_line_number "Breakpoint for third Block function."] |
| |
| gdb_breakpoint $bp_at_first_block_function # This is breakpoint 2 |
| gdb_breakpoint $bp_at_second_block_function # This is breakpoint 3 |
| gdb_breakpoint $bp_at_third_block_function # This is breakpoint 4 |
| |
| # Verifying linear stepping through/over second block function (a single-line block function) |
| |
| gdb_test "continue" ".*Breakpoint 3, .*" "Continue to second Block function" |
| |
| gdb_test "next" ".*test_value .*" "Next" |
| |
| # Verifying linear stepping through first block function |
| |
| gdb_test "continue" ".*Breakpoint 2, .*" "Continue to first Block function" |
| |
| gdb_test "next" {.*(inval =|by_ref).*} "First next" |
| gdb_test "next" {.*(by_ref|return).*} "Second next" |
| ## next after return is not expected to be a return statement. |
| ## gdb_test "next" {.*(return|\}).*} "Third next" |
| |
| # Verifying linear stepping through third block function |
| |
| gdb_test "continue" ".*Breakpoint 4, .*" "Continue to third Block function" |
| |
| gdb_test "next" {.*(called_from_block|if).*} "First next" |
| gdb_test "next" {.*(if|my_struct).*} "Second next" |
| gdb_test "next" {.*(my_struct).*} "Third next" |
| gdb_test "next" {.*(my_struct|by_ref).*} "Fourth next" |
| gdb_test "next" {.*(by_ref|return).*} "Fifth next" |
| gdb_test "next" {.*(return|\}).*} "Sixth next" |
| |
| # Clean up after first set of tests |
| |
| gdb_test "delete 1 2 3 4" ".*" "Delete all breakpoints" |
| |
| # Set up for second set of tests |
| |
| gdb_test "break block_maker" "Breakpoint 5 at .*" "Set breakpoint at block_maker" |
| |
| gdb_test "break block_maker_struct" "Breakpoint 6 at .*" "Set breakpoint at block_maker_struct" |
| |
| send_gdb "run\n" |
| gdb_expect { |
| -re ".*Start it from the beginning.*y or n. $"\ |
| {send_gdb "y\n" |
| gdb_expect { |
| -re ".*Breakpoint 5, block_maker .*$gdb_prompt $"\ |
| {pass "Break at block_maker"} |
| -re "$gdb_prompt $"\ |
| {fail "Break at block_maker"} |
| timeout {fail "(timeout) Break at block_maker"} |
| } |
| } |
| -re "$gdb_prompt $"\ |
| {fail "rerun for stepping through block maker functions"} |
| timeout {fail "(timeout) rerun for stepping through block maker functions"} |
| } |
| |
| # Verifying linear stepping to & past statements that creates and |
| # assigns block |
| |
| gdb_test "next" ".*int nother_value .*" "First next" |
| gdb_test "next" ".*\}.*" "Second next, to end of block definition" |
| gdb_test "next" ".*int .*" "Third next, to second block definition" |
| gdb_test "next" ".*test_value .*" "Fourth next" |
| gdb_test "next" ".*test_value2 .*" "Fifth next" |
| gdb_test "next" ".*return Block_copy.*" "Sixth next" |
| |
| |
| # Verifying stepping to & past statement that creates and assigns |
| # block |
| |
| gdb_test "continue" ".*Breakpoint 6, block_maker_struct .*" "Continue to block_maker_struct" |
| |
| gdb_test "next" ".*int by_value .*" "First next" |
| gdb_test "next" ".*by_ref.*" "Second next" |
| gdb_test "next" ".*by_ref.*" "Third next" |
| gdb_test "next" ".*\}.*" "Fourth next, to end of block definition" |
| gdb_test "next" ".*test_value .*" "Fifth next" |
| gdb_test "next" ".*return Block_copy.*" "Sixth next" |
| |
| # gdb_test "continue" ".*Program exited normally.*" "Finish program" |
| |
| gdb_exit |
| return 0 |