# Expect script for --exclude-libs tests
#   Copyright (C) 2004-2017 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"
}

global ar
global as
global ld
global nm
global nm_output

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] } {
    unresolved $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]} {
    unresolved $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] {
    unresolved $test2
} elseif { [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] {
    unresolved $test4
} elseif { ! [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
}
