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


# This file is part of the gdb testsuite.

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

