# Copyright 2011-2012 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 ${objdir}/${subdir}/${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 ${objdir}/${subdir}/${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 "${objdir}/${subdir}/${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"
