| # Expect script for LD selective linking tests |
| # Copyright (C) 1998, 1999 Free Software Foundation |
| # |
| # 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
| # |
| # Written by Catherine Moore (clm@cygnus.com) |
| # Make sure that constructors are handled correctly. |
| |
| |
| # COFF based ports do not support selective linking |
| if {[istarget "*-*-coff" "*-*-pe"]} { |
| return |
| } |
| |
| set test1 "selective1" |
| set test2 "selective2" |
| set test3 "selective3" |
| set test4 "selective4" |
| set test5 "selective5" |
| set test6 "selective6" |
| |
| set cflags "-w -O2 -ffunction-sections -fdata-sections" |
| set cxxflags "-fvtable-gc -fno-exceptions -fno-rtti" |
| set ldflags "--gc-sections -Bstatic" |
| |
| if { [which $CXX] == 0 } { |
| untested $test1 |
| untested $test2 |
| untested $test3 |
| untested $test4 |
| untested $test5 |
| untested $test6 |
| return |
| } |
| |
| if { ![ld_compile "$CC $cflags" $srcdir/$subdir/1.c tmpdir/1.o]} { |
| unresolved $test1 |
| return |
| } |
| |
| if ![ld_simple_link $ld tmpdir/1.x "$ldflags tmpdir/1.o"] { |
| fail $test1 |
| } else { |
| if ![ld_nm $nm tmpdir/1.x] { |
| unresolved $test1 |
| } else { |
| if {[info exists nm_output(dropme1)]} { |
| send_log "dropme1 == $nm_output(dropme1)\n" |
| verbose "dropme1 == $nm_output(dropme1)" |
| fail $test1 |
| } else { |
| if {[info exists nm_output(dropme2)]} { |
| send_log "dropme2 == $nm_output(dropme2)\n" |
| verbose "dropme2 == $nm_output(dropme2)" |
| fail $test1 |
| } else { |
| pass $test1 |
| } |
| } |
| } |
| } |
| |
| if { ![ld_compile "$CC $cflags" $srcdir/$subdir/2.c tmpdir/2.o]} { |
| unresolved $test2 |
| return |
| } |
| |
| if ![ld_simple_link $ld tmpdir/2.x "$ldflags tmpdir/2.o"] { |
| fail $test2 |
| } else { |
| if ![ld_nm $nm tmpdir/2.x] { |
| unresolved $test2 |
| } else { |
| if {[info exists nm_output(foo)] } { |
| send_log "foo == $nm_output(foo)\n" |
| verbose "foo== $nm_output(foo)" |
| fail $test2 |
| } else { |
| pass $test2 |
| } |
| } |
| } |
| |
| if { ![ld_compile "$CC $cflags" $srcdir/$subdir/2.c tmpdir/2.o]} { |
| unresolved $test3 |
| return |
| } |
| |
| if ![ld_simple_link $ld tmpdir/2.x "$ldflags -u foo tmpdir/2.o"] { |
| fail $test3 |
| } else { |
| if ![ld_nm $nm tmpdir/2.x] { |
| unresolved $test3 |
| } else { |
| if {![info exists nm_output(foo)] } { |
| send_log "bad output from nm\n" |
| verbose "bad output from nm" |
| fail $test3 |
| } else { |
| if {$nm_output(foo) == 0} { |
| send_log "foo == $nm_output(foo)\n" |
| verbose "foo== $nm_output(foo)" |
| fail $test3 |
| } else { |
| pass $test3 |
| } |
| } |
| } |
| } |
| |
| setup_xfail "v850*-*-elf" |
| |
| if { ![ld_compile "$CC $cflags $cxxflags" $srcdir/$subdir/3.cc tmpdir/3.o]} { |
| unresolved $test4 |
| return |
| } |
| |
| setup_xfail "v850*-*-elf" |
| |
| if ![ld_simple_link $ld tmpdir/3.x "$ldflags tmpdir/3.o"] { |
| fail $test4 |
| } else { |
| if ![ld_nm $nm tmpdir/3.x] { |
| unresolved $test4 |
| } else { |
| if {[info exists nm_output(foo__1B)]} { |
| send_log "foo__1B == $nm_output(foo__1B)\n" |
| verbose "foo__1B == $nm_output(foo__1B)" |
| fail $test4 |
| } else { |
| if {[ info exists nm_output(bar__1A)]} { |
| send_log "bar__1A== $nm_output(_bar__1A)\n" |
| verbose "bar__1A == $nm_output(_bar__1A)" |
| fail $test4 |
| } else { |
| pass $test4 |
| } |
| } |
| } |
| } |
| |
| if { ![ld_compile "$CC $cflags $cxxflags" $srcdir/$subdir/4.cc tmpdir/4.o]} { |
| unresolved $test5 |
| return |
| } |
| |
| if ![ld_simple_link $ld tmpdir/4.x "$ldflags tmpdir/4.o"] { |
| fail $test5 |
| } else { |
| if ![ld_nm $nm tmpdir/4.x] { |
| unresolved $test5 |
| } else { |
| if {[info exists nm_output(foo__1B)]} { |
| send_log "foo__1B == $nm_output(foo__1B)\n" |
| verbose "foo__1B == $nm_output(foo__1B)" |
| fail $test5 |
| } else { |
| if {[info exists nm_output(foo__1A)]} { |
| send_log "foo__1A== $nm_output(foo__1A)\n" |
| verbose "foo__1A == $nm_output(foo__1A)" |
| fail $test5 |
| } else { |
| pass $test5 |
| } |
| } |
| } |
| } |
| |
| setup_xfail "v850*-*-elf" |
| |
| if { ![ld_compile "$CC $cflags $cxxflags" $srcdir/$subdir/5.cc tmpdir/5.o]} { |
| unresolved $test6 |
| return |
| } |
| |
| if ![ld_simple_link $ld tmpdir/5.x "$ldflags tmpdir/5.o"] { |
| fail $test6 |
| } else { |
| if ![ld_nm $nm tmpdir/5.x] { |
| unresolved $test6 |
| } else { |
| if {[info exists nm_output(foo__1B)] } { |
| send_log "foo__1B == $nm_output(foo__1B)\n" |
| verbose "foo__1B == $nm_output(foo__1B)" |
| fail $test6 |
| } else { |
| if { [info exists nm_output(foo__1A)]} { |
| send_log "foo__1A== $nm_output(foo__1A)\n" |
| verbose "foo__1A == $nm_output(foo__1A)" |
| fail $test6 |
| } else { |
| pass $test6 |
| } |
| } |
| } |
| } |