# Copyright 2008-2016 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, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
# This file is part of the gdb testsuite.

# Test single stepping through atomic sequences beginning with
# a ldxr instruction and ending with a stxr instruction.

if {![is_aarch64_target]} {
    verbose "Skipping ${gdb_test_file_name}."
    return
}

standard_testfile
if { [prepare_for_testing ${testfile}.exp ${testfile} ${srcfile}] } {
    return -1
}

if ![runto_main] {
    untested "could not run to main"
    return -1
}

gdb_breakpoint "[gdb_get_line_number "ldxr"]" \
  "Breakpoint $decimal at $hex" \
  "Set the breakpoint at the start of the sequence"

gdb_test "continue" "Continuing.*Breakpoint $decimal.*" \
  "Continue until breakpoint"

gdb_test "next" ".*__asm __volatile.*" \
  "Step through the ldxr/stxr sequence"

gdb_test "next" ".*return dword.*" \
  "Stepped through sequence through conditional branch"
