# Copyright 2009-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/>.
#
# 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] {
    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} { with_test_prefix "$prelink_lib1" {
    set prelink_lib2 [format "0x%x" [expr $prelink_lib1 + 0x01000000]]

    # Library file.
    set binfile_lib1 [standard_output_file ${libname}1-${prelink_lib1}.so]
    set binfile_lib1_test_msg OBJDIR/${subdir}/${libname}1-${prelink_lib1}.so
    set binfile_lib2 [standard_output_file ${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 [standard_output_file ${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}"
}}
