# This testcase is part of GDB, the GNU debugger.
#
# Copyright 2013 Free Software Foundation, Inc.
#
# Contributed by Intel Corp. <christian.himpel@intel.com>
#
# 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/>.

# check for btrace support
if { [skip_btrace_tests] } { return -1 }

# compile and run to main
standard_testfile .c .S
if [prepare_for_testing $testfile.exp $testfile "$srcfile $srcfile2" {debug}] {
    return -1
}
if ![runto_main] {
    return -1
}

# set bp before loop and continue
set bp_location [gdb_get_line_number "bp.1" $srcfile2]
gdb_breakpoint $srcfile2:$bp_location
gdb_continue_to_breakpoint "cont to $bp_location" ".*$srcfile2:$bp_location.*"

# start btrace
gdb_test_no_output "record btrace"

# set bp after loop and continue
set bp_location [gdb_get_line_number "bp.2" $srcfile2]
gdb_breakpoint $srcfile2:$bp_location
gdb_continue_to_breakpoint "cont to $bp_location" ".*$srcfile2:$bp_location.*"

# The following test cases test if "browsing" through the
# instruction history works as expected. So for the tests
# it is necessary to count the number of lines that are
# shown by the "record instruction-history" command.

set testname "determine number of recorded instructions"
gdb_test_multiple "info record" $testname {
    -re "Active record target: record-btrace\r\nRecorded \(\[0-9\]*\) instructions in \(\[0-9\]*\) functions for thread 1 .*\\.\r\n$gdb_prompt $" {
        set traced $expect_out(1,string)
        set traced_functions $expect_out(2,string)
        pass $testname
    }
}

# we have exactly 7 instructions here
set message "exactly 7 instructions"
if { $traced != 7 } {
    fail $message
} else {
    pass $message
}

# test that we see the expected instructions
gdb_test "record instruction-history 1,6" "
1\t   0x\[0-9a-f\]+ <loop\\+\[0-9\]+>:\tje     0x\[0-9a-f\]+ <loop\\+\[0-9\]+>\r
2\t   0x\[0-9a-f\]+ <loop\\+\[0-9\]+>:\tdec    %eax\r
3\t   0x\[0-9a-f\]+ <loop\\+\[0-9\]+>:\tjmp    0x\[0-9a-f\]+ <loop\\+\[0-9\]+>\r
4\t   0x\[0-9a-f\]+ <loop\\+\[0-9\]+>:\tcmp    \\\$0x0,%eax\r
5\t   0x\[0-9a-f\]+ <loop\\+\[0-9\]+>:\tje     0x\[0-9a-f\]+ <loop\\+\[0-9\]+>\r"

gdb_test "record instruction-history /f 1,+5" "
1\t   0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tje     0x\[0-9a-f\]+ <loop\\+\[0-9\]+>\r
2\t   0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tdec    %eax\r
3\t   0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tjmp    0x\[0-9a-f\]+ <loop\\+\[0-9\]+>\r
4\t   0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tcmp    \\\$0x0,%eax\r
5\t   0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tje     0x\[0-9a-f\]+ <loop\\+\[0-9\]+>\r"

gdb_test "record instruction-history /p 6,-5" "
1\t0x\[0-9a-f\]+ <loop\\+\[0-9\]+>:\tje     0x\[0-9a-f\]+ <loop\\+\[0-9\]+>\r
2\t0x\[0-9a-f\]+ <loop\\+\[0-9\]+>:\tdec    %eax\r
3\t0x\[0-9a-f\]+ <loop\\+\[0-9\]+>:\tjmp    0x\[0-9a-f\]+ <loop\\+\[0-9\]+>\r
4\t0x\[0-9a-f\]+ <loop\\+\[0-9\]+>:\tcmp    \\\$0x0,%eax\r
5\t0x\[0-9a-f\]+ <loop\\+\[0-9\]+>:\tje     0x\[0-9a-f\]+ <loop\\+\[0-9\]+>\r"

gdb_test "record instruction-history /pf 1,6" "
1\t0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tje     0x\[0-9a-f\]+ <loop\\+\[0-9\]+>\r
2\t0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tdec    %eax\r
3\t0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tjmp    0x\[0-9a-f\]+ <loop\\+\[0-9\]+>\r
4\t0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tcmp    \\\$0x0,%eax\r
5\t0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tje     0x\[0-9a-f\]+ <loop\\+\[0-9\]+>\r"

# the following tests are checking the iterators
# to avoid lots of regexps, we just check the number of lines that
# were printed during command execution.

# test_lines_output returns the output lines from command as a list.
proc test_lines_output { command message } {
    global gdb_prompt
    set message "test_lines_output: $message"
    gdb_test_multiple $command $message {
        -re "\n\(.*\)\r\n$gdb_prompt $" {
            return [split [string trim $expect_out(1,string)] "\n"]
        }
    }
}

# test_lines_length returns the number of lines from command.
proc test_lines_length { command message } {
    return [llength [test_lines_output $command $message]]
}

# show instruction history with unlimited size, we expect to see
# all $traced instructions
gdb_test_no_output "set record instruction-history-size 0"
set message "record instruction-history - unlimited"
set lines [test_lines_length "record instruction-history 0" $message]
if { $traced != $lines } {
    fail $message
} else {
    pass $message
}

gdb_test_no_output "set record instruction-history-size $traced"
set message "record instruction-history - traced"
set lines [test_lines_length "record instruction-history 0" $message]
if { $traced != $lines } {
    fail $message
} else {
    pass $message
}

# test that the iterator works
set history_size 3
gdb_test_no_output "set record instruction-history-size $history_size"
set message "browse history forward start"
set lines [test_lines_length "record instruction-history 0" $message]
if { $lines != $history_size } {
    fail $message
} else {
    pass $message
}

set message "browse history forward middle"
set lines [test_lines_length "record instruction-history +" $message]
if { $lines != $history_size } {
    fail $message
} else {
    pass $message
}

set message "browse history forward last"
set lines [test_lines_length "record instruction-history +" $message]
if { $lines != 1 } {
    fail $message
} else {
    pass $message
}

gdb_test "record instruction-history" "At the end of the branch trace record\\." "browse history forward beyond 1"

# make sure we cannot move further
gdb_test "record instruction-history" "At the end of the branch trace record\\." "browse history forward beyond 2"

set message "browse history backward last"
set lines [test_lines_length "record instruction-history -" $message]
if { $lines != $history_size } {
    fail $message
} else {
    pass $message
}

set message "browse history backward middle"
set lines [test_lines_length "record instruction-history -" $message]
if { $lines != $history_size } {
    fail $message
} else {
    pass $message
}

set message "browse history backward first"
set lines [test_lines_length "record instruction-history -" $message]
if { $lines != 1 } {
    fail $message
} else {
    pass $message
}

gdb_test "record instruction-history -" "At the start of the branch trace record\\." "browse history backward beyond 1"

# make sure we cannot move further back
gdb_test "record instruction-history -" "At the start of the branch trace record\\." "browse history backward beyond 2"
