# Expect script for ld-plugin tests
#   Copyright (C) 2010-2016 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.

# These tests require the plugin API to be configured in.
if ![check_plugin_api_available] {
    return
}

# And a compiler to be available.
set can_compile 1
set failure_kind "unresolved"
if { [which $CC] == 0 } {
  # Don't fail immediately, 
  set can_compile 0
  set failure_kind "unsupported"
}

pass "plugin API enabled"

global base_dir

# Look for the name we can dlopen in the test plugin's libtool control script.
set plugin_name [file_contents "$base_dir/libldtestplug.la"]
set plugin_name [regsub "'.*" [regsub ".*dlname='" "$plugin_name" ""] ""]
# Even though the API supports plugins it does not mean that the
# linker was configured with --enable-plugins.  Check for that here.
if { $plugin_name == "" } {
    verbose "The linker is not configured to support plugins"
    return
}
verbose "plugin name is '$plugin_name'"

set plugin2_name [file_contents "$base_dir/libldtestplug2.la"]
set plugin2_name [regsub "'.*" [regsub ".*dlname='" "$plugin2_name" ""] ""]
verbose "plugin2 name is '$plugin2_name'"

set plugin3_name [file_contents "$base_dir/libldtestplug3.la"]
set plugin3_name [regsub "'.*" [regsub ".*dlname='" "$plugin3_name" ""] ""]
verbose "plugin3 name is '$plugin3_name'"

set plugin4_name [file_contents "$base_dir/libldtestplug4.la"]
set plugin4_name [regsub "'.*" [regsub ".*dlname='" "$plugin4_name" ""] ""]
verbose "plugin4 name is '$plugin4_name'"

# Use libtool to find full path to plugin rather than worrying
# about run paths or anything like that.
catch "exec $base_dir/libtool --config" lt_config
verbose "Full lt config: $lt_config" 3
# Look for "objdir=.libs"
regexp -line "^objdir=.*$" "$lt_config" lt_objdir
verbose "lt_objdir line is '$lt_objdir'" 3
set lt_objdir [regsub "objdir=" "$lt_objdir" ""]
set plugin_path "$base_dir/$lt_objdir/$plugin_name"
set plugin2_path "$base_dir/$lt_objdir/$plugin2_name"
set plugin3_path "$base_dir/$lt_objdir/$plugin3_name"
set plugin4_path "$base_dir/$lt_objdir/$plugin4_name"
verbose "Full plugin path $plugin_path" 2
verbose "Full plugin2 path $plugin2_path" 2
verbose "Full plugin3 path $plugin3_path" 2
verbose "Full plugin4 path $plugin4_path" 2

set regclm "-plugin-opt registerclaimfile"
set regas "-plugin-opt registerallsymbolsread"
set regassilent "-plugin-opt registerallsymbolsreadsilent"
set regcln "-plugin-opt registercleanup"

if { [istarget m681*-*-*] || [istarget m68hc1*-*-*] || [istarget m9s12x*-*-*] } {
    # otherwise get FAILS due to _.frame
    set CFLAGS "$CFLAGS -fomit-frame-pointer"
}
# In order to define symbols in plugin options in the list of tests below,
# we need to know if the platform prepends an underscore to C symbols,
# which we find out by compiling the test objects now.  If there is any
# error compiling, we defer reporting it until after the list of tests has
# been initialised, so that we can use the names in the list to report;
# otherwise, we scan one of the files with 'nm' and look for a known symbol
# in the output to see if it is prefixed or not.
set failed_compile 0
set _ ""
set plugin_nm_output ""
if { $can_compile && \
	(![ld_compile "$CC $CFLAGS" $srcdir/$subdir/main.c tmpdir/main.o] \
	|| ![ld_compile "$CC $CFLAGS" $srcdir/$subdir/func.c tmpdir/func.o] \
	|| ![ld_compile "$CC $CFLAGS" $srcdir/$subdir/text.c tmpdir/text.o] \
	|| ![ld_compile "$CC $CFLAGS" $srcdir/$subdir/pr20070a.c tmpdir/pr20070a.o] \
	|| ![ld_compile "$CC $CFLAGS" $srcdir/$subdir/dummy.s tmpdir/dummy.o] \
	|| ![ld_compile "$CC $CFLAGS" $srcdir/$subdir/pr17973.s tmpdir/pr17973.o]) } {
    # Defer fail until we have list of tests set.
    set failed_compile 1
}

if { $can_compile && !$failed_compile } {
    # Find out if symbols have prefix on this platform before setting tests.
    catch "exec $NM tmpdir/func.o" plugin_nm_output
    if { [regexp "_func" "$plugin_nm_output"] } {
	set _ "_"
    }
}

set testobjfiles "tmpdir/main.o tmpdir/func.o tmpdir/text.o"
set testobjfiles_notext "tmpdir/main.o tmpdir/func.o"
set testsrcfiles "tmpdir/main.o $srcdir/$subdir/func.c tmpdir/text.o"
set testsrcfiles_notext "tmpdir/main.o $srcdir/$subdir/func.c"
# Rather than having libs we just define dummy values for anything
# we may need to link a target exe; we aren't going to run it anyway.
set libs "[ld_simple_link_defsyms] --defsym ${_}printf=${_}main --defsym ${_}puts=${_}main"

set plugin_tests [list \
    [list "load plugin" "-plugin $plugin_path \
    $testobjfiles $libs" "" "" "" {{ld plugin-1.d}} "main.x" ] \
    [list "fail plugin onload" "-plugin $plugin_path -plugin-opt failonload \
    $testobjfiles $libs" "" "" "" {{ld plugin-2.d}} "main.x" ] \
    [list "fail plugin allsymbolsread" "-plugin $plugin_path $regas \
			-plugin-opt failallsymbolsread \
    $testobjfiles $libs" "" "" "" {{ld plugin-3.d}} "main.x" ] \
    [list "fail plugin cleanup" "-plugin $plugin_path -plugin-opt failcleanup \
			$regcln \
    $testobjfiles $libs" "" "" "" {{ld plugin-4.d}} "main.x" ] \
    [list "plugin all hooks" "-plugin $plugin_path $regclm $regas $regcln \
    $testobjfiles $libs" "" "" "" {{ld plugin-5.d}} "main.x" ] \
    [list "plugin claimfile lost symbol" "-plugin $plugin_path $regclm \
			$regas $regcln -plugin-opt claim:tmpdir/func.o \
    $testobjfiles $libs" "" "" "" {{ld plugin-6.d}} "main.x" ] \
    [list "plugin claimfile replace symbol" "-plugin $plugin_path $regclm \
			$regas $regcln -plugin-opt claim:tmpdir/func.o \
			-plugin-opt sym:${_}func::0:0:0 \
    $testobjfiles $libs" "" "" "" {{ld plugin-7.d}} "main.x" ] \
    [list "plugin claimfile resolve symbol" "-plugin $plugin_path $regclm \
			$regas $regcln -plugin-opt claim:tmpdir/func.o \
			-plugin-opt sym:${_}func::0:0:0 \
			-plugin-opt sym:${_}func2::0:0:0 \
			-plugin-opt dumpresolutions \
    $testobjfiles $libs" "" "" "" {{ld plugin-8.d}} "main.x" ] \
    [list "plugin claimfile replace file" "-plugin $plugin_path $regclm \
			$regas $regcln -plugin-opt claim:tmpdir/func.o \
			-plugin-opt sym:${_}func::0:0:0 \
			-plugin-opt sym:${_}func2::0:0:0 \
			-plugin-opt dumpresolutions \
			-plugin-opt add:tmpdir/func.o \
    $testobjfiles $libs" "" "" "" {{ld plugin-9.d}} "main.x" ] \
    [list "load plugin with source" "-plugin $plugin_path $regclm \
			-plugin-opt claim:$srcdir/$subdir/func.c \
    $testsrcfiles $libs" "" "" "" {{ld plugin-13.d}} "main.x" ] \
    [list "plugin claimfile lost symbol with source" \
		       "-plugin $plugin_path $regclm $regas $regcln \
			-plugin-opt claim:$srcdir/$subdir/func.c \
    $testsrcfiles $libs" "" "" "" {{ld plugin-14.d}} "main.x" ] \
    [list "plugin claimfile replace symbol with source" \
		       "-plugin $plugin_path $regclm $regas $regcln \
			-plugin-opt claim:$srcdir/$subdir/func.c \
			-plugin-opt sym:${_}func::0:0:0 \
    $testsrcfiles $libs" "" "" "" {{ld plugin-15.d}} "main.x" ] \
    [list "plugin claimfile resolve symbol with source" \
		       "-plugin $plugin_path $regclm $regas $regcln \
			-plugin-opt claim:$srcdir/$subdir/func.c \
			-plugin-opt sym:${_}func::0:0:0 \
			-plugin-opt sym:${_}func2::0:0:0 \
			-plugin-opt dumpresolutions \
    $testsrcfiles $libs" "" "" "" {{ld plugin-16.d}} "main.x" ] \
    [list "plugin claimfile replace file with source" \
		       "-plugin $plugin_path $regclm $regas $regcln \
			-plugin-opt claim:$srcdir/$subdir/func.c \
			-plugin-opt sym:${_}func::0:0:0 \
			-plugin-opt sym:${_}func2::0:0:0 \
			-plugin-opt dumpresolutions \
			-plugin-opt add:tmpdir/func.o \
    $testsrcfiles $libs" "" "" "" {{ld plugin-17.d}} "main.x" ] \
    [list "load plugin with source not claimed" "-plugin $plugin_path $regclm \
    $testsrcfiles $libs" "" "" "" {{ld plugin-26.d}} "main.x" ] \
    [list "plugin fatal error" "-plugin $plugin2_path -plugin-opt fatal \
    $testobjfiles $libs" "" "" "" {{ld plugin-27.d}} "main.x" ] \
    [list "plugin error" "-plugin $plugin2_path -plugin-opt error \
    $testobjfiles $libs" "" "" "" {{ld plugin-28.d}} "main.x" ] \
    [list "plugin warning" "-plugin $plugin2_path -plugin-opt warning \
    $testobjfiles $libs" "" "" "" {{ld plugin-29.d}} "main.x" ] \
]

if [check_shared_lib_support] {
    lappend plugin_tests [list "PR ld/17973" "-plugin $plugin2_path -shared $regassilent \
                       -plugin-opt add:tmpdir/pr17973.o \
    tmpdir/dummy.o" "" "" "" {{readelf -sW pr17973.d}} "main.x" ]
}


set plugin_lib_tests [list \
    [list "plugin ignore lib" "-plugin $plugin_path $regclm \
			$regas $regcln -plugin-opt claim:tmpdir/func.o \
			-plugin-opt sym:${_}func::0:0:0 \
			-plugin-opt sym:${_}func2::0:0:0 \
			-plugin-opt dumpresolutions \
			-plugin-opt add:tmpdir/func.o \
    $testobjfiles_notext -Ltmpdir -ltext $libs" "" "" "" {{ld plugin-10.d}} "main.x" ] \
    [list "plugin claimfile replace lib" "-plugin $plugin_path $regclm \
			$regas $regcln -plugin-opt claim:tmpdir/func.o \
			-plugin-opt sym:${_}func::0:0:0 \
			-plugin-opt sym:${_}func2::0:0:0 \
			-plugin-opt dumpresolutions \
			-plugin-opt add:tmpdir/func.o \
			-plugin-opt claim:tmpdir/libtext.a \
			-plugin-opt sym:${_}text::0:0:0 \
			-plugin-opt add:tmpdir/text.o \
    $testobjfiles_notext -Ltmpdir -ltext $libs" "" "" "" {{ld plugin-11.d}} "main.x" ] \
    [list "plugin ignore lib with source" \
	               "-plugin $plugin_path $regclm $regas $regcln \
			-plugin-opt claim:$srcdir/$subdir/func.c \
			-plugin-opt sym:${_}func::0:0:0 \
			-plugin-opt sym:${_}func2::0:0:0 \
			-plugin-opt dumpresolutions \
			-plugin-opt add:tmpdir/func.o \
    $testsrcfiles_notext -Ltmpdir -ltext $libs" "" "" "" {{ld plugin-18.d}} "main.x" ] \
    [list "plugin claimfile replace lib with source" \
		       "-plugin $plugin_path $regclm $regas $regcln \
			-plugin-opt claim:$srcdir/$subdir/func.c \
			-plugin-opt sym:${_}func::0:0:0 \
			-plugin-opt sym:${_}func2::0:0:0 \
			-plugin-opt dumpresolutions \
			-plugin-opt add:tmpdir/func.o \
			-plugin-opt claim:tmpdir/libtext.a \
			-plugin-opt sym:${_}text::0:0:0 \
			-plugin-opt add:tmpdir/text.o \
    $testsrcfiles_notext -Ltmpdir -ltext $libs" "" "" "" {{ld plugin-19.d}} "main.x" ] \
]

set plugin_extra_elf_tests [list \
    [list "plugin set symbol visibility" "-plugin $plugin_path $regclm \
			$regas $regcln -plugin-opt claim:tmpdir/func.o \
			-plugin-opt sym:${_}func::0:0:0 \
			-plugin-opt sym:${_}func1::0:1:0 \
			-plugin-opt sym:${_}func2::0:2:0 \
			-plugin-opt sym:${_}func3::0:3:0 \
			-plugin-opt dumpresolutions \
			-plugin-opt add:tmpdir/func.o \
			-plugin-opt add:tmpdir/func1p.o \
			-plugin-opt add:tmpdir/func2i.o \
			-plugin-opt add:tmpdir/func3h.o \
    $testobjfiles $libs --verbose=2" "" "" "" {{ld plugin-12.d} \
				{readelf -s plugin-vis-1.d}} "main.x" ] \
    [list "plugin set symbol visibility with source" \
		       "-plugin $plugin_path $regclm $regas $regcln \
			-plugin-opt claim:$srcdir/$subdir/func.c \
			-plugin-opt sym:${_}func::0:0:0 \
			-plugin-opt sym:${_}func1::0:1:0 \
			-plugin-opt sym:${_}func2::0:2:0 \
			-plugin-opt sym:${_}func3::0:3:0 \
			-plugin-opt dumpresolutions \
			-plugin-opt add:tmpdir/func.o \
			-plugin-opt add:tmpdir/func1p.o \
			-plugin-opt add:tmpdir/func2i.o \
			-plugin-opt add:tmpdir/func3h.o \
    $testsrcfiles $libs --verbose=2" "" "" "" {{ld plugin-12.d} \
				{readelf -s plugin-vis-1.d}} "main.x" ] \
]

if { !$can_compile || $failed_compile } {
    foreach testitem $plugin_tests {
	$failure_kind [lindex $testitem 0]
    }
    if { [is_elf_format] } {
	foreach testitem $plugin_extra_elf_tests {
	    $failure_kind [lindex $testitem 0]
	}
    }
    return
}

run_ld_link_tests $plugin_tests

if { [is_elf_format] \
     && [ld_compile "$CC $CFLAGS" $srcdir/$subdir/func1p.c tmpdir/func1p.o] \
     && [ld_compile "$CC $CFLAGS" $srcdir/$subdir/func2i.c tmpdir/func2i.o] \
     && [ld_compile "$CC $CFLAGS" $srcdir/$subdir/func3h.c tmpdir/func3h.o] } {
    run_ld_link_tests $plugin_extra_elf_tests
}

if ![ar_simple_create $ar "" "tmpdir/libtext.a" "tmpdir/text.o"] {
    foreach testitem $plugin_lib_tests {
	unresolved [lindex $testitem 0]
    }
} else {
    run_ld_link_tests $plugin_lib_tests
}

set plugin_src_tests [list \
    [list "plugin 2 with source lib" \
	               "-plugin $plugin2_path $regclm $regas $regcln \
			-plugin-opt dumpresolutions \
     tmpdir/main.o -Ltmpdir -ltext -lfunc $libs" "" "" "" {{ld plugin-20.d}} "main.x" ] \
    [list "load plugin 2 with source" \
	               "-plugin $plugin2_path $regclm $regas $regcln \
			-plugin-opt dumpresolutions \
    $testsrcfiles $libs" "" "" "" {{ld plugin-21.d}} "main.x" ] \
    [list "load plugin 2 with source and -r" \
	               "-r -plugin $plugin2_path $regclm $regas $regcln \
			-plugin-opt dumpresolutions \
    $testsrcfiles $libs" "" "" "" {{ld plugin-24.d}} "main.x" ] \
    [list "plugin 3 with source lib" \
	               "-plugin $plugin3_path $regclm $regas $regcln \
			-plugin-opt dumpresolutions \
     tmpdir/main.o -Ltmpdir -ltext -lfunc $libs" "" "" "" {{ld plugin-22.d}} "main.x" ] \
    [list "load plugin 3 with source" \
	               "-plugin $plugin3_path $regclm $regas $regcln \
			-plugin-opt dumpresolutions \
    $testsrcfiles $libs" "" "" "" {{ld plugin-23.d}} "main.x" ] \
    [list "load plugin 3 with source and -r" \
	               "-r -plugin $plugin3_path $regclm $regas $regcln \
			-plugin-opt dumpresolutions \
    $testsrcfiles $libs" "" "" "" {{ld plugin-25.d}} "main.x" ] \
]

# Check if nm --plugin works.
set testname "nm --plugin"
set nm_plugin "$NM --plugin $plugin2_path $srcdir/$subdir/func.c"
catch "exec $nm_plugin" plugin_nm_output
send_log "$nm_plugin\n"
send_log "$plugin_nm_output\n"
if { [regexp "0+ T func" "$plugin_nm_output"] &&
     [regexp "0+ T _func" "$plugin_nm_output"] } {
    pass $testname
} else {
    fail $testname
}

# Check if ar --plugin works.
file delete tmpdir/libfunc.a
if [ar_simple_create $ar "--plugin $plugin2_path" "tmpdir/libfunc.a" \
			 "tmpdir/main.o $srcdir/$subdir/func.c"] {
    set testname "ar --plugin"
    set nm_plugin "$NM -s --plugin $plugin2_path tmpdir/libfunc.a"
    catch "exec $nm_plugin" plugin_nm_output
    send_log "$nm_plugin\n"
    send_log "$plugin_nm_output\n"
    if { [regexp "func in func.c" "$plugin_nm_output"] &&
         [regexp "_func in func.c" "$plugin_nm_output"] } {
	pass $testname
	run_ld_link_tests $plugin_src_tests
    } else {
	fail $testname
    }
} else {
    foreach testitem $plugin_src_tests {
	unresolved [lindex $testitem 0]
    }
}

file delete tmpdir/libpr20070.a
if [ar_simple_create $ar "--plugin $plugin4_path" "tmpdir/libpr20070.a" \
			 "$srcdir/$subdir/pr20070b.c"] {
    run_ld_link_tests [list \
	[list \
	    "PR ld/20070" \
	    "-Bstatic -plugin $plugin4_path $regclm \
	     $regas $regcln \
	     -plugin-opt claim:$srcdir/$subdir/pr20070b.c \
	     -plugin-opt claim:tmpdir/libpr20070.a \
	     -plugin-opt dumpresolutions \
	     tmpdir/pr20070a.o tmpdir/text.o tmpdir/libpr20070.a $libs" \
	    "" "" "" {{ld pr20070.d}} "pr20070.x" \
	] \
    ]
} else {
    unresolved "PR ld/20070"
}
