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

# The same tests as in jit.exp, but loading JITer itself from a shared
# library.

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

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

#
# test running programs
#

set testfile jit-dlmain
set srcfile ${testfile}.c
set binfile [standard_output_file ${testfile}]
if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug shlib_load}] != "" } {
    untested jit-so.exp
    return -1
}

set testfile2 jit-main
set srcfile2 ${testfile2}.c
set binfile2 [standard_output_file ${testfile2}.so]
set binfile2_dlopen [shlib_target_file ${testfile2}.so]
if { [gdb_compile_shlib "${srcdir}/${subdir}/${srcfile2}" ${binfile2} {debug additional_flags="-DMAIN=jit_dl_main"}] != "" } {
    untested jit.exp
    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 resent.
if { [gdb_compile_shlib ${solib_srcfile} ${solib_binfile} {}] != "" } {
    untested jit-so.exp
    return -1
}

set solib_binfile_target [gdb_download ${solib_binfile}]

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

	clean_restart $testfile
	gdb_load_shlibs $binfile2

	# 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 before-dlopen" ]
	gdb_continue_to_breakpoint "break here before-dlopen"
	# 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 jit_libname = \"$binfile2_dlopen\""

	gdb_breakpoint [gdb_get_line_number "break here after-dlopen" ]
	gdb_continue_to_breakpoint "break here after-dlopen"

	gdb_breakpoint "$srcfile2:[gdb_get_line_number {break here 0} $srcfile2]"
	gdb_continue_to_breakpoint "break here 0"

	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 "$srcfile2:[gdb_get_line_number {break here 1} $srcfile2]"
	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 "$srcfile2:[gdb_get_line_number {break here 2} $srcfile2]"
	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\":"
    }
}

one_jit_test 1 "${hex}  jit_function_0000"
one_jit_test 2 "${hex}  jit_function_0000\[\r\n\]+${hex}  jit_function_0001"
