# Copyright 2012-2020 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 "failed to compile shared library 1"
    return -1
}

if { [gdb_compile_shlib $srcfile_lib2 $binfile_lib2 \
	  [list additional_flags=-fPIC]] != "" } {
    untested "failed to compile shared library 2"
    return -1
}

set cflags "$define1 $define2"
if { [prepare_for_testing "failed to prepare" $testfile $srcfile \
	  [list additional_flags=$cflags shlib_load]] } {
    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

with_test_prefix styled {
    save_vars { env(TERM) } {
	# We need an ANSI-capable terminal to get the output.
	setenv TERM ansi

	clean_restart $testfile

	gdb_test_no_output "set style enabled off"
	if {![runto_main]} {
	    return 0
	}
	gdb_breakpoint "stop"
	gdb_continue_to_breakpoint "library load #1" "\\.?stop .*"

	# Simple test for "info sharedlibrary" styling.  Look for styled
	# addresses and file name.
	set addr [style $hex address]
	# Use a non-greedy match here to avoid accidentally picking up
	# other escape sequences.
	set sofile [style ".*?" file]
	gdb_test_no_output "set style enabled on"
	gdb_test "info sharedlibrary" \
	    "$addr\[ \t\]+$addr.*$sofile\r\n.*"
    }
}
