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

# This is to test whether GDBserver or other remote stubs deliver signal
# to the inferior while step over thread.  The program signal.c sends
# signal SIGABRT to itself via kill syscall.  The test sets tracepoints
# syscall instruction and the next one, and it is quite likely that
# GDBserver gets the signal when it steps over thread and does the
# collection.  If GDBserver doesn't deliver signal in thread step over,
# one collection is got for one tracepoint hit.  Otherwise, there may
# be two collections for one tracepoint hit, because tracepoint is
# collected once before step over, the program goes into signal handler
# (because signal is delivered in step over), and program goes back
# to the tracepoint again (one more collection) after returns from
# signal handler.

load_lib "trace-support.exp"

if [target_info exists gdb,nosignals] {
    verbose "Skipping signal.exp because of nosignals."
    return -1
}

standard_testfile

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

if ![runto_main] {
    return -1
}

if ![gdb_target_supports_trace] {
    unsupported "target does not support trace"
    return -1
}

# Step 1, find the syscall instruction address.

set syscall_insn ""

# Define the syscall instruction for each target.

if { [istarget "i\[34567\]86-*-linux*"] || [istarget "x86_64-*-linux*"] } {
    set syscall_insn "\[ \t\](int|syscall|sysenter)\[ \t\]"
} elseif { [istarget "aarch64*-*-linux*"] || [istarget "arm*-*-linux*"] } {
    set syscall_insn "\[ \t\](swi|svc)\[ \t\]"
} else {
    unsupported "unknown syscall instruction"
    return -1
}

# Start with a fresh gdb.
clean_restart ${testfile}
if ![runto_main] {
    return -1
}

gdb_breakpoint "kill" qualified
gdb_test "handle SIGABRT nostop noprint pass" ".*" "pass SIGABRT"

# Hit the breakpoint on $syscall for the first time.  In this time,
# we will let PLT resolution done, and the number single steps we will
# do later will be reduced.
gdb_test "continue" "Continuing\\..*Breakpoint $decimal, (.* in |__libc_|)kill \\(\\).*" \
    "continue to kill, 1st time"

# Hit the breakpoint on $syscall for the second time.  In this time,
# the address of syscall insn and next insn of syscall are recorded.
gdb_test "continue" "Continuing\\..*Breakpoint $decimal, (.* in |__libc_|)kill \\(\\).*" \
    "continue to kill, 2nd time"

gdb_test "display/i \$pc" ".*"

# Single step until we see a syscall insn or we reach the
# upper bound of loop iterations.
set msg "find syscall insn in kill"
set steps 0
set max_steps 1000
gdb_test_multiple "stepi" $msg {
    -re ".*$syscall_insn.*$gdb_prompt $" {
	pass $msg
    }
    -re "x/i .*=>.*\r\n$gdb_prompt $" {
	incr steps
	if {$steps == $max_steps} {
	    fail $msg
	} else {
	    send_gdb "stepi\n"
	    exp_continue
	}
    }
}

if {$steps == $max_steps} {
    return
}

# Remove the display
gdb_test_no_output "delete display 1"

set syscall_insn_addr [get_hexadecimal_valueof "\$pc" "0"]
set syscall_insn_next 0
set test "x/2i \$pc"
gdb_test_multiple $test $test {
    -re "$hex .*:\[^\r\n\]+\r\n\[ \]+($hex).*\.\r\n$gdb_prompt $" {
	set syscall_insn_next $expect_out(1,string)
    }
}

delete_breakpoints
gdb_breakpoint "start" qualified
gdb_continue_to_breakpoint "continue to start"

gdb_assert { 0 == [get_integer_valueof "counter" "1"] } "counter is zero"

delete_breakpoints

# Step 2, set tracepoints on syscall instruction and the next one.
# It is more likely to get signal on these two places when GDBserver
# is doing step-over.
gdb_test "trace *$syscall_insn_addr" "Tracepoint $decimal at .*" \
    "tracepoint on syscall instruction"
set tpnum [get_integer_valueof "\$bpnum" 0]
gdb_test "trace *$syscall_insn_next" "Tracepoint $decimal at .*" \
    "tracepoint on instruction following syscall instruction"

gdb_breakpoint "end" qualified

gdb_test_no_output "tstart"
gdb_test "continue" ".*Breakpoint.* end .*at.*$srcfile.*" \
    "continue to end"
gdb_test_no_output "tstop"

set iterations [get_integer_valueof "iterations" "0"]

gdb_assert { $iterations == [get_integer_valueof "counter" "0"] } \
    "iterations equals to counter"

# Record the hit times of each tracepoint in this array.
array set tracepoint_hits { }
for { set i $tpnum } { $i < [expr $tpnum + 2] } { incr i } {
  set tracepoint_hits($i) 0
}

while { 1 } {
   set test "tfind"
   set idx 0
   gdb_test_multiple $test $test {
	-re "Found trace frame $decimal, tracepoint ($decimal).*\r\n$gdb_prompt $" {
	    set idx [expr $expect_out(1,string)]
	    incr tracepoint_hits($idx)
	}
       -re "Target failed to find requested trace frame\..*\r\n$gdb_prompt $" {
	   set idx 0
       }
   }
   if {$idx == 0} {
	break
   }
}

# Step 3, check the number of collections on each tracepoint.

for { set i $tpnum } { $i < [expr $tpnum + 2] } { incr i } {

    if { $tracepoint_hits($i) == $iterations } {
	pass "tracepoint $i hit $iterations times"
    } elseif { $tracepoint_hits($i) > $iterations } {
	# GDBserver deliver the signal while stepping over tracepoint,
	# so it is possible that a tracepoint is collected twice.
	pass "tracepoint $i hit $iterations times (spurious collection)"
    } else {
	fail "tracepoint $i hit $iterations times"
    }
}
