# Copyright (C) 2008, 2009, 2010, 2011 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/>.


# This file is part of the gdb testsuite.

if $tracelevel {
    strace $tracelevel
}

# Test stepping over permanent breakpoints on i386.

if {(![istarget "x86_64-*-*"] && ![istarget "i?86-*-*"]) || ![is_ilp32_target] } then {
    verbose "Skipping skip over permanent breakpoint on i386 tests."
    return
}

set testfile "i386-bp_permanent"
set srcfile i386-prologue.c
set binfile ${objdir}/${subdir}/${testfile}

# some targets have leading underscores on assembly symbols.
set additional_flags [gdb_target_symbol_prefix_flags]

# Don't use "debug", so that we don't have line information for the assembly
# fragments.
if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable [list $additional_flags]] != "" } {
    untested ${testfile}.exp
    return -1
}


gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}

#
# Run to `main' where we begin our tests.
#

if ![runto_main] then {
  return -1
}

set function standard

set retcode [gdb_test_multiple "disassemble $function" "Disassemble function '$function'" {
    -re ".*($hex) <\\+0>.*($hex) <\\+4>.*($hex) <\\+5>.*($hex) <\\+6>.*$gdb_prompt $" {
      set function_start $expect_out(1,string);
      set address $expect_out(2,string);
      set address1 $expect_out(3,string);
      set address2 $expect_out(4,string);
    }
}]

if {$retcode != 0} {
  fail "Disassemble failed, skipping entire test."
  return -1
}

gdb_breakpoint "*$function_start"

gdb_breakpoint "*$address"

gdb_test "continue" "Breakpoint .*, $function_start in $function.*" \
	 "Stop at the '$function' start breakpoint (fetching esp)."

# We want to fetch esp at the start of '$function' function to make sure
# skip_permanent_breakpoint implementation really skips only the perm. 
# breakpoint. If, for whatever reason, 'leave' instruction doesn't get
# executed, esp will not have this value.
set start_esp 0
gdb_test_multiple "print \$esp" "Fetch esp value." {
    -re "\\\$1.*($hex).*$gdb_prompt $" {
      set start_esp $expect_out(1,string);
    }
}

gdb_test "continue" "Breakpoint .*, $address in $function.*" \
	 "Stop at permanent breakpoint."

gdb_test "stepi" "$address1|$address2 in $function.*" \
	 "Single stepping past permanent breakpoint."

gdb_test "print \$esp" ".*$start_esp.*" \
	 "ESP value does not match - step_permanent_breakpoint wrong."

