# This testcase is part of GDB, the GNU debugger.
#
# Copyright 2017-2020 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 { [skip_btrace_tests] } {
    unsupported "target does not support record-btrace"
    return -1
}

standard_testfile
if {[gdb_compile_pthreads "$srcdir/$subdir/$srcfile" "$binfile" executable {debug}] != "" } {
    untested "failed to prepare"
    return -1
}

# We need to enable non-stop mode for the remote case.
save_vars { GDBFLAGS } {
    append GDBFLAGS " -ex \"set non-stop on\""
    clean_restart $testfile
}

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

set bp_1 [gdb_get_line_number "bp.1" $srcfile]

gdb_breakpoint $bp_1
gdb_continue_to_breakpoint "cont to $bp_1" ".*$bp_1\r\n.*"
gdb_test "cont&" "Continuing\."

# All threads are running.  Let's start recording.
gdb_test_no_output "record btrace"

proc check_tracing_enabled { thread } {
    global gdb_prompt

    with_test_prefix "thread $thread" {
        gdb_test "thread $thread" "(running).*" "is running"

        # We can't read the trace while the thread is running.
        gdb_test "info record" "Selected thread is running\." \
            "info record while running"

        # Try various commands that try to read trace.
        gdb_test "record instruction-history" "Selected thread is running\."
        gdb_test "record function-call-history" "Selected thread is running\."

        # Including reverse-stepping commands.
        gdb_test "reverse-continue" "\[Ss\]elected thread is running\."
        gdb_test "reverse-step" "\[Ss\]elected thread is running\."
        gdb_test "reverse-next" "\[Ss\]elected thread is running\."
        gdb_test "reverse-finish" "\[Ss\]elected thread is running\."

        # Stop the thread before reading the trace.
        gdb_test_multiple "interrupt" "interrupt" {
            -re "interrupt\r\n$gdb_prompt " {
                pass "interrupt"
            }
        }
        # Wait until the thread actually stopped.
        gdb_test_multiple "" "stopped" {
            -re "Thread $thread.*stopped\." {
                pass "stopped"
            }
        }
        # We will consume the thread's current location as part of the
        # "info record" output.
        gdb_test "info record" [multi_line \
            "Active record target: record-btrace" \
            "Recording format: .*" \
            "Recorded \[0-9\]+ instructions \[^\\\r\\\n\]*" \
        ]

        # Continue the thread again.
        gdb_test "cont&" "Continuing\."
    }
}

# Check that recording was started on each thread.
foreach thread {1 2 3 4} {
    check_tracing_enabled $thread
}

# Stop recording while all threads are running.
gdb_test "record stop" "Process record is stopped \[^\\\r\\\n\]*"
