diff options
author | Ben Cheng <bccheng@google.com> | 2014-03-26 11:03:35 -0700 |
---|---|---|
committer | Ben Cheng <bccheng@google.com> | 2014-03-26 11:03:35 -0700 |
commit | 09797ba54abf3683ea66eedddf6afbe7653f9cb9 (patch) | |
tree | 8030b2ed79c7463c89d6da294782e9d503c84f50 /binutils-2.24/ld/testsuite/ld-cdtest | |
parent | 5a2caf34e4995860baf405552163df288000b7bf (diff) | |
download | toolchain_binutils-09797ba54abf3683ea66eedddf6afbe7653f9cb9.zip toolchain_binutils-09797ba54abf3683ea66eedddf6afbe7653f9cb9.tar.gz toolchain_binutils-09797ba54abf3683ea66eedddf6afbe7653f9cb9.tar.bz2 |
Initial checkin of binutils 2.24.
Change-Id: I0dfcbae6608dded6c3586bf5f4ac27e9612e70a2
Diffstat (limited to 'binutils-2.24/ld/testsuite/ld-cdtest')
-rw-r--r-- | binutils-2.24/ld/testsuite/ld-cdtest/cdtest-bar.cc | 17 | ||||
-rw-r--r-- | binutils-2.24/ld/testsuite/ld-cdtest/cdtest-foo.cc | 89 | ||||
-rw-r--r-- | binutils-2.24/ld/testsuite/ld-cdtest/cdtest-foo.h | 24 | ||||
-rw-r--r-- | binutils-2.24/ld/testsuite/ld-cdtest/cdtest-main.cc | 40 | ||||
-rw-r--r-- | binutils-2.24/ld/testsuite/ld-cdtest/cdtest-nrv.dat | 13 | ||||
-rw-r--r-- | binutils-2.24/ld/testsuite/ld-cdtest/cdtest.dat | 15 | ||||
-rw-r--r-- | binutils-2.24/ld/testsuite/ld-cdtest/cdtest.exp | 127 |
7 files changed, 325 insertions, 0 deletions
diff --git a/binutils-2.24/ld/testsuite/ld-cdtest/cdtest-bar.cc b/binutils-2.24/ld/testsuite/ld-cdtest/cdtest-bar.cc new file mode 100644 index 0000000..79000e3 --- /dev/null +++ b/binutils-2.24/ld/testsuite/ld-cdtest/cdtest-bar.cc @@ -0,0 +1,17 @@ +// test program for Class Foo + +#include "cdtest-foo.h" + +static Foo static_foo( "static_foo"); + +Foo f() +{ + Foo x; + return x; +} + +void g() +{ + Foo other_foo1 = Foo( "other_foo1"), other_foo2 = Foo( "other_foo2"); + other_foo2 = other_foo1; +} diff --git a/binutils-2.24/ld/testsuite/ld-cdtest/cdtest-foo.cc b/binutils-2.24/ld/testsuite/ld-cdtest/cdtest-foo.cc new file mode 100644 index 0000000..d8e5cbe --- /dev/null +++ b/binutils-2.24/ld/testsuite/ld-cdtest/cdtest-foo.cc @@ -0,0 +1,89 @@ +// Class Foo +#pragma implementation + + +// We don't use header files, since we only want to see, whether the +// compiler is installed properly. +// +#if (__GNUG__ == 2) +typedef __SIZE_TYPE__ size_t; +#else +typedef unsigned int size_t; +#endif + +extern "C" { + char *strncpy (char* dest, const char* src, size_t len); + int printf (const char*, ...); +}; + +#include "cdtest-foo.h" + +int Foo::foos = 0; + +void Foo::init_foo () +{ + printf ("BROKENLY calling Foo::init_foo from __init_start; size_of(Foo) = %ld\n", (long) sizeof(Foo)); + foos = FOOLISH_NUMBER; +} + + +Foo::Foo () +{ + i = ++foos; + strncpy (message, "default-foo", len); +#ifdef WITH_ADDR + printf ("Constructing Foo(%d) \"default-foo\" at %08x\n", i, this); +#else + printf ("Constructing Foo(%d) \"default-foo\"\n", i); +#endif +} + +Foo::Foo (const char* msg) +{ + i = ++foos; + strncpy( message, msg, len); +#ifdef WITH_ADDR + printf ( "Constructing Foo(%d) \"%s\" at %08x\n", i, message, this); +#else + printf ( "Constructing Foo(%d) \"%s\"\n", i, message); +#endif +} + + +Foo::Foo (const Foo& foo) +{ + i = ++foos; +#ifdef WITH_ADDR + printf ("Initializing Foo(%d) \"%s\" at %08x with Foo(%d) %08x\n", + i, foo.message, this, foo.i, &foo); +#else + printf ("Initializing Foo(%d) \"%s\" with Foo(%d)\n",i, foo.message, foo.i); +#endif + for ( int k = 0; k < FOO_MSG_LEN; k++) message[k] = foo.message[k]; +} + + +Foo& Foo::operator= (const Foo& foo) +{ +#ifdef WITH_ADDR + printf ("Copying Foo(%d) \"%s\" at %08x to Foo(%d) %08x\n", + foo.i, foo.message, &foo, i, this); +#else + printf ("Copying Foo(%d) \"%s\" to Foo(%d)\n", foo.i, foo.message, i); +#endif + for ( int k = 0; k < FOO_MSG_LEN; k++) message[k] = foo.message[k]; + return *this; +} + + +Foo::~Foo () +{ + foos--; +#ifdef WITH_ADDR + printf ("Destructing Foo(%d) \"%s\" at %08x (remaining foos: %d)\n", + i, message, this, foos); +#else + printf ("Destructing Foo(%d) \"%s\" (remaining foos: %d)\n", + i, message, foos); +#endif +} diff --git a/binutils-2.24/ld/testsuite/ld-cdtest/cdtest-foo.h b/binutils-2.24/ld/testsuite/ld-cdtest/cdtest-foo.h new file mode 100644 index 0000000..f36efb7 --- /dev/null +++ b/binutils-2.24/ld/testsuite/ld-cdtest/cdtest-foo.h @@ -0,0 +1,24 @@ +// Class Foo + +#pragma interface + +#define FOOLISH_NUMBER -4711 + +#ifndef FOO_MSG_LEN +#define FOO_MSG_LEN 80 +#endif + +class Foo { + static int foos; + int i; + static const int len = FOO_MSG_LEN; + char message[len]; +public: + static void init_foo (); + static int nb_foos() { return foos; } + Foo(); + Foo(const char* message); + Foo(const Foo&); + Foo & operator= (const Foo&); + ~Foo (); +}; diff --git a/binutils-2.24/ld/testsuite/ld-cdtest/cdtest-main.cc b/binutils-2.24/ld/testsuite/ld-cdtest/cdtest-main.cc new file mode 100644 index 0000000..bc881da --- /dev/null +++ b/binutils-2.24/ld/testsuite/ld-cdtest/cdtest-main.cc @@ -0,0 +1,40 @@ +// 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" + +extern "C" void __init_start(); + +extern Foo f(void); +extern void g(void); + +/* This function should *not* be called by the environment. There is + no way in C++ to ``run something after the initializers but before main()''. + The library that depends on this (NIHCL) is broken. -- John Gilmore + We leave this here to test that future changes to the compiler + do not re-introduce this losing ``feature''. */ +void +__init_start() +{ + Foo::init_foo(); +} + +static Foo static_foo( "static_foo"); + +int main() +{ + assert (Foo::nb_foos() == 2); + Foo automatic_foo( "automatic_foo"); + Foo bla_foo = f(); + assert (Foo::nb_foos() == 4); + g(); + assert (Foo::nb_foos() == 4); + // `automatic_foo' and `bla_foo' are destructed here +} + diff --git a/binutils-2.24/ld/testsuite/ld-cdtest/cdtest-nrv.dat b/binutils-2.24/ld/testsuite/ld-cdtest/cdtest-nrv.dat new file mode 100644 index 0000000..d3f871f --- /dev/null +++ b/binutils-2.24/ld/testsuite/ld-cdtest/cdtest-nrv.dat @@ -0,0 +1,13 @@ +Constructing Foo(1) "static_foo" +Constructing Foo(2) "static_foo" +Constructing Foo(3) "automatic_foo" +Constructing Foo(4) "default-foo" +Constructing Foo(5) "other_foo1" +Constructing Foo(6) "other_foo2" +Copying Foo(5) "other_foo1" to Foo(6) +Destructing Foo(6) "other_foo1" (remaining foos: 5) +Destructing Foo(5) "other_foo1" (remaining foos: 4) +Destructing Foo(4) "default-foo" (remaining foos: 3) +Destructing Foo(3) "automatic_foo" (remaining foos: 2) +Destructing Foo(2) "static_foo" (remaining foos: 1) +Destructing Foo(1) "static_foo" (remaining foos: 0) diff --git a/binutils-2.24/ld/testsuite/ld-cdtest/cdtest.dat b/binutils-2.24/ld/testsuite/ld-cdtest/cdtest.dat new file mode 100644 index 0000000..39be0db --- /dev/null +++ b/binutils-2.24/ld/testsuite/ld-cdtest/cdtest.dat @@ -0,0 +1,15 @@ +Constructing Foo(1) "static_foo" +Constructing Foo(2) "static_foo" +Constructing Foo(3) "automatic_foo" +Constructing Foo(4) "default-foo" +Initializing Foo(5) "default-foo" with Foo(4) +Destructing Foo(4) "default-foo" (remaining foos: 4) +Constructing Foo(5) "other_foo1" +Constructing Foo(6) "other_foo2" +Copying Foo(5) "other_foo1" to Foo(6) +Destructing Foo(6) "other_foo1" (remaining foos: 5) +Destructing Foo(5) "other_foo1" (remaining foos: 4) +Destructing Foo(5) "default-foo" (remaining foos: 3) +Destructing Foo(3) "automatic_foo" (remaining foos: 2) +Destructing Foo(2) "static_foo" (remaining foos: 1) +Destructing Foo(1) "static_foo" (remaining foos: 0) diff --git a/binutils-2.24/ld/testsuite/ld-cdtest/cdtest.exp b/binutils-2.24/ld/testsuite/ld-cdtest/cdtest.exp new file mode 100644 index 0000000..a25b437 --- /dev/null +++ b/binutils-2.24/ld/testsuite/ld-cdtest/cdtest.exp @@ -0,0 +1,127 @@ +# Expect script for LD cdtest Tests +# Copyright 1993, 1994, 1995, 1997, 2001, 2004, 2005, 2007 +# 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 Jeffrey Wheat (cassidy@cygnus.com) +# Rewritten by Ian Lance Taylor (ian@cygnus.com) +# + +# Make sure that constructors are handled correctly. + +set test1 "cdtest" +set test2 "cdtest with -Ur" + +# This test requires running the executable generated by ld. +if ![isnative] { + return +} + +if { [which $CXX] == 0 } { + untested $test1 + untested $test2 + return +} + +if { ![ld_compile "$CXX $CXXFLAGS -fno-exceptions" $srcdir/$subdir/cdtest-foo.cc tmpdir/cdtest-foo.o] + || ![ld_compile "$CXX $CXXFLAGS -fno-exceptions" $srcdir/$subdir/cdtest-bar.cc tmpdir/cdtest-bar.o] + || ![ld_compile "$CXX $CXXFLAGS -fno-exceptions" $srcdir/$subdir/cdtest-main.cc tmpdir/cdtest-main.o] } { + unresolved $test1 + unresolved $test2 + return +} + +set expected_output "$srcdir/$subdir/cdtest.dat" + +if ![ld_link $ld tmpdir/cdtest {tmpdir/cdtest-foo.o tmpdir/cdtest-bar.o tmpdir/cdtest-main.o}] { + fail $test1 +} 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 $test1 + } else { + send_log "diff tmpdir/cdtest.out $expected_output\n" + verbose "diff tmpdir/cdtest.out $expected_output" + catch "exec diff tmpdir/cdtest.out $expected_output" exec_output + set exec_output [prune_warnings $exec_output] + + if ![string match "" $exec_output] then { + send_log "$exec_output\n" + verbose "$exec_output" 1 + + send_log "Checking against Named Return Value optimization\n" + verbose "Checking against Named Return Value optimization" 1 + + set expected_output "$srcdir/$subdir/cdtest-nrv.dat" + + send_log "diff tmpdir/cdtest.out $expected_output\n" + verbose "diff tmpdir/cdtest.out $expected_output" + catch "exec diff tmpdir/cdtest.out $expected_output" exec_output + set exec_output [prune_warnings $exec_output] + } + + if [string match "" $exec_output] then { + pass $test1 + } else { + send_log "$exec_output\n" + verbose "$exec_output" 1 + + fail $test1 + } + } +} + +if ![ld_relocate $ld tmpdir/cdtest.o {-Ur tmpdir/cdtest-foo.o tmpdir/cdtest-bar.o tmpdir/cdtest-main.o}] { + fail $test2 +} else { + if ![ld_link $ld tmpdir/cdtest tmpdir/cdtest.o] { + fail $test2 + } 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 $test2 + } else { + send_log "diff tmpdir/cdtest.out $expected_output\n" + verbose "diff tmpdir/cdtest.out $expected_output" + catch "exec diff tmpdir/cdtest.out $expected_output" exec_output + set exec_output [prune_warnings $exec_output] + + if [string match "" $exec_output] then { + pass $test2 + } else { + send_log "$exec_output\n" + verbose "$exec_output" 1 + + fail $test2 + } + } + } +} |