# Copyright 2014-2021 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/>.

if { ![istarget "x86_64-*-*"] || ![is_lp64_target] } {
    verbose "Skipping amd64-stap-wrong-subexp.exp"
    return
}

standard_testfile amd64-stap-wrong-subexp.S

if { [prepare_for_testing "failed to prepare" $testfile $srcfile] } {
    return -1
}

proc goto_probe { probe_name } {
    if { ![runto "-pstap $probe_name"] } {
	return
    }
}

goto_probe foo
gdb_test "print \$_probe_arg0" "Invalid operator `\\\(' on expression .*" \
    "print probe foo arg0"

goto_probe bar
gdb_test "print \$_probe_arg0" " = -4" "print probe bar arg0"
gdb_test "print \$_probe_arg1" " = -8" "print probe bar arg1"
