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

if {[skip_shlib_tests]} {
    untested jit.exp
    return -1
}

if {[get_compiler_info]} {
    warning "Could not get compiler info"
    untested jit.exp
    return 1
}

#
# test running programs
#

proc compile_jit_test {testname options} {
    global testfile srcfile binfile srcdir subdir
    global solib_testfile solib_srcfile solib_binfile solib_binfile_test_msg
    global solib_binfile_target

    set testfile jit-main
    set srcfile ${testfile}.c
    set binfile [standard_output_file $testfile]
    if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" \
	      executable [concat debug $options]] != "" } {
	untested $testname
	return -1
    }

    set solib_testfile "jit-solib"
    set solib_srcfile "${srcdir}/${subdir}/${solib_testfile}.c"
    set solib_binfile [standard_output_file ${solib_testfile}.so]
    set solib_binfile_test_msg "SHLIBDIR/${solib_testfile}.so"

    # Note: compiling without debug info: the library goes through
    # symbol renaming by munging on its symbol table, and that
    # wouldn't work for .debug sections.  Also, output for "info
    # function" changes when debug info is present.
    if { [gdb_compile_shlib ${solib_srcfile} ${solib_binfile} {-fPIC}] != "" } {
	untested $testname
	return -1
    }

    set solib_binfile_target [gdb_download ${solib_binfile}]

    return 0
}

proc one_jit_test {count match_str} {
    with_test_prefix "one_jit_test-$count" {
	global verbose testfile solib_binfile_target solib_binfile_test_msg

	clean_restart $testfile

	# This is just to help debugging when things fail
	if {$verbose > 0} {
	    gdb_test "set debug jit 1"
	}

	if { ![runto_main] } {
	    fail "Can't run to main"
	    return
	}

	gdb_breakpoint [gdb_get_line_number "break here 0"]
	gdb_continue_to_breakpoint "break here 0"

	# Poke desired values directly into inferior instead of using "set args"
	# because "set args" does not work under gdbserver.
	gdb_test_no_output "set var argc = 2"
	gdb_test_no_output "set var libname = \"$solib_binfile_target\"" "set var libname = \"$solib_binfile_test_msg\""
	gdb_test_no_output "set var count = $count"

	gdb_breakpoint [gdb_get_line_number "break here 1"]
	gdb_continue_to_breakpoint "break here 1"

	gdb_test "info function jit_function" "$match_str"

	# This is just to help debugging when things fail
	if {$verbose > 0} {
	    gdb_test "maintenance print objfiles"
	    gdb_test "maintenance info break"
	}

	gdb_breakpoint [gdb_get_line_number "break here 2"]
	gdb_continue_to_breakpoint "break here 2"
	# All jit librares must have been unregistered
	gdb_test "info function jit_function" \
	    "All functions matching regular expression \"jit_function\":"
    }
}

if {[compile_jit_test jit.exp {}] < 0} {
    return
}
one_jit_test 1 "${hex}  jit_function_0000"
one_jit_test 2 "${hex}  jit_function_0000\[\r\n\]+${hex}  jit_function_0001"

with_test_prefix PIE {
    if {[compile_jit_test "jit.exp PIE tests" \
	     {additional_flags=-fPIE ldflags=-pie}] < 0} {
	return
    }

    one_jit_test 1 "${hex}  jit_function_0000"
}
