# Expect script for --exclude-libs tests
#   Copyright (C) 2004-2021 Free Software Foundation, Inc.
#
# This file is part of the GNU Binutils.
#
# 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, write to the Free Software
# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
# MA 02110-1301, USA.

# Make sure that ld can hide symbols from libraries when building a shared
# library.

# This test can only be run on ELF platforms.
if ![is_elf_format] {
    return
}

# No shared lib support on this target.
if { [istarget "mcore-*-*"] } {
    return
}

set as_opt ""

# This target requires extra as options when building code for shared
# libraries.
if { [istarget "tic6x-*-*"] } {
    set as_opt "-mpic -mpid=near"
}

set test1 "ld link shared library"
set test2 "ld export symbols from archive"
set test3 "ld link shared library with --exclude-libs"
set test4 "ld exclude symbols from archive - --exclude-libs libexclude"
set test5 "ld exclude symbols from archive - --exclude-libs libexclude.a"
set test6 "ld exclude symbols from archive - --exclude-libs ALL"
set test7 "ld exclude symbols from archive - --exclude-libs foo:libexclude.a"
set test8 "ld exclude symbols from archive - --exclude-libs foo,libexclude.a"
set test9 "ld don't exclude symbols from archive - --exclude-libs foo:bar"

if { ![ld_assemble_flags $as $as_opt $srcdir/$subdir/exclude1.s tmpdir/exclude1.o ]
     || ![ld_assemble_flags $as $as_opt $srcdir/$subdir/exclude2.s tmpdir/exclude2.o] } {
    unsupported $test1
    return
}

remote_file host delete "tmpdir/libexclude.a"
set catch_output [run_host_cmd "$ar" "cq tmpdir/libexclude.a tmpdir/exclude2.o"]
if {![string match "" $catch_output]} {
    fail $test1
    return
}

# Test that the symbol is normally exported.

if { [ld_link $ld tmpdir/exclude.so "--shared tmpdir/exclude1.o -Ltmpdir -lexclude"] } {
    pass $test1
} else {
    if [string match "*shared not supported*" $link_output] {
	unsupported "$test1 - -shared is not supported by this target"
    } else {
	fail $test1
    }
    return
}

if { [ld_nm $nm "-D" tmpdir/exclude.so]
     && [info exists nm_output(exclude_common)]
     && [info exists nm_output(exclude_sym)] } {
    pass $test2
} else {
    fail $test2
}

# Test --exclude-libs libexclude

if { [ld_link $ld tmpdir/exclude.so "--exclude-libs libexclude --shared tmpdir/exclude1.o -Ltmpdir -lexclude"] } {
    pass $test3
} else {
    fail $test3
}

if { [ld_nm $nm "-D" tmpdir/exclude.so]
     && ! [info exists nm_output(exclude_common)]
     &&  ! [info exists nm_output(exclude_sym)] } {
    pass $test4
} else {
    fail $test4
}

# Test alternate spellings of --exclude-libs

if { [ld_link $ld tmpdir/exclude.so "--exclude-libs libexclude.a --shared tmpdir/exclude1.o -Ltmpdir -lexclude"]
     && [ld_nm $nm "-D" tmpdir/exclude.so]
     && ! [info exists nm_output(exclude_common)]
     && ! [info exists nm_output(exclude_sym)] } {
    pass $test5
} else {
    fail $test5
}

if { [ld_link $ld tmpdir/exclude.so "--exclude-libs ALL --shared tmpdir/exclude1.o -Ltmpdir -lexclude"]
     && [ld_nm $nm "-D" tmpdir/exclude.so]
     && ! [info exists nm_output(exclude_common)]
     && ! [info exists nm_output(exclude_sym)] } {
    pass $test6
} else {
    fail $test6
}

if { [ld_link $ld tmpdir/exclude.so "--exclude-libs foo:libexclude.a --shared tmpdir/exclude1.o -Ltmpdir -lexclude"]
     && [ld_nm $nm "-D" tmpdir/exclude.so]
     && ! [info exists nm_output(exclude_common)]
     && ! [info exists nm_output(exclude_sym)] } {
    pass $test7
} else {
    fail $test7
}

if { [ld_link $ld tmpdir/exclude.so "--exclude-libs foo,libexclude.a --shared tmpdir/exclude1.o -Ltmpdir -lexclude"]
     && [ld_nm $nm "-D" tmpdir/exclude.so]
     && ! [info exists nm_output(exclude_common)]
     && ! [info exists nm_output(exclude_sym)] } {
    pass $test8
} else {
    fail $test8
}

if { [ld_link $ld tmpdir/exclude.so "--exclude-libs foo:bar --shared tmpdir/exclude1.o -Ltmpdir -lexclude"]
     && [ld_nm $nm "-D" tmpdir/exclude.so]
     && [info exists nm_output(exclude_common)]
     && [info exists nm_output(exclude_sym)] } {
    pass $test9
} else {
    fail $test9
}
