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

standard_testfile

# Run the tests.  We run the tests two different ways: once with a
# plain probe, and once with a probe that has an associated semaphore.
# This returns -1 on failure to compile or start, 0 otherwise.
proc stap_test {exec_name {args ""}} {
    global testfile hex srcfile

    if {[prepare_for_testing "failed to prepare" ${exec_name} $srcfile \
	   [concat $args debug]]} {
	return -1
    }

    set semaphore_addr_var ""
    if {[string first "-DUSE_SEMAPHORES" $args] == -1} {
	gdb_test_no_output "set breakpoint always-inserted on"
	set semaphore_addr_var [get_hexadecimal_valueof "&relocation_marker" "0"]
    }

    if ![runto_main] {
	return -1
    }

    gdb_test "print \$_probe_argc" "No probe at PC $hex" \
	"check argument not at probe point"

    if {[string first "-DUSE_SEMAPHORES" $args] != -1} {
	gdb_test "info probes stap" \
	    "test *user *$hex *$hex .*"
    } else {
	gdb_test "info probes stap" \
	    "test *user *$hex .*"
    }

    if {[runto "-pstap test:user"]} {
	pass "run to -pstap test:user"
    } else {
	fail "run to -pstap test:user"
    }

    if {[string first "-DUSE_SEMAPHORES" $args] == -1} {
	set relocation_base \
	   [expr [get_hexadecimal_valueof "&relocation_marker" "0"] - $semaphore_addr_var]
	if {$relocation_base != 0} {
	   # Checks that GDB doesn't mistakenly relocate and write to null
	   # semaphore addresses.  If it were to relocate a zero-valued
	   # semaphore address and increment the value at that address, we
	   # would expect to see "\200ELF" here instead.
	   gdb_test "p (*(char*) $relocation_base)@4" \
		" = \"\\\\177ELF\"" \
		"null semaphore relocation"
	}
    }

    # Test probe arguments.
    gdb_test "print \$_probe_argc" " = 1" \
    "print \$_probe_argc for probe user"
    gdb_test "print \$_probe_arg0 == x" " = 1" \
    "check \$_probe_arg0 for probe user"
    gdb_test "print \$_probe_arg1" \
    	"Invalid probe argument 1 -- probe has 1 arguments available" \
    	"check \$_probe_arg1 for probe user"

    # Set a breakpoint with multiple probe locations.
    gdb_test "break -pstap test:two" \
	"Breakpoint \[0-9\]+ at $hex.*2 locations.*" \
	"set multi-location probe breakpoint (probe two)"

    # Reinit GDB, set a breakpoint on probe m4.
    delete_breakpoints
    if {[runto "-pstap test:m4"]} {
      pass "run to -pstap test:m4"
    } else {
      fail "run to -pstap test:m4"
    }

    # Testing probe arguments.
    gdb_test "print \$_probe_argc" " = 3" \
    "print \$_probe_argc for probe m4"
    gdb_test "print \$_probe_arg0" " = 42" \
    "check \$_probe_arg0 for probe m4"
    gdb_test "print (const char *) \$_probe_arg1" \
    " = $hex .This is a test message.*" \
    "check \$_probe_arg1 for probe m4"
    gdb_test "print \$_probe_arg2 == v" " = 1" \
    "check \$_probe_arg2 for probe m4"

    # Reinit GDB, set a breakpoint on probe ps.
    delete_breakpoints
    if {[runto "-pstap test:ps"]} {
      pass "run to -pstap test:m4"
    } else {
      fail "run to -pstap test:m4"
    }

    gdb_test "print \$_probe_argc" " = 3" \
    "print \$_probe_argc for probe ps"
    gdb_test "print (const char *) \$_probe_arg1" \
    " = $hex .This is another test message.*" \
    "print \$_probe_arg1 for probe ps"

    return 0
}

proc stap_test_no_debuginfo {exec_name {args ""}} {
    global testfile hex

    if {[prepare_for_testing "failed to prepare" ${exec_name} ${testfile}.c \
	   [concat $args nodebug optimize=-O2]]} {
	return -1
    }

    if {[runto "-pstap test:user"]} {
	pass "run to -pstap test:user"
    } else {
	fail "run to -pstap test:user"
    }

    # Test probe arguments.
    gdb_test "print \$_probe_argc" " = 1" \
    "print \$_probe_argc for probe user"
    gdb_test "print \$_probe_arg0 == 23" " = 1" \
    "check \$_probe_arg0 for probe user"
    gdb_test "print \$_probe_arg1" \
    	"Invalid probe argument 1 -- probe has 1 arguments available" \
    	"check \$_probe_arg1 for probe user"

    # Set a breakpoint with multiple probe locations.
    # In this scenario, we may expect more than 2 locations because of
    # the optimizations (inlining, loop unrolling, etc).
    gdb_test "break -pstap test:two" \
	"Breakpoint .* at $hex.*\[0-9\]+ locations.*" \
	"set multi-location probe breakpoint (probe two)"

    # Reinit GDB, set a breakpoint on probe m4.
    delete_breakpoints
    if {[runto "-pstap test:m4"]} {
      pass "run to -pstap test:m4"
    } else {
      fail "run to -pstap test:m4"
    }

    # Testing probe arguments.
    gdb_test "print \$_probe_argc" " = 3" \
    "print \$_probe_argc for probe m4"
    gdb_test "print \$_probe_arg0" " = 42" \
    "check \$_probe_arg0 for probe m4"
    gdb_test "print (const char *) \$_probe_arg1" \
    " = $hex .This is a test message.*" \
    "check \$_probe_arg1 for probe m4"
    gdb_test "print \$_probe_arg2 == 0" " = 1" \
    "check \$_probe_arg2 for probe m4"

    # Reinit GDB, set a breakpoint on probe ps.
    delete_breakpoints
    if {[runto "-pstap test:ps"]} {
      pass "run to -pstap test:m4"
    } else {
      fail "run to -pstap test:m4"
    }

    gdb_test "print \$_probe_argc" " = 3" \
    "print \$_probe_argc for probe ps"
    gdb_test "print (const char *) \$_probe_arg1" \
    " = $hex .This is another test message.*" \
    "print \$_probe_arg1 for probe ps"

    return 0
}

with_test_prefix "without semaphore, not optimized" {
    if {[stap_test "stap-probe-nosem-noopt"] == -1} {
	untested "stap probe test failed"
	  return -1
    }

    foreach_with_prefix pie { "nopie" "pie" } {
	stap_test "stap-probe-nosem-noopt-$pie" $pie
    }
}

with_test_prefix "with semaphore, not optimized" {
    stap_test "stap-probe-sem-noopt" additional_flags=-DUSE_SEMAPHORES
}

with_test_prefix "without semaphore, optimized" {
    stap_test_no_debuginfo "stap-probe-nosem-opt"
}

with_test_prefix "with semaphore, optimized" {
    stap_test_no_debuginfo "stap-probe-sem-opt" additional_flags=-DUSE_SEMAPHORES
}
