# Copyright 2011 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 $tracelevel {
    strace $tracelevel
}

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

if {[get_compiler_info not-used]} {
    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} {
    global verbose testfile srcfile2 binfile2 binfile2_dlopen solib_binfile_target solib_binfile_test_msg pf_prefix

    set old_pf_prefix $pf_prefix
    lappend pf_prefix "one_jit_test-$count:"

    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\":"
    set pf_prefix $old_pf_prefix
}

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