# Copyright 2012-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-simple.exp
    return -1
}

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

#
# test running programs
#

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

# A helper for jit_test_reread that invokes gdb_run_cmd.
proc jit_run {msg} {
    global decimal gdb_prompt

    gdb_run_cmd
    gdb_expect {
	-re "Inferior .* exited.*$gdb_prompt $" {
	    pass $msg
	}
	-re ".*$gdb_prompt $" {
	    fail $msg
	}
    }
}

# Test re-running an inferior with a JIT descriptor, where the JIT
# descriptor changes address between runs.
# http://sourceware.org/bugzilla/show_bug.cgi?id=13431
proc jit_test_reread {} {
    global testfile binfile subdir srcfile srcdir

    clean_restart $testfile

    # jit_run "initial run"
    runto_main

    gdb_test "print &__jit_debug_descriptor" "= .*" "blah 1"

    gdb_rename_execfile $binfile ${binfile}x

    if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug additional_flags=-DSPACER}] != "" } {
	fail "recompile $srcfile"
    } else {
	pass "recompile $srcfile"

	# jit_run "second run"

	runto_main
	gdb_test "print &__jit_debug_descriptor" "= .*" "blah 1"
    }
}

jit_test_reread
