# Copyright 2009, 2010, 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/>.
#
# Contributed by Jan Kratochvil <jan.kratochvil@redhat.com>.

# Test GDB can cope with two libraries loaded with overlapping VMA ranges.
# Prelink libraries first so they can be loaded and their native address.
# In such case `struct linkmap'.l_addr will be zero.  Provide different
# unprelinked library files on the disk which have zero-based VMAs.  These
# different files should have their .dynamic section at a different offset in
# page size so that we get for
#   warning: .dynamic section for "..." is not at the expected address
# the reason
#   (wrong library or version mismatch?)
# and not:
#   difference appears to be caused by prelink, adjusting expectations
# In such case both disk libraries will be loaded at VMAs starting at zero.

if [skip_shlib_tests] {
    return 0
}

# Are we on a target board?  It is required for attaching to a process.
if [is_remote target] {
    return 0
}

if [get_compiler_info binfile-unused] {
    return -1;
}

# Library file.
set libname "solib-overlap-lib"
set srcfile_lib ${srcdir}/${subdir}/${libname}.c
# Binary file.
set testfile "solib-overlap-main"
set srcfile ${srcdir}/${subdir}/${testfile}.c

# Base addresses for `prelink -r' which should be compatible with both -m32 and
# -m64 targets.  If it clashes with system prelinked libraries it would give
# false PASS.
# Prelink first lib1 at 0x40000000 and lib2 at 0x41000000.
# During second pass try lib1 at 0x50000000 and lib2 at 0x51000000.
foreach prelink_lib1 {0x40000000 0x50000000} {
    set prelink_lib2 [format "0x%x" [expr $prelink_lib1 + 0x01000000]]

    set old_prefix $pf_prefix
    lappend pf_prefix "$prelink_lib1:"

    # Library file.
    set binfile_lib1 ${objdir}/${subdir}/${libname}1-${prelink_lib1}.so
    set binfile_lib1_test_msg OBJDIR/${subdir}/${libname}1-${prelink_lib1}.so
    set binfile_lib2 ${objdir}/${subdir}/${libname}2-${prelink_lib1}.so
    set binfile_lib2_test_msg OBJDIR/${subdir}/${libname}2-${prelink_lib1}.so
    set lib_flags {debug}
    # Binary file.
    set binfile_base ${testfile}-${prelink_lib1}
    set binfile ${objdir}/${subdir}/${binfile_base}
    set binfile_test_msg OBJDIR/${subdir}/${binfile_base}
    set bin_flags [list debug shlib=${binfile_lib1} shlib=${binfile_lib2}]
    set escapedbinfile  [string_to_regexp ${binfile}]

    if { [gdb_compile_shlib ${srcfile_lib} ${binfile_lib1} $lib_flags] != ""
	 || [gdb_compile_shlib ${srcfile_lib} ${binfile_lib2} $lib_flags] != ""
	 || [gdb_compile ${srcfile} ${binfile} executable $bin_flags] != "" } {
	untested "Could not compile ${binfile_lib1_test_msg}, ${binfile_lib2_test_msg} or ${binfile_test_msg}."
	return -1
    }

    if {[catch "system \"prelink -N -r ${prelink_lib1} ${binfile_lib1}\""] != 0
	|| [catch "system \"prelink -N -r ${prelink_lib2} ${binfile_lib2}\""] != 0} {
	# Maybe we don't have prelink.
	untested "Could not prelink ${binfile_lib1_test_msg} or ${binfile_lib2_test_msg}."
	return -1
    }

    # Start the program running and then wait for a bit, to be sure
    # that it can be attached to.

    set testpid [eval exec $binfile &]
    sleep 2
    if { [istarget "*-*-cygwin*"] } {
	# testpid is the Cygwin PID, GDB uses the Windows PID, which might be
	# different due to the way fork/exec works.
	set testpid [ exec ps -e | gawk "{ if (\$1 == $testpid) print \$4; }" ]
    }

    remote_exec build "mv -f ${binfile_lib1} ${binfile_lib1}-running"
    remote_exec build "mv -f ${binfile_lib2} ${binfile_lib2}-running"

    # Provide another exported function name to cause different sizes of sections.
    lappend lib_flags additional_flags=-DSYMB

    if { [gdb_compile_shlib ${srcfile_lib} ${binfile_lib1} $lib_flags] != ""
	 || [gdb_compile_shlib ${srcfile_lib} ${binfile_lib2} $lib_flags] != ""} {
	untested "Could not recompile ${binfile_lib1_test_msg} or ${binfile_lib2_test_msg}."
	remote_exec build "kill -9 ${testpid}"
	return -1
    }

    clean_restart ${binfile_base}
    # This testcase currently does not support remote targets.
    # gdb_load_shlibs ${binfile_lib1} ${binfile_lib2}

    # Here we should get:
    # warning: .dynamic section for ".../solib-overlap-lib1.so" is not at the expected address (wrong library or version mismatch?)
    # warning: .dynamic section for ".../solib-overlap-lib2.so" is not at the expected address (wrong library or version mismatch?)

    set test attach
    gdb_test_multiple "attach $testpid" $test {
	-re "Attaching to program.*`?$escapedbinfile'?, process $testpid.*$gdb_prompt $" {
	    pass $test
	}
	-re "Attaching to program.*`?$escapedbinfile\.exe'?, process $testpid.*\[Switching to thread $testpid\..*\].*$gdb_prompt $" {
	    # Response expected on Cygwin
	    pass $test
	}
    }

    # Detach the process.

    gdb_test "detach" "Detaching from program: .*$escapedbinfile, process $testpid"

    # Wait a bit for gdb to finish detaching

    sleep 5

    remote_exec build "kill -9 ${testpid}"

    set pf_prefix $old_prefix
}
