# Expect script for various ELF tests.
#   Copyright 2006 Free Software Foundation, Inc.
#
# This file 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 2 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.
#

# Exclude non-ELF targets.

if ![is_elf_format] {
    return
}

# The following tests require running the executable generated by ld.
if ![isnative] {
    return
}

# Check if compiler works
if { [which $CC] == 0 } {
    return
}

set build_tests {
  {"Build libfoo.so"
   "-shared" "-fPIC"
   {foo.c} {} "libfoo.so"}
  {"Build versioned libfoo.so"
   "-shared -Wl,--version-script=foo.map" "-fPIC"
   {foo.c} {} "libfoov.so"}
  {"Build libbar.so"
   "-shared" "-fPIC"
   {begin.c end.c} {} "libbar.so"}
  {"Build hidden libbar.so"
   "-shared" "-fPIC"
   {begin.c endhidden.c} {} "libbarh.so"}
  {"Build protected libbar.so"
   "-shared" "-fPIC"
   {begin.c endprotected.c} {} "libbarp.so"}
  {"Build libbar.so with libfoo.so"
   "-shared tmpdir/begin.o tmpdir/libfoo.so" "-fPIC"
   {end.c} {} "libbarfoo.so"}
  {"Build libar.so with versioned libfoo.so"
   "-shared tmpdir/begin.o tmpdir/libfoov.so" "-fPIC"
   {end.c} {} "libbarfoov.so"}
  {"Build hidden libbar.so with libfoo.so"
   "-shared tmpdir/begin.o tmpdir/libfoo.so" "-fPIC"
   {endhidden.c} {} "libbarhfoo.so"}
  {"Build hidden libar.so with versioned libfoo.so"
   "-shared tmpdir/begin.o tmpdir/libfoov.so" "-fPIC"
   {endhidden.c} {} "libbarhfoov.so"}
  {"Build protected libbar.so with libfoo.so"
   "-shared tmpdir/begin.o tmpdir/libfoo.so" "-fPIC"
   {endprotected.c} {} "libbarpfoo.so"}
  {"Build protected libbar.so with versioned libfoo.so"
   "-shared tmpdir/begin.o tmpdir/libfoov.so" "-fPIC"
   {endprotected.c} {} "libbarpfoov.so"}
  {"Build libdl1.so"
   "-shared" "-fPIC"
   {dl1.c} {} "libdl1.so"}
  {"Build libdl2a.so with --dynamic-list=dl2.list"
   "-shared -Wl,--dynamic-list=dl2.list" "-fPIC"
   {dl2.c dl2xxx.c} {} "libdl2a.so"}
  {"Build libdl2b.so with --dynamic-list=dl2.list and dl2xxx.list"
   "-shared -Wl,--dynamic-list=dl2.list,--dynamic-list=dl2xxx.list" "-fPIC"
   {dl2.c dl2xxx.c} {} "libdl2b.so"}
  {"Build libdl4a.so with --dynamic-list=dl4.list"
   "-shared -Wl,--dynamic-list=dl4.list" "-fPIC"
   {dl4.c dl4xxx.c} {} "libdl4a.so"}
  {"Build libdl4b.so with --dynamic-list=dl4.list and dl4xxx.list"
   "-shared -Wl,--dynamic-list=dl4.list,--dynamic-list=dl4xxx.list" "-fPIC"
   {dl4.c dl4xxx.c} {} "libdl4b.so"}
}

set run_tests {
    {"Run normal with libfoo.so"
     "tmpdir/begin.o tmpdir/libfoo.so tmpdir/end.o" ""
     {main.c} "normal" "normal.out"}
    {"Run protected with libfoo.so"
     "tmpdir/begin.o tmpdir/libfoo.so tmpdir/endprotected.o" ""
     {main.c} "protected" "normal.out"}
    {"Run hidden with libfoo.so"
     "tmpdir/begin.o tmpdir/libfoo.so tmpdir/endhidden.o" ""
     {main.c} "hidden" "hidden.out"}
    {"Run normal with versioned libfoo.so"
     "tmpdir/begin.o tmpdir/libfoov.so tmpdir/end.o" ""
     {main.c} "normalv" "normal.out"}
    {"Run protected with versioned libfoo.so"
     "tmpdir/begin.o tmpdir/libfoov.so tmpdir/endprotected.o" ""
     {main.c} "protected" "normal.out"}
    {"Run hidden with versioned libfoo.so"
     "tmpdir/begin.o tmpdir/libfoov.so tmpdir/endhidden.o" ""
     {main.c} "hiddenv" "hidden.out"}
    {"Run normal libbar.so with libfoo.so"
     "tmpdir/libbarfoo.so tmpdir/libfoo.so" ""
     {main.c} "normal" "normal.out"}
    {"Run protected libbar.so with libfoo.so"
     "tmpdir/libbarpfoo.so tmpdir/libfoo.so" ""
     {main.c} "protected" "normal.out"}
    {"Run hidden libbar.so with libfoo.so"
     "tmpdir/libbarhfoo.so tmpdir/libfoo.so" ""
     {main.c} "hidden" "hidden.out"}
    {"Run normal libbar.so with versioned libfoo.so"
     "tmpdir/libbarfoov.so tmpdir/libfoov.so" ""
     {main.c} "normal" "normal.out"}
    {"Run protected libbar.so with versioned libfoo.so"
     "tmpdir/libbarpfoov.so tmpdir/libfoov.so" ""
     {main.c} "protected" "normal.out"}
    {"Run hidden libbar.so with versioned libfoo.so"
     "tmpdir/libbarhfoov.so tmpdir/libfoov.so" ""
     {main.c} "hidden" "hidden.out"}
    {"Run with dlopen on libdl1.so"
     "--dynamic-list=dl1.list -ldl" ""
     {dl1main.c} "dl1" "dl1.out"}
    {"Run with libdl2a.so"
     "tmpdir/libdl2a.so" ""
     {dl2main.c} "dl2a" "dl2a.out"}
    {"Run with libdl2b.so"
     "tmpdir/libdl2b.so" ""
     {dl2main.c} "dl2b" "dl2b.out"}
    {"Run with libdl4a.so"
     "tmpdir/libdl4a.so" ""
     {dl4main.c} "dl4a" "dl4a.out"}
    {"Run with libdl4b.so"
     "tmpdir/libdl4b.so" ""
     {dl4main.c} "dl4b" "dl4b.out"}
}

run_cc_link_tests $build_tests
# NetBSD ELF systems do not currently support the .*_array sections.
run_ld_link_exec_tests [list "*-*-netbsdelf*"] $run_tests

# Check if compiler works
if { [which $CXX] == 0 } {
    return
}

set build_cxx_tests {
  {"Build libdl3a.so with --dynamic-list=dl3.list"
   "-shared -Wl,--dynamic-list=dl3.list" "-fPIC"
   {dl3.cc} {} "libdl3a.so" "c++"}
  {"Build libdl3b.so with -Bsymbolic"
   "-shared -Wl,-Bsymbolic" "-fPIC"
   {dl3.cc} {} "libdl3b.so" "c++"}
  {"Build libdl3a.so with --dynamic-list-cpp-typeinfo"
   "-shared -Wl,--dynamic-list-cpp-typeinfo" "-fPIC"
   {dl3.cc} {} "libdl3c.so" "c++"}
}

set run_cxx_tests {
    {"Run with libdl3a.so"
     "tmpdir/libdl3a.so" ""
     {dl3main.cc} "dl3a" "dl3a.out" "" "c++"}
    {"Run with libdl3b.so"
     "tmpdir/libdl3b.so" ""
     {dl3main.cc} "dl3b" "dl3b.out" "" "c++"}
    {"Run with libdl3c.so"
     "tmpdir/libdl3c.so" ""
     {dl3main.cc} "dl3c" "dl3a.out" "" "c++"}
}

run_cc_link_tests $build_cxx_tests
run_ld_link_exec_tests [] $run_cxx_tests
