# Expect script for ld-visibility tests
#   Copyright 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2010, 2012
#   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.
#
# Written by Ian Lance Taylor (ian@cygnus.com)
#	     and H.J. Lu (hjl@gnu.org)
#

# Make sure that ld can generate ELF shared libraries with visibility.

# This test can only be run on a couple of ELF platforms.
# Square bracket expressions seem to confuse istarget.
if { ![istarget hppa*64*-*-hpux*] \
     && ![istarget hppa*-*-linux*] \
     && ![istarget i?86-*-linux*] \
     && ![istarget i?86-*-gnu*] \
     && ![istarget *-*-nacl*] \
     && ![istarget ia64-*-linux*] \
     && ![istarget m68k-*-linux*] \
     && ![istarget mips*-*-linux*] \
     && ![istarget powerpc*-*-linux*] \
     && ![istarget arm*-*-linux*] \
     && ![istarget alpha*-*-linux*] \
     && ![istarget sparc*-*-linux*] \
     && ![istarget s390*-*-linux*] \
     && ![istarget sh\[34\]*-*-linux*] \
     && ![istarget x86_64-*-linux*] } {
    return
}

if { [istarget *-*-linux*aout*] \
     || [istarget *-*-linux*oldld*] } {
    return
}

set test_list [lsort [glob -nocomplain $srcdir/$subdir/*.d]]
foreach t $test_list {
    # We need to strip the ".d", but can leave the dirname.
    verbose [file rootname $t]
    run_dump_test [file rootname $t]
}

# The remaining tests can only be run if ld generates native executables.
if ![isnative] then {return}

set tmpdir tmpdir
set SHCFLAG ""
set shared_needs_pic "no"

if { [istarget rs6000*-*-aix*] || [istarget powerpc*-*-aix*] } {

    # AIX shared libraries do not seem to support useful features,
    # like overriding the shared library function or letting the
    # shared library refer to objects defined in the main program.  We
    # avoid testing those features.
    set SHCFLAG "-DXCOFF_TEST"

    # The AIX 3.2.5 loader appears to randomly fail when loading
    # shared libraries from NSF mounted partitions, so we avoid any
    # potential problems by using a local directory.
    catch {exec /bin/sh -c "echo $$"} pid
    set tmpdir /usr/tmp/ld.$pid
    catch "exec mkdir $tmpdir" exec_status

    # On AIX, we need to explicitly export the symbols the shared
    # library is going to provide, and need.
    set file [open $tmpdir/xcoff.exp w]
    puts $file shlibvar1
    puts $file shlibvar2
    puts $file shlib_shlibvar1
    puts $file shlib_shlibvar2
    puts $file shlib_shlibcall
    puts $file shlib_shlibcalled
    puts $file shlib_checkfunptr1
    puts $file shlib_getfunptr1
    puts $file shlib_check
    close $file
}

if [istarget arm*-*-linux*] {
    # On ARM section anchors can change the symbol pre-emptability for
    # non-PIC shared libraries, causing these tests to fail.  Turn section
    # anchors off.
    set SHCFLAG "-fno-section-anchors"

    # On targets that have MOVW the compiler will emit relocations which
    # the linker doesn't support when compiling -shared without -fpic.  The
    # test to find out whether we want to XFAIL the non-PIC tests requires
    # a compile - so we pre-calculate it here.  We also note that this can
    # only affect arm*-*-*eabi* targets as the old ABI doesn't support v7.
    if [istarget arm*-*-*eabi*] {
	set file [open $tmpdir/movw-detect.c w]
	puts $file "void foo(void) { __asm (\"movw r0, #0\"); }"
	close $file
	if [run_host_cmd_yesno "$CC" "$CFLAGS -c $tmpdir/movw-detect.c -o $tmpdir/movw-detect.o"] {
	    set shared_needs_pic "yes"
	}
    }
}

set support_protected "no"

if { [istarget *-*-linux*]
     || [istarget *-*-nacl*]
     || [istarget *-*-gnu*] } {
    if [ld_compile "$CC -g $CFLAGS -DPROTECTED_CHECK" $srcdir/$subdir/main.c $tmpdir/main.o] {
      if [ld_simple_link $CC $tmpdir/main "$tmpdir/main.o"] {
	catch "exec $tmpdir/main" support_protected
      }
    }
}

# The test procedure.
proc visibility_test { visibility progname testname main sh1 sh2 dat args } {
    global CC
    global srcdir
    global subdir
    global exec_output
    global link_output
    global host_triplet
    global tmpdir

    if [llength $args] { set shldflags [lindex $args 0] } else { set shldflags "" }

    # Build the shared library.
    # On AIX, we need to use an export file.
    set shared -shared
    if { [istarget rs6000*-*-aix*] || [istarget powerpc*-*-aix*] } {
	set shared "-bM:SRE -bE:$tmpdir/xcoff.exp"
    }
    if {![ld_simple_link $CC $tmpdir/$progname.so "$shared $shldflags $tmpdir/$sh1 $tmpdir/$sh2"]} {
	if { [ string match $visibility "hidden_undef" ]
	     && [regexp "undefined reference to \`\.?visibility\'" $link_output]
	     && [regexp "undefined reference to \`visibility_var\'" $link_output] } {
    	    pass "$testname"
	} else { if { [ string match $visibility "protected_undef" ]
	     && [regexp "undefined reference to \`\.?visibility\'" $link_output]
	     && [regexp "undefined reference to \`visibility_var\'" $link_output] } {
    	    pass "$testname"
	} else {
	    fail "$testname"
	}}
    	return
    }

    # Link against the shared library.  Use -rpath so that the
    # dynamic linker can locate the shared library at runtime.
    # On AIX, we must include /lib in -rpath, as otherwise the loader
    # can not find -lc.
    set rpath $tmpdir
    if { [istarget rs6000*-*-aix*] || [istarget powerpc*-*-aix*] } {
	set rpath /lib:$tmpdir
    }
    if ![ld_simple_link $CC $tmpdir/$progname "-Wl,-rpath,$rpath $tmpdir/$main $tmpdir/$progname.so"] {
	if { [ string match $visibility "hidden" ]
	     && [regexp "undefined reference to \`\.?visibility\'" $link_output]
	     && [regexp "undefined reference to \`visibility_var\'" $link_output] } {
    	    pass "$testname"
	} else { if { [ string match $visibility "hidden_undef_def" ]
	     && [regexp "undefined reference to \`\.?visibility\'" $link_output]
	     && [regexp "undefined reference to \`visibility_def\'" $link_output]
	     && [regexp "undefined reference to \`\.?visibility_func\'" $link_output]
	     && [regexp "undefined reference to \`visibility_var\'" $link_output] } {
    	    pass "$testname"
	} else {
    	    fail "$testname"
	}}
    	return
    }

    if { [ string match $visibility "hidden" ]
	 || [ string match $visibility "hidden_undef" ]
	 || [ string match $visibility "protected_undef" ] } {
	fail "$testname"
    }

    # Run the resulting program
    send_log "$tmpdir/$progname >$tmpdir/$progname.out\n"
    verbose "$tmpdir/$progname >$tmpdir/$progname.out"
    catch "exec $tmpdir/$progname >$tmpdir/$progname.out" exec_output
    if ![string match "" $exec_output] then {
	send_log "$exec_output\n"
	verbose "$exec_output"
	fail "$testname"
    	return
    }

    send_log "diff $tmpdir/$progname.out $srcdir/$subdir/$dat.dat\n"
    verbose "diff $tmpdir/$progname.out $srcdir/$subdir/$dat.dat"
    catch "exec diff $tmpdir/$progname.out $srcdir/$subdir/$dat.dat" exec_output
    set exec_output [prune_warnings $exec_output]

    if {![string match "" $exec_output]} then {
	send_log "$exec_output\n"
	verbose "$exec_output"
	fail "$testname"
        return
    }

    pass "$testname"
}

proc visibility_run {visibility} {
    global CC
    global CFLAGS
    global SHCFLAG
    global srcdir
    global subdir
    global tmpdir
    global picflag
    global target_triplet
    global support_protected
    global shared_needs_pic

    if [ string match $visibility "hidden" ] {
	set VSBCFLAG "-DHIDDEN_TEST"
    } else { if [ string match $visibility "hidden_normal" ] {
	set VSBCFLAG "-DHIDDEN_NORMAL_TEST"
    } else { if [ string match $visibility "hidden_undef" ] {
	set VSBCFLAG "-DHIDDEN_UNDEF_TEST"
    } else { if [ string match $visibility "hidden_undef_def" ] {
	set VSBCFLAG "-DHIDDEN_UNDEF_TEST -DDSO_DEFINE_TEST"
    } else { if [ string match $visibility "hidden_weak" ] {
	set VSBCFLAG "-DHIDDEN_WEAK_TEST"
    } else { if [ string match $visibility "protected" ] {
	set VSBCFLAG "-DPROTECTED_TEST"
    } else { if [ string match $visibility "protected_undef" ] {
	set VSBCFLAG "-DPROTECTED_UNDEF_TEST"
    } else { if [ string match $visibility "protected_undef_def" ] {
	set VSBCFLAG "-DPROTECTED_UNDEF_TEST -DDSO_DEFINE_TEST"
    } else { if [ string match $visibility "protected_weak" ] {
	set VSBCFLAG "-DPROTECTED_WEAK_TEST"
    } else {
	set VSBCFLAG ""
    }}}}}}}}}

    if { [istarget powerpc*-*-linux*] \
	 || ( [istarget mips*-*-linux*] && [at_least_gcc_version 4 3] )} {
	# Testing non-PIC libraries is a waste of effort on any target.
	# If you don't pass -fpic or -fPIC to gcc, gcc will assume quite
	# reasonably that you are not compiling for a shared library.
	# It can then make optimisations that result in shared library
	# functions and variables not being overridable.  Newer versions
	# of gcc are more likely to do this.
    } else {
    # Compile the main program.
    if ![ld_compile "$CC -g $CFLAGS $SHCFLAG $VSBCFLAG" $srcdir/$subdir/main.c $tmpdir/mainnp.o] {
	unresolved "visibility ($visibility) (non PIC)"
	unresolved "visibility ($visibility)"
    } else {
	# The shared library is composed of two files.  First compile them
	# without using -fpic.  That should work on an ELF system,
	# although it will be less efficient because the dynamic linker
	# will need to do more relocation work.  However, note that not
	# using -fpic will cause some of the tests to return different
	# results.
	if { ![ld_compile "$CC -g $CFLAGS $SHCFLAG $VSBCFLAG" $srcdir/$subdir/sh1.c $tmpdir/sh1np.o]
	     || ![ld_compile "$CC -g $CFLAGS $SHCFLAG $VSBCFLAG" $srcdir/$subdir/sh2.c $tmpdir/sh2np.o] } {
	    unresolved "visibility ($visibility) (non PIC)"
	} else { if { [istarget rs6000*-*-aix*] || [istarget powerpc*-*-aix*] } {
	    visibility_test $visibility vnp "visibility ($visibility) (non PIC)" mainnp.o sh1np.o sh2np.o xcoff
	} else {
	    # SunOS non PIC shared libraries don't permit some cases of
	    # overriding.
	    if { [ string match $visibility "protected" ]
		 || [ string match $visibility "protected_undef_def" ] } {
		if [ string match $support_protected "no" ] {
		    setup_xfail $target_triplet
		}
	    } else {
		setup_xfail "*-*-sunos4*"
	    }

	    # Non-pic code uses name binding rules for applications to
	    # reference variables by gp-relative relocs, which can't be
	    # used with overridable symbols.
	    if { ![ string match $visibility "hidden_undef" ]
		 && ![ string match $visibility "protected_undef" ] } {
		setup_xfail "ia64-*-linux*"
		setup_xfail "alpha*-*-linux*"
	    }
	    if { ![ string match $visibility "hidden" ]
		 && ![ string match $visibility "hidden_undef" ]
		 && ![ string match $visibility "hidden_undef_def" ]
		 && ![ string match $visibility "protected_undef" ] } {
		setup_xfail "s390x-*-linux*"
		if { [istarget sparc*-*-linux*] && [is_elf64 $tmpdir/mainnp.o] } {
		    setup_xfail "sparc*-*-linux*"
		}
	    }
	    if { [is_elf64 $tmpdir/mainnp.o] } {
		setup_xfail "x86_64-*-linux*"
	    }
	    setup_xfail "x86_64-*-linux-gnux32"
	    if { ![istarget hppa*64*-*-linux*] } {
		setup_xfail "hppa*-*-linux*"
	    }
	    if [ string match $shared_needs_pic "yes" ] {
		setup_xfail "arm*-*-linux*"
	    }

	    visibility_test $visibility vnp "visibility ($visibility) (non PIC)" mainnp.o sh1np.o sh2np.o elfvsb

	    # Test ELF shared library relocations with a non-zero load
	    # address for the library.  Near as I can tell, the R_*_RELATIVE
	    # relocations for various targets are broken in the case where
	    # the load address is not zero (which is the default).
	    if { [ string match $visibility "protected" ]
		 || [ string match $visibility "protected_undef_def" ] } {
		if [ string match $support_protected "no" ] {
		    setup_xfail $target_triplet
		}
	    } else {
		setup_xfail "*-*-sunos4*"
		setup_xfail "*-*-linux*libc1"
	    }
	    if { [ string match $visibility "hidden_normal" ]
		 || [ string match $visibility "hidden_weak" ]
		 || [ string match $visibility "protected" ]
		 || [ string match $visibility "protected_undef_def" ]
		 || [ string match $visibility "protected_weak" ]
		 || [ string match $visibility "normal" ] } {
		setup_xfail "powerpc-*-linux*"
		setup_xfail "s390x-*-linux*"
		if { [istarget sparc*-*-linux*] && [is_elf64 $tmpdir/mainnp.o] } {
		    setup_xfail "sparc*-*-linux*"
		}
	    }
	    if { ![ string match $visibility "hidden_undef" ]
		 && ![ string match $visibility "protected_undef" ] } {
		setup_xfail "ia64-*-linux*"
		setup_xfail "alpha*-*-linux*"
		setup_xfail "mips*-*-linux*"
	    }
	    if { [is_elf64 $tmpdir/mainnp.o] } {
		setup_xfail "x86_64-*-linux*"
	    }
	    setup_xfail "x86_64-*-linux-gnux32"
	    if { ![istarget hppa*64*-*-linux*] } {
		setup_xfail "hppa*-*-linux*"
	    }
	    if [ string match $shared_needs_pic "yes" ] {
		setup_xfail "arm*-*-linux*"
	    }

	    visibility_test $visibility vnp "visibility ($visibility) (non PIC, load offset)" \
		mainnp.o sh1np.o sh2np.o elfvsb \
		"-T $srcdir/$subdir/elf-offset.ld"
	} }

	# Now compile the code using -fpic.

	if { ![ld_compile "$CC -g $CFLAGS $SHCFLAG $VSBCFLAG -DSHARED $picflag" $srcdir/$subdir/sh1.c $tmpdir/sh1p.o]
	    || ![ld_compile "$CC -g $CFLAGS $SHCFLAG $VSBCFLAG -DSHARED $picflag" $srcdir/$subdir/sh2.c $tmpdir/sh2p.o] } {
	    unresolved "visibility ($visibility)"
	} else {
	    if { [ string match $visibility "protected" ]
		 || [ string match $visibility "protected_undef_def" ] } {
		if [ string match $support_protected "no" ] {
		    setup_xfail $target_triplet
		}
	    }
	    # SunOS can not compare function pointers correctly
	    if [istarget "*-*-sunos4*"] {
		visibility_test $visibility vp "visibility ($visibility)" mainnp.o sh1p.o sh2p.o sun4
	    } else { if { [istarget rs6000*-*-aix*] || [istarget powerpc*-*-aix*] } {
		visibility_test $visibility vp "visibility ($visibility)" mainnp.o sh1p.o sh2p.o xcoff
	    } else {
		visibility_test $visibility vp "visibility ($visibility)" mainnp.o sh1p.o sh2p.o elfvsb
	    } }
	}
    }}

    if { [istarget powerpc*-*-linux*] } {
	# Don't bother.
    } else {
    # Now do the same tests again, but this time compile main.c PIC.
    if ![ld_compile "$CC -g $CFLAGS $SHCFLAG $VSBCFLAG -DSHARED $picflag" $srcdir/$subdir/main.c $tmpdir/mainp.o] {
	unresolved "visibility ($visibility) (PIC main, non PIC so)"
	unresolved "visibility ($visibility) (PIC main)"
    } else {
	if { [file exists $tmpdir/sh1np.o ] && [ file exists $tmpdir/sh2np.o ] } {
	    if { [istarget rs6000*-*-aix*] || [istarget powerpc*-*-aix*] } {
		visibility_test $visibility vmpnp "visibility ($visibility) (PIC main, non PIC so)" mainp.o sh1np.o sh2np.o xcoff
	    } else {
		# SunOS non PIC shared libraries don't permit some cases of
		# overriding.
		if { [ string match $visibility "protected" ]
		     || [ string match $visibility "protected_undef_def" ] } {
		    if [ string match $support_protected "no" ] {
			setup_xfail $target_triplet
		    }
		} else {
		    setup_xfail "*-*-sunos4*"
		}
		if { ![ string match $visibility "hidden_undef" ]
		     && ![ string match $visibility "protected_undef" ] } {
		    setup_xfail "ia64-*-linux*"
		    setup_xfail "alpha*-*-linux*"
		}
		if { ![ string match $visibility "hidden" ]
		     && ![ string match $visibility "hidden_undef" ]
		     && ![ string match $visibility "hidden_undef_def" ]
		     && ![ string match $visibility "protected_undef" ] } {
		    setup_xfail "s390x-*-linux*"
		    if { [istarget sparc*-*-linux*] && [is_elf64 $tmpdir/mainp.o] } {
			setup_xfail "sparc*-*-linux*"
		    }
		}
		if { [is_elf64 $tmpdir/mainp.o] } {
		    setup_xfail "x86_64-*-linux*"
		}
		setup_xfail "x86_64-*-linux-gnux32"
		if { ![istarget hppa*64*-*-linux*] } {
		    setup_xfail "hppa*-*-linux*"
		}
		if [ string match $shared_needs_pic "yes" ] {
		    setup_xfail "arm*-*-linux*"
		}

		visibility_test $visibility vmpnp "visibility ($visibility) (PIC main, non PIC so)" mainp.o sh1np.o sh2np.o elfvsb
	    }
	} else {
	    unresolved "visibility (PIC main, non PIC so)"
	}

	if { [file exists $tmpdir/sh1p.o ] && [ file exists $tmpdir/sh2p.o ] } {
	    if { [ string match $visibility "protected" ]
		 || [ string match $visibility "protected_undef_def" ] } {
		if [ string match $support_protected "no" ] {
		    setup_xfail $target_triplet
		}
	    }
	    if { [istarget rs6000*-*-aix*] || [istarget powerpc*-*-aix*] } {
		visibility_test $visibility vmpp "visibility ($visibility) (PIC main)" mainp.o sh1p.o sh2p.o xcoff
	    } else {
		visibility_test $visibility vmpp "visibility ($visibility) (PIC main)" mainp.o sh1p.o sh2p.o elfvsb
	    }
	} else {
	    unresolved "visibility ($visibility) (PIC main)"
	}
    }}
}

# Old version of GCC for MIPS default to enabling -fpic
# and get confused if it is used on the command line.
if { [istarget mips*-*-*] && ! [at_least_gcc_version 4 3] } then {
    set picflag ""
} else {
    # Unfortunately, the gcc argument is -fpic and the cc argument is
    # -KPIC.  We have to try both.
    set picflag "-fpic"
    send_log "$CC $picflag\n"
    verbose "$CC $picflag"
    catch "exec $CC $picflag" exec_output
    send_log "$exec_output\n"
    verbose "--" "$exec_output"
    if { [string match "*illegal option*" $exec_output] \
	 || [string match "*option ignored*" $exec_output] \
	 || [string match "*unrecognized option*" $exec_output] \
	 || [string match "*passed to ld*" $exec_output] } {
	if [istarget *-*-sunos4*] {
	    set picflag "-pic"
	} else {
	    set picflag "-KPIC"
	}
    }
}
verbose "Using $picflag to compile PIC code"

visibility_run hidden
visibility_run hidden_normal
visibility_run hidden_undef
visibility_run hidden_undef_def
visibility_run hidden_weak
visibility_run protected
visibility_run protected_undef
visibility_run protected_undef_def
visibility_run protected_weak
visibility_run normal

if { ![ld_compile "$CC -g $CFLAGS" $srcdir/$subdir/common.c tmpdir/common.o] } {
    unresolved "common hidden symbol"
} else {
    if ![ld_simple_link $ld tmpdir/common "tmpdir/common.o"] {
	fail "common hidden symbol"
    } else {
	pass "common hidden symbol"
    }
}

if { ![ld_compile "$CC -g $CFLAGS" $srcdir/$subdir/test.c tmpdir/test.o] } {
    unresolved "weak hidden symbol"
} else {
   if { ![ld_compile "$CC -g $CFLAGS -DSHARED $picflag" $srcdir/$subdir/sh3.c tmpdir/sh3.o] } {
	unresolved "weak hidden symbol"
    } else {
	if ![ld_simple_link $ld tmpdir/sh3.so "-shared tmpdir/sh3.o"] {
	    fail "weak hidden symbol"
	} else {
	    if ![ld_simple_link $ld tmpdir/weak "tmpdir/test.o tmpdir/sh3.o"] {
		fail "weak hidden symbol DSO last"
	    } else {
		pass "weak hidden symbol DSO last"
	    }
	    if ![ld_simple_link $ld tmpdir/weak "tmpdir/sh3.so tmpdir/test.o"] {
		fail "weak hidden symbol DSO first"
	    } else {
		pass "weak hidden symbol DSO first"
	    }
	}
    }
}

if { [istarget rs6000*-*-aix*] || [istarget powerpc*-*-aix*] } {
    # Remove the temporary directory.
    catch "exec rm -rf $tmpdir" exec_status
}
