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


#
# Support procedures for trace testing
#


#
# Procedure: gdb_target_supports_trace
# Returns true if GDB is connected to a target that supports tracing.
# Allows tests to abort early if not running on a trace-aware target.
#

proc gdb_target_supports_trace { } {
    global gdb_prompt

    send_gdb "tstatus\n"
    gdb_expect {
	-re "\[Tt\]race can only be run on.*$gdb_prompt $" {
	    return 0
	}
	-re "\[Tt\]race can not be run on.*$gdb_prompt $" {
	    return 0
	}
	-re "\[Tt\]arget does not support.*$gdb_prompt $" {
	    return 0
	}
	-re ".*\[Ee\]rror.*$gdb_prompt $" {
	    return 0
	}
	-re ".*\[Ww\]arning.*$gdb_prompt $" {
	    return 0
	}
	-re ".*$gdb_prompt $" {
	    return 1
	}
	timeout {
	    return 0
	}
    }
}


#
# Procedure: gdb_delete_tracepoints
# Many of the tests depend on setting tracepoints at various places and
# running until that tracepoint is reached.  At times, we want to start
# with a clean slate with respect to tracepoints, so this utility proc 
# lets us do this without duplicating this code everywhere.
#

proc gdb_delete_tracepoints {} {
    global gdb_prompt

    send_gdb "delete tracepoints\n"
    gdb_expect 30 {
	-re "Delete all tracepoints.*y or n.*$" {
	    send_gdb "y\n"
	    exp_continue
	}
	-re ".*$gdb_prompt $" { # This happens if there were no tracepoints }
	timeout { 
	    perror "Delete all tracepoints in delete_tracepoints (timeout)" 
	    return 
	}
    }
    send_gdb "info tracepoints\n"
    gdb_expect 30 {
	 -re "No tracepoints.*$gdb_prompt $" {}
	 -re "$gdb_prompt $" { perror "tracepoints not deleted" ; return }
	 timeout { perror "info tracepoints (timeout)" ; return }
    }
}

#   Define actions for a tracepoint.
#   Arguments:
#       actions_command -- the command used to create the actions.
#                          either "actions" or "commands".
#	testname   -- identifying string for pass/fail output
#	tracepoint -- to which tracepoint(s) do these actions apply? (optional)
#	args       -- list of actions to be defined.
#   Returns:
#	zero       -- success
#	non-zero   -- failure

proc gdb_trace_setactions_command { actions_command testname tracepoint args } {
    global gdb_prompt

    set state 0
    set passfail "pass"
    send_gdb "$actions_command $tracepoint\n"
    set expected_result ""
    gdb_expect 5 {
	-re "No tracepoint number .*$gdb_prompt $" {
	    fail $testname
	    return 1
	}
	-re "Enter actions for tracepoint $tracepoint.*>" {
	    if { [llength $args] > 0 } {
		set lastcommand "[lindex $args $state]"
		send_gdb "[lindex $args $state]\n"
		incr state
		set expected_result [lindex $args $state]
		incr state
	    } else {
		send_gdb "end\n"
	    }
	    exp_continue
	}
	-re "\(.*\)\[\r\n\]+\[ \t]*>$" {
	    if { $expected_result != "" } {
		regsub "^\[^\r\n\]+\[\r\n\]+" "$expect_out(1,string)" "" out
		if ![regexp $expected_result $out] {
		    set passfail "fail"
		}
		set expected_result ""
	    }
	    if { $state < [llength $args] } {
		send_gdb "[lindex $args $state]\n"
		incr state
		set expected_result [lindex $args $state]
		incr state
	    } else {
		send_gdb "end\n"
		set expected_result ""
	    }
	    exp_continue
	}
	-re "\(.*\)$gdb_prompt $" {
	    if { $expected_result != "" } {
		if ![regexp $expected_result $expect_out(1,string)] {
		    set passfail "fail"
		}
		set expected_result ""
	    }
	    if { [llength $args] < $state } {
		set passfail "fail"
	    }
	}
	default {
	    set passfail "fail"
	}
    }
    if { $testname != "" } {
	$passfail $testname
    }
    if { $passfail == "pass" } then { 
	return 0
    } else {
	return 1
    }
}

# Define actions for a tracepoint, using the "actions" command.  See
# gdb_trace_setactions_command.
#
proc gdb_trace_setactions { testname tracepoint args } {
    eval gdb_trace_setactions_command "actions" {$testname} {$tracepoint} $args
}

# Define actions for a tracepoint, using the "commands" command.  See
# gdb_trace_setactions_command.
#
proc gdb_trace_setcommands { testname tracepoint args } {
    eval gdb_trace_setactions_command "commands" {$testname} {$tracepoint} $args
}

#
# Procedure: gdb_tfind_test
#   Find a specified trace frame.
#   Arguments: 
#	testname   -- identifying string for pass/fail output
#	tfind_arg  -- frame (line, PC, etc.) identifier
#	exp_res    -- Expected result of frame test
#	args       -- Test expression
#   Returns:
#	zero       -- success
#	non-zero   -- failure
#

proc gdb_tfind_test { testname tfind_arg exp_res args } {
    global gdb_prompt

    if { "$args" != "" } {
	set expr "$exp_res"
	set exp_res "$args"
    } else {
	set expr "(int) \$trace_frame"
    }
    set passfail "fail"

    gdb_test "tfind $tfind_arg" "" ""
    send_gdb "printf \"x \%d x\\n\", $expr\n"
    gdb_expect 10 {
	-re "x (-*\[0-9\]+) x" {
	    if { $expect_out(1,string) == $exp_res } {
		set passfail "pass"
	    }
	    exp_continue
	}
	-re "$gdb_prompt $" { }
    }
    $passfail "$testname"
    if { $passfail == "pass" } then { 
	return 0
    } else {
	return 1
    }
}

#
# Procedure: gdb_readexpr
#   Arguments:
#	gdb_expr    -- the expression whose value is desired
#   Returns:
#	the value of gdb_expr, as evaluated by gdb.
#       [FIXME: returns -1 on error, which is sometimes a legit value]
#

proc gdb_readexpr { gdb_expr } {
    global gdb_prompt

    set result -1
    send_gdb "print $gdb_expr\n"
    gdb_expect 5 {
	-re "\[$\].*= (\[0-9\]+).*$gdb_prompt $" {
	    set result $expect_out(1,string)
	}
	-re "$gdb_prompt $" { }
	default { }
    }
    return $result
}

#
# Procedure: gdb_gettpnum
#   Arguments:
#	tracepoint (optional): if supplied, set a tracepoint here.
#   Returns:
#	the tracepoint ID of the most recently set tracepoint.
#

proc gdb_gettpnum { tracepoint } {
    global gdb_prompt

    if { $tracepoint != "" } {
	gdb_test "trace $tracepoint" "" ""
    }
    return [gdb_readexpr "\$tpnum"]
}


#
# Procedure: gdb_find_function_baseline
#   Arguments:
#	func_name -- name of source function
#   Returns:
#	Sourcefile line of function definition (open curly brace),
#	or -1 on failure.  Caller must check return value.
#   Note:
#	Works only for open curly brace at beginning of source line!
#

proc gdb_find_function_baseline { func_name } {
    global gdb_prompt

    set baseline -1

    send_gdb "list $func_name\n"
#    gdb_expect {
#	-re "\[\r\n\]\[\{\].*$gdb_prompt $" {
#	    set baseline 1
#        }
#    }
}

#
# Procedure: gdb_find_function_baseline
#   Arguments:
#	filename: name of source file of desired function.
#   Returns:
#	Sourcefile line of function definition (open curly brace),
#	or -1 on failure.  Caller must check return value.
#   Note:
#	Works only for open curly brace at beginning of source line!
#

proc gdb_find_recursion_test_baseline { filename } {
    global gdb_prompt

    set baseline -1

    gdb_test "list $filename:1" "" ""
    send_gdb "search gdb_recursion_test line 0\n"
    gdb_expect {
	-re "(\[0-9\]+)\[\t \]+\{.*line 0.*$gdb_prompt $" {
	    set baseline $expect_out(1,string)
	}
	-re "$gdb_prompt $" { }
	default { }
    }
    return $baseline
}

# Return the location of the IPA library.

proc get_in_proc_agent {} {
    global objdir

    if [target_info exists in_proc_agent] {
	return [target_info in_proc_agent]
    } else {
	return $objdir/../gdbserver/libinproctrace.so
    }
}
