# 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 "global-blocks-lines"
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 bp_at_first_block_function   [gdb_get_line_number "Breakpoint for first Blo\
ck function."]
#set bp_at_second_block_function  [gdb_get_line_number "Breakpoint for second Bl\
ock function."]
#set bp_at_third_block_function   [gdb_get_line_number "Breakpoint for third Blo\
ck function."]

#gdb_breakpoint $bp_at_first_block_function #  This is breakpoint 1
#gdb_breakpoint $bp_at_second_block_function # This is breakpoint 2
#gdb_breakpoint $bp_at_third_block_function # This is breakpoint 3

gdb_breakpoint 9  # This is breakpoint 1
gdb_breakpoint 14 # This is breakpoint 2
gdb_breakpoint 20 # This is breakpoint 3


#gdb_test "break __block_global_1" "Breakpoint 1 at .*" "Set breakpoint at first Block function"
#gdb_test "break __block_global_2" "Breakpoint 2 at .*" "Set breakpoint at second Block function"
#gdb_test "break __block_global_3" "Breakpoint 3 at .*" "Set breakpoint at third Block function"

gdb_test "run" "Starting program: $binfile *\r\n\Reading symbols for shared libraries \(\[.+\]\)+ done.*Breakpoint 1.*" "continue to breakpoint at first Block function"

# Verifying linear stepping through first block function

gdb_test "next" ".*\}.*" "Next from first block function"

# Verifying linear stepping through second block function

gdb_test "continue" ".*Breakpoint 2, .*" "Continue to second block function"

gdb_test "next" ".*\}.*" "Next from second block function"

# Verifying linear stepping through third block function

gdb_test "continue" ".*Breakpoint 3, .*" "Continue to third block function"

gdb_test "next" ".*main .*printf.*" "Next to main"


# gdb_test "continue" ".*Program exited normally.*" "Finish program"

gdb_exit
return 0
