# Copyright 2004, 2007, 2008, 2009 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 rs6000 prologue analyzer.

set prms_id 0
set bug_id 0

if ![istarget "powerpc-*-aix*"] then {
    verbose "Skipping powerpc-aix prologue tests."
    return
}

set testfile "powerpc-aix-prologue"
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}
if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {}] != "" } {
    unsupported "Testcase compile failed."
    return -1
}

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

# Insert a breakpoint in FUNCTION and verifies that the breakpoint was
# inserted at the expected location.  EXPECTED_LOCATION should be an
# offset relative to the function start address.
proc insert_breakpoint {function expected_location} {
    global gdb_prompt
    global expect_out
    global hex
    
    set address ""

    # Insert a breakpoint using the given function name, and extract
    # the breakpoint address for the output.
    gdb_test_multiple "break $function" "set breakpoint in $function" {
        -re "Breakpoint .* at ($hex).*$gdb_prompt $" {
            set address $expect_out(1,string)
        }
        default {
            fail "set breakpoint in $function"
        }
    }

    # If we managed to get the breakpoing address, then check that
    # we inserted it at the expected location by examining the
    # instruction at that address (we're not interested in the insn
    # itself, but rather at the address printed at the begining of
    # the instruction).
    if { $address != "" } then {
       gdb_test "x /i $address" \
                ".*<$function\\+$expected_location>.*" \
                "check $function breakpoint address"
    } else {
       fail "unable to compute breakpoint address"
    }

}

insert_breakpoint "li_stw" 12
insert_breakpoint "stack_check_probe_1" 16
insert_breakpoint "stack_check_probe_2" 40
insert_breakpoint "stack_check_probe_loop_1" 68
insert_breakpoint "stack_check_probe_loop_2" 60

