# Copyright 2012-2016 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] } {
    return 0
}

standard_testfile

set lib1name $testfile-solib1
set srcfile_lib1 $srcdir/$subdir/$lib1name.c
set binfile_lib1 [standard_output_file $lib1name.so]
set define1 -DSHLIB1_NAME=\"$binfile_lib1\"

set lib2name $testfile-solib2
set srcfile_lib2 $srcdir/$subdir/$lib2name.c
set binfile_lib2 [standard_output_file $lib2name.so]
set define2 -DSHLIB2_NAME=\"$binfile_lib2\"

if { [gdb_compile_shlib $srcfile_lib1 $binfile_lib1 \
	  [list additional_flags=-fPIC]] != "" } {
    untested "Could not compile $binfile_lib1."
    return -1
}

if { [gdb_compile_shlib $srcfile_lib2 $binfile_lib2 \
	  [list additional_flags=-fPIC]] != "" } {
    untested "Could not compile $binfile_lib2."
    return -1
}

set cflags "$define1 $define2"
if { [prepare_for_testing $testfile.exp $testfile $srcfile \
	  [list additional_flags=$cflags libs=-ldl]] } {
    return -1
}

# Run "info sharedlibrary" and check for the presence or absence of
# our libraries.
proc check_info_shared { test expect1 expect2 } {
    global lib1name
    global lib2name
    global gdb_prompt

    set actual1 0
    set actual2 0

    gdb_test_multiple "info sharedlibrary" $test {
	-re $lib1name {
	    set actual1 1
	    exp_continue
	}
	-re $lib2name {
	    set actual2 1
	    exp_continue
	}
	-re "\r\n$gdb_prompt $" {
	    if { $actual1 == $expect1 && $actual2 == $expect2 } {
		pass $test
	    } else {
		fail $test
	    }
	}
    }
}

# Start the inferior, and check neither of the libraries are loaded at
# the start.
if ![runto_main] {
    return 0
}
check_info_shared "info sharedlibrary #1" 0 0

# Set up breakpoints.
gdb_breakpoint "stop"
gdb_breakpoint "foo" allow-pending
gdb_breakpoint "bar" allow-pending

# Run to the first stop and check that only the first library is loaded.
gdb_continue_to_breakpoint "library load #1" "\\.?stop .*"
check_info_shared "info sharedlibrary #2" 1 0

# Run to the second stop and check that both libraries are loaded.
gdb_continue_to_breakpoint "library load #2" "\\.?stop .*"
check_info_shared "info sharedlibrary #3" 1 1

# Check that the next stop is in foo.
gdb_continue_to_breakpoint "library function #1" "\\.?foo .*"

# Check that the next stop is in bar.
gdb_continue_to_breakpoint "library function #2" "\\.?bar .*"

# Restart the inferior and make sure there are no breakpoint reset
# errors.  These can happen with the probes-based runtime linker
# interface if the cache is not cleared correctly.
set test "restart"
gdb_run_cmd
gdb_test_multiple "" $test {
    -re {Start it from the beginning\? \(y or n\) $} {
	send_gdb "y\n"
	exp_continue
    }
    -re {Error in re-setting breakpoint} {
	fail $test
    }
    -re "\r\n$gdb_prompt $" {
	pass $test
    }
}

# Check that neither library is loaded.
check_info_shared "info sharedlibrary #4" 0 0

# Run to the first stop and check that only the first library is loaded.
gdb_continue_to_breakpoint "library load #3" "\\.?stop .*"
check_info_shared "info sharedlibrary #5" 1 0

# Run to the second stop and check that both libraries are loaded.
gdb_continue_to_breakpoint "library load #4" "\\.?stop .*"
check_info_shared "info sharedlibrary #6" 1 1

# Check that the next stop is in foo.
gdb_continue_to_breakpoint "library function #3" "\\.?foo .*"

# Check that the next stop is in bar.
gdb_continue_to_breakpoint "library function #4" "\\.?bar .*"

# Run to the next stop and check that the first library has been unloaded.
gdb_continue_to_breakpoint "library unload #1" "\\.?stop .*"
check_info_shared "info sharedlibrary #7" 0 1

# Run to the last stop and check that both libraries are gone.
gdb_continue_to_breakpoint "library unload #2" "\\.?stop .*"
check_info_shared "info sharedlibrary #8" 0 0
