* config/unix-ld.exp: Set ld using findfile.

* lib/ld.exp (default_ld_relocate): Return a value.  Change format
	of log messages.
	(default_ld_compile): Likewise.
	(default_ld_link): Likewise.  Also, don't include $BFDLIB and
	$LIBIBERTY in link.
	* ld.bootstrap/bootstrap.exp: Rewrite.
	* ld.cdtest/cdtest.exp: Rewrite.
	* ld.cdtest/cdtest-foo.cc: Update from top level ld directory.
	* ld.cdtest/cdtest-foo.h: Likewise.
	* ld.cdtest/cdtest-main.cc: Likewise.
This commit is contained in:
Ian Lance Taylor 1994-09-27 22:23:51 +00:00
parent 50f01d6d2a
commit 5c680d3f29
8 changed files with 191 additions and 181 deletions

View File

@ -1,3 +1,22 @@
Tue Sep 27 14:59:51 1994 Ian Lance Taylor (ian@sanguine.cygnus.com)
* config/unix-ld.exp: Set ld using findfile.
* lib/ld.exp (default_ld_relocate): Return a value. Change format
of log messages.
(default_ld_compile): Likewise.
(default_ld_link): Likewise. Also, don't include $BFDLIB and
$LIBIBERTY in link.
* ld.bootstrap/bootstrap.exp: Rewrite.
* ld.cdtest/cdtest.exp: Rewrite.
* ld.cdtest/cdtest-foo.cc: Update from top level ld directory.
* ld.cdtest/cdtest-foo.h: Likewise.
* ld.cdtest/cdtest-main.cc: Likewise.
Fri May 27 09:35:04 1994 Ken Raeburn (raeburn@cygnus.com)
* ld.cdtest/cdtest.exp: Don't look for $result before it's
defined.
Tue May 17 15:06:49 1994 Bill Cox (bill@rtl.cygnus.com) Tue May 17 15:06:49 1994 Bill Cox (bill@rtl.cygnus.com)
* ld.bootstrap/bootstrap.exp, lib/ld.exp: Replace error proc * ld.bootstrap/bootstrap.exp, lib/ld.exp: Replace error proc

View File

@ -21,7 +21,9 @@
# Written by Jeffrey Wheat (cassidy@cygnus.com) # Written by Jeffrey Wheat (cassidy@cygnus.com)
# #
set ld $objdir/ld.new if ![info exists ld] then {
set ld [findfile $objdir/ld.new $objdir/ld.new [transform ld]]
}
# load the utility procedures # load the utility procedures
load_lib ld.exp load_lib ld.exp

View File

@ -1,6 +1,5 @@
#
# Expect script for LD Bootstrap Tests # Expect script for LD Bootstrap Tests
# Copyright (C) 1993 Free Software Foundation # Copyright (C) 1993,1994 Free Software Foundation
# #
# This file is free software; you can redistribute it and/or modify # 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 # it under the terms of the GNU General Public License as published by
@ -16,84 +15,63 @@
# along with this program; if not, write to the Free Software # along with this program; if not, write to the Free Software
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
# #
# $Id$
#
# Written by Jeffrey Wheat (cassidy@cygnus.com) # Written by Jeffrey Wheat (cassidy@cygnus.com)
# Rewritten by Ian Lance Taylor (ian@cygnus.com)
# #
if $tracelevel then { # Make sure that ld can bootstrap itself.
strace $tracelevel
# This test can only be run if ld generates native executables.
if ![isnative] {return}
# This test can only be run if we have the ld build directory, since
# we need the object files.
if {$ld != "$objdir/ld.new"} {return}
if ![file isdirectory tmpdir] {catch "exec mkdir tmpdir" status}
# Bootstrap ld. First link the object files together using -r, in
# order to test -r. Then link the result into an executable, ld1, to
# really test -r. Use ld1 to link a fresh ld, ld2. Use ld2 to link a
# new ld, ld3. ld2 and ld3 should be identical.
foreach flags {"" "--static" "--traditional-format" "--no-keep-memory"} {
if {"$flags" != ""} {
set testname "bootstrap with $flags"
} else {
set testname "bootstrap"
}
if ![ld_relocate $ld tmpdir/ld-partial.o "$flags $OFILES"] {
fail $testname
return
}
if ![ld_link $ld tmpdir/ld1 "$flags tmpdir/ld-partial.o $BFDLIB $LIBIBERTY"] {
fail $testname
return
}
if ![ld_link tmpdir/ld1 tmpdir/ld2 "$flags $OFILES $BFDLIB $LIBIBERTY"] {
fail $testname
return
}
if ![ld_link tmpdir/ld2 tmpdir/ld3 "$flags $OFILES $BFDLIB $LIBIBERTY"] {
fail $testname
return
}
send_log "cmp tmpdir/ld2 tmpdir/ld3\n"
verbose "cmp tmpdir/ld2 tmpdir/ld3"
catch "exec cmp tmpdir/ld2 tmpdir/ld3" exec_output
if [string match "" $exec_output] then {
pass $testname
} else {
send_log "$exec_output\n"
verbose "$exec_output" 1
fail $testname
}
} }
set tmpdir /tmp
set stage 0
#
# link an object using relocation
#
ld_relocate $objdir/ld.new $tmpdir/ld-partial.o $OFILES
ld_link $objdir/ld.new $tmpdir/ld.partial $tmpdir/ld-partial.o
ld_link $tmpdir/ld.partial $tmpdir/ld.full $OFILES
ld_link $tmpdir/ld.full $tmpdir/ld.$stage $OFILES
#
# main test loop
#
for { set stage 0 } { $stage < 9 } { incr stage } {
global OFILES
global BFDLIB
global LIBIBERTY
global HOSTING_EMU
global HOSTING_CRT0
global HOSTING_LIBS
set status -1
set tmpstage $stage
set ld_old $tmpdir/ld.$stage
set ld_new $tmpdir/ld.[incr tmpstage]
verbose "### Running test $target\n" 1
verbose "### stage is now $stage\n" 1
# link the target with itself
ld_link $ld_old $ld_new $OFILES
# load (compare) the target
if ![file exists $ld_old] then {
unresolved "$ld_old doesn't exist."
}
if ![file exists $ld_new] then {
unresolved "$ld_new doesn't exist."
}
# compare the old and new targets
set status [ eval ld_load "$ld_old $ld_new" ]
case $status in {
"0" {
pass "$ld_old == $ld_new"
}
"1" {
fail "$tmptarget aborted"
}
"-1" {
perror "Couldn't load $tmptarget."
}
}
# remove generated targets
verbose "### EXEC exec rm -f $ld_old"
catch "exec rm -f $ld_old" result
}
# remove last generated targets
verbose "### EXEC rm -f $ld_old $ld_new"
catch "exec rm -f $ld_old $ld_new" result
ld_exit

View File

@ -1,5 +1,5 @@
// Class Foo // Class Foo
//#pragma implementation #pragma implementation
// We don't use header files, since we only want to see, whether the // We don't use header files, since we only want to see, whether the
@ -18,8 +18,6 @@ extern "C" {
#include "cdtest-foo.h" #include "cdtest-foo.h"
const Foo::len = FOO_MSG_LEN;
int Foo::foos = 0; int Foo::foos = 0;
void Foo::init_foo () void Foo::init_foo ()
@ -56,7 +54,7 @@ Foo::Foo (const Foo& foo)
{ {
i = ++foos; i = ++foos;
#ifdef WITH_ADDR #ifdef WITH_ADDR
printf ("Initializing Foo(%d) \"%s\" at %08x with Foo(%d) %08x\n", printf ("Initializing Foo(%d) \"%s\" at %08x with Foo(%d) %08x\n",
i, foo.message, this, foo.i, &foo); i, foo.message, this, foo.i, &foo);
#else #else
printf ("Initializing Foo(%d) \"%s\" with Foo(%d)\n",i, foo.message, foo.i); printf ("Initializing Foo(%d) \"%s\" with Foo(%d)\n",i, foo.message, foo.i);
@ -68,7 +66,7 @@ Foo::Foo (const Foo& foo)
Foo& Foo::operator= (const Foo& foo) Foo& Foo::operator= (const Foo& foo)
{ {
#ifdef WITH_ADDR #ifdef WITH_ADDR
printf ("Copying Foo(%d) \"%s\" at %08x to Foo(%d) %08x\n", printf ("Copying Foo(%d) \"%s\" at %08x to Foo(%d) %08x\n",
foo.i, foo.message, &foo, i, this); foo.i, foo.message, &foo, i, this);
#else #else
printf ("Copying Foo(%d) \"%s\" to Foo(%d)\n", foo.i, foo.message, i); printf ("Copying Foo(%d) \"%s\" to Foo(%d)\n", foo.i, foo.message, i);

View File

@ -11,8 +11,8 @@
class Foo { class Foo {
static int foos; static int foos;
int i; int i;
static const int len; const len = FOO_MSG_LEN;
char message[FOO_MSG_LEN]; char message[len];
public: public:
static void init_foo (); static void init_foo ();
static int nb_foos() { return foos; } static int nb_foos() { return foos; }

View File

@ -1,12 +1,14 @@
// main program for Class Foo // main program for Class Foo
extern "C" {
// Some <assert.h> implementations (e.g. SUNOS 4.1) are broken,
// in that they require <stdio.h>. But, if gcc/g++ is installed
// correctly, you should get gcc's assert.h.
// If the compile fails, it means the wrong include files are in use!
#include <assert.h>
};
#include "cdtest-foo.h" #include "cdtest-foo.h"
// If we're using "../gcc/xgcc -B../gcc/", we may not have fixed C++
// header files to work with. So we can't use assert.h here.
extern "C" void exit (int);
#define assert(X) if (!(X)) exit(1)
extern "C" void __init_start(); extern "C" void __init_start();
extern Foo f(void); extern Foo f(void);
@ -14,24 +16,25 @@ extern void g(void);
/* This function should *not* be called by the environment. There is /* This function should *not* be called by the environment. There is
no way in C++ to ``run something after the initializers but before main()''. no way in C++ to ``run something after the initializers but before main()''.
The library that depends on this (NIHCL) is broken. -- John Gilmore The library that depends on this (NIHCL) is broken. -- John Gilmore
We leave this here to test that future changes to the compiler We leave this here to test that future changes to the compiler
do not re-introduce this losing ``feature''. */ do not re-introduce this losing ``feature''. */
void void
__init_start() __init_start()
{ {
Foo::init_foo(); Foo::init_foo();
} }
static Foo static_foo( "static_foo"); static Foo static_foo( "static_foo");
main() main()
{ {
assert (Foo::nb_foos() == 2); assert (Foo::nb_foos() == 2);
Foo automatic_foo( "automatic_foo"); Foo automatic_foo( "automatic_foo");
Foo bla_foo = f(); Foo bla_foo = f();
assert (Foo::nb_foos() == 4); assert (Foo::nb_foos() == 4);
g(); g();
assert (Foo::nb_foos() == 4); assert (Foo::nb_foos() == 4);
// `automatic_foo' and `bla_foo' are destructed here // `automatic_foo' and `bla_foo' are destructed here
} }

View File

@ -1,6 +1,5 @@
#
# Expect script for LD cdtest Tests # Expect script for LD cdtest Tests
# Copyright (C) 1993 Free Software Foundation # Copyright (C) 1993,1994 Free Software Foundation
# #
# This file is free software; you can redistribute it and/or modify # 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 # it under the terms of the GNU General Public License as published by
@ -17,71 +16,74 @@
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
# #
# Written by Jeffrey Wheat (cassidy@cygnus.com) # Written by Jeffrey Wheat (cassidy@cygnus.com)
# Rewritten by Ian Lance Taylor (ian@cygnus.com)
# #
# # Make sure that constructors are handled correctly.
# Bugs:
# + Assumes native toolchain, not cross.
# + Doesn't detect compilation failures (including lack of C++ compiler)
# cleanly.
# + Shouldn't use fixed names in /tmp for temp files -- either use names
# in current directory, or generate unique names.
#
if $tracelevel then { # This test requires running the executable generated by ld.
strace $tracelevel if ![isnative] {return}
if ![file isdirectory tmpdir] {catch "exec mkdir tmpdir" status}
if ![ld_compile "$CXX $CXXFLAGS -fgnu-linker" $srcdir$subdir/cdtest-foo.cc tmpdir/cdtest-foo.o] {
return
}
if ![ld_compile "$CXX $CXXFLAGS -fgnu-linker" $srcdir$subdir/cdtest-bar.cc tmpdir/cdtest-bar.o] {
return
}
if ![ld_compile "$CXX $CXXFLAGS -fgnu-linker" $srcdir$subdir/cdtest-main.cc tmpdir/cdtest-main.o] {
return
} }
set tmpdir /tmp if ![ld_link $ld tmpdir/cdtest {tmpdir/cdtest-foo.o tmpdir/cdtest-bar.o tmpdir/cdtest-main.o}] {
set ld $objdir/ld.new fail cdtest
} else {
set objects "$tmpdir/cdtest-main.o $tmpdir/cdtest-bar.o $tmpdir/cdtest-foo.o" send_log "tmpdir/cdtest >tmpdir/cdtest.out\n"
verbose "tmpdir/cdtest >tmpdir/cdtest.out"
# compile the dependant objects catch "exec tmpdir/cdtest >tmpdir/cdtest.out" exec_output
if ![string match "" $exec_output] then {
verbose "### Compiling dependant objects\n" send_log "$exec_output\n"
verbose "$exec_output" 1
ld_compile "$CXX $CXXFLAGS" $srcdir/$subdir/cdtest-foo.cc $tmpdir/cdtest-foo.o fail cdtest
ld_compile "$CXX $CXXFLAGS" $srcdir/$subdir/cdtest-bar.cc $tmpdir/cdtest-bar.o
ld_compile "$CXX $CXXFLAGS" $srcdir/$subdir/cdtest-main.cc $tmpdir/cdtest-main.o
#
# main test loop
#
foreach test [glob -nocomplain $srcdir/$subdir/*.dat] {
global target
global status
global result
set target "$srcdir/$subdir/[file tail [file rootname $test]]"
set tmptarget "$tmpdir/[file tail [file rootname $test]]"
verbose "### Running test $target\n"
# link the target with objects and libraries
ld_link $ld $tmptarget $objects
# load (execute) the target
if ![file exists $tmptarget] then {
unresolved "$tmptarget doesn't exist."
} else { } else {
catch "exec $tmptarget > $tmptarget.out" exec_output send_log "diff tmpdir/cdtest.out $srcdir$subdir/cdtest.dat\n"
verbose "diff tmpdir/cdtest.out $srcdir$subdir/cdtest.dat"
# diff the expected and actual outputs catch "exec diff tmpdir/cdtest.out $srcdir$subdir/cdtest.dat" exec_output
if [file exists $tmptarget.out] then { if [string match "" $exec_output] then {
catch "simple_diff $target.dat $tmptarget.out" status pass cdtest
} else { } else {
fail "$tmptarget.out doesn't exist. error was $status" send_log "$exec_output\n"
verbose "$exec_output" 1
fail cdtest
} }
} }
# remove generated targets
verbose "Exec exec rm -f $tmptarget.o $tmptarget.out $tmptarget $tmptarget.grt"
catch "exec rm -f $tmptarget.o $tmptarget.out $tmptarget.grt $tmptarget" result
} }
# remove dependant objects
verbose "Exec rm -f $objects"
catch "exec rm -f $objects" result
ld_exit
if ![ld_relocate $ld tmpdir/cdtest.o {-Ur tmpdir/cdtest-foo.o tmpdir/cdtest-bar.o tmpdir/cdtest-main.o}] {
fail "cdtest with -Ur"
} else {
if ![ld_link $ld tmpdir/cdtest tmpdir/cdtest.o] {
fail "cdtest with -Ur"
} else {
send_log "tmpdir/cdtest >tmpdir/cdtest.out\n"
verbose "tmpdir/cdtest >tmpdir/cdtest.out"
catch "exec tmpdir/cdtest >tmpdir/cdtest.out" exec_output
if ![string match "" $exec_output] then {
send_log "$exec_output\n"
verbose "$exec_output" 1
fail "cdtest with -Ur"
} else {
send_log "diff tmpdir/cdtest.out $srcdir$subdir/cdtest.dat\n"
verbose "diff tmpdir/cdtest.out $srcdir$subdir/cdtest.dat"
catch "exec diff tmpdir/cdtest.out $srcdir$subdir/cdtest.dat" exec_output
if [string match "" $exec_output] then {
pass "cdtest with -Ur"
} else {
send_log "$exec_output\n"
verbose "$exec_output" 1
fail "cdtest with -Ur"
}
}
}
}

View File

@ -4,7 +4,7 @@
# #
proc default_ld_version { ld } { proc default_ld_version { ld } {
if { [file exists $ld] == 0 } then { if { [file exists $ld] == 0 } then {
perror "$ld does not exist" perror "$ld does not exist"
exit 1 exit 1
} }
@ -25,17 +25,20 @@ proc default_ld_relocate { ld target objects } {
global HOSTING_EMU global HOSTING_EMU
if { [file exists $ld] == 0 } then { if { [file exists $ld] == 0 } then {
perror "$ld does not exist" perror "$ld does not exist"
exit 1 return 0
} }
send_log "### EXEC \"$ld $HOSTING_EMU -o $target -r $objects\"\n" send_log "$ld $HOSTING_EMU -o $target -r $objects\n"
verbose "### EXEC \"$ld $HOSTING_EMU -o $target -r $objects\"" verbose "$ld $HOSTING_EMU -o $target -r $objects"
catch "exec $ld $HOSTING_EMU -o $target -r $objects" exec_output catch "exec $ld $HOSTING_EMU -o $target -r $objects" exec_output
if ![string match "" $exec_output] then { if [string match "" $exec_output] then {
return 1
} else {
send_log "$exec_output\n" send_log "$exec_output\n"
verbose "$exec_output" verbose "$exec_output"
return 0
} }
} }
@ -46,27 +49,28 @@ proc default_ld_relocate { ld target objects } {
# #
proc default_ld_link { ld target objects } { proc default_ld_link { ld target objects } {
global BFDLIB
global LIBIBERTY
global HOSTING_EMU global HOSTING_EMU
global HOSTING_CRT0 global HOSTING_CRT0
global HOSTING_LIBS global HOSTING_LIBS
set objs "$HOSTING_CRT0 $objects" set objs "$HOSTING_CRT0 $objects"
set libs "$BFDLIB $LIBIBERTY $HOSTING_LIBS" set libs "$HOSTING_LIBS"
if { [file exists $ld] == 0 } then { if { [file exists $ld] == 0 } then {
perror "$ld does not exist" perror "$ld does not exist"
exit 1 return 0
} }
send_log "### EXEC \"$ld $HOSTING_EMU -o $target $objs $libs\"\n" send_log "$ld $HOSTING_EMU -o $target $objs $libs\n"
verbose "### EXEC \"$ld $HOSTING_EMU -o $target $objs $libs\"" verbose "$ld $HOSTING_EMU -o $target $objs $libs"
catch "exec $ld $HOSTING_EMU -o $target $objs $libs" exec_output catch "exec $ld $HOSTING_EMU -o $target $objs $libs" exec_output
if ![string match "" $exec_output] then { if [string match "" $exec_output] then {
return 1
} else {
send_log "$exec_output\n" send_log "$exec_output\n"
verbose "$exec_output" verbose "$exec_output"
return 0
} }
} }
@ -80,17 +84,21 @@ proc default_ld_compile { cc source object } {
global subdir global subdir
if {[which $cc] == 0} then { if {[which $cc] == 0} then {
perror "$cc does not exist" perror "$cc does not exist"
exit 1 return 0
} }
send_log "$cc $CFLAGS -I$srcdir/$subdir -c $source -o $object\n" send_log "$cc -I$srcdir$subdir -c $CFLAGS $source -o $object\n"
verbose "### EXEC \"$cc $CFLAGS -I$srcdir/$subdir -c $source -o $object\"" verbose "$cc -I$srcdir$subdir -c $CFLAGS $source -o $object"
catch "exec $cc $CFLAGS -I$srcdir/$subdir -c $source -o $object" exec_output catch "exec $cc -I$srcdir$subdir -c $CFLAGS $source -o $object" exec_output
if ![string match "" $exec_output] then { if [string match "" $exec_output] then {
return 1
} else {
send_log "$exec_output\n" send_log "$exec_output\n"
verbose "$exec_output" verbose "$exec_output"
perror "$source: compilation failed"
return 0
} }
} }
@ -120,7 +128,7 @@ proc simple_diff { file_1 file_2 } {
return return
} }
verbose "### Diff'ing: $file_1 $file_2\n" 2 verbose "# Diff'ing: $file_1 $file_2\n" 2
while { [gets $file_a line] != $eof } { while { [gets $file_a line] != $eof } {
if [regexp "^#.*$" $line] then { if [regexp "^#.*$" $line] then {