This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [testsuite, build] Convert boehm-gc testsuite to DejaGnu (PR boehm-gc/11412)


Mike Stump <mikestump@comcast.net> writes:

>> +    catch { exec $libtool --mode=clean rm -f $basename.lo }
>
> If libtool runs on the host, this doesn't do that, try:
>
>   [remote_exec host ... ]
>
> see gcc.exp for examples.
>
>> +	catch { exec $libtool --mode=clean rm -f [file rootname [file tail $testcase]] $shlib }
>
> Likewise.

I've applied those changes, and also managed to fix the problems I had
in Tru64 UNIX testing.  Here's the patch I'd like to commit to 4.7.

It contains a couple of build changes beyond the last one, so I need
build maintainer approval for those:

* UNWINDLIBS is never set, thus removed as unused.

* On Tru64 UNIX, the tests need to be compiled with -pthread since
  <pthread.h> errors out if not compiled with -D_REENTRANT.  To handle
  that, I collect the necessary flags in THREADCFLAGS and store that in
  site.exp.  Before, it was added to INCLUDES or AM_CPPFLAGS which seems
  wrong.

* I'm removing DG/UX support which has some thread stuff, but Hans
  already agreed that this can go as long obsolete.

Bootstrapped without regressions on {i386, sparc}-pc-solaris2.{8, 9, 10,
11} with Sun and GNU ld, alpha-dec-osf5.1b and mips-sgi-irix6.5.

Ok for mainline?

Thanks.
	Rainer


2010-12-31  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>

	PR boehm-gc/11412
	* configure.ac (THREADCFLAGS): New variable.
	Use it instead of INCLUDES, AM_CPPFLAGS.
	Remove DG/UX support.
	(AC_CONFIG_FILES): Add testsuite/Makefile.
	* Makefile.am (AUTOMAKE_OPTIONS): Use foreign instead of cygnus.
	(SUBDIRS): Add testsuite.
	(libgcjgc_la_LIBADD): Remove $(UNWINDLIBS).
	(AM_CXXFLAGS): Add $(THREADCFLAGS).
	(AM_CFLAGS): Likewise.
	Remove TESTS related variables.
	(AM_MAKEFLAGS): Don't pass RUNTEST.
	* Makefile.in: Regenerate.
	* configure: Regenerate.
	* testsuite/Makefile.am: New file.
	* testsuite/Makefile.in: New file.
	* testsuite/lib/boehm-gc.exp: New file.
	* testsuite/config/default.exp: New file.
	* testsuite/boehm-gc.c/c.exp: New file.
	* testsuite/boehm-gc.lib/lib.exp: New file.
	* tests/test.c: Move ...
	* testsuite/boehm-gc.c/gctest.c: ... here.
	* tests/leak_test.c, tests/middle.c, tests/thread_leak_test.c,
	tests/trace_test.c: Move ...
	* testsuite/boehm-gc.c: ... here.
	* testsuite/boehm-gc.c/trace_test.c: Skip everywhere.
	* tests/staticrootslib.c, tests/staticrootstest.c: Move ...
	* testsuite/boehm-gc.lib: ... here.
	* testsuite/boehm-gc.lib/staticrootstest.c: Use dg-add-shlib
	staticrootslib.c.
	* tests/test_cpp.cc: Move ...
	* testsuite/boehm-gc.c++: ... here.

diff -r 8efcb4b03d45 boehm-gc/Makefile.am
--- a/boehm-gc/Makefile.am	Sun Mar 20 14:28:11 2011 +0100
+++ b/boehm-gc/Makefile.am	Sun Mar 20 21:37:14 2011 +0100
@@ -4,10 +4,10 @@
 ## files that should be in the distribution are not mentioned in this
 ## Makefile.am.
 
-AUTOMAKE_OPTIONS = cygnus subdir-objects
+AUTOMAKE_OPTIONS = foreign subdir-objects
 ACLOCAL_AMFLAGS = -I .. -I ../config
 
-SUBDIRS = include
+SUBDIRS = include testsuite
 
 noinst_LTLIBRARIES = libgcjgc.la libgcjgc_convenience.la
 
@@ -35,7 +35,7 @@
 
 # Include THREADLIBS here to ensure that the correct versions of
 # linuxthread semaphore functions get linked:
-libgcjgc_la_LIBADD = $(addobjs) $(THREADLIBS) $(UNWINDLIBS)
+libgcjgc_la_LIBADD = $(addobjs) $(THREADLIBS)
 libgcjgc_la_DEPENDENCIES = $(addobjs)
 libgcjgc_la_LDFLAGS = $(extra_ldflags_libgc) -version-info 1:2:0 -rpath $(toolexeclibdir)
 libgcjgc_la_LINK = $(LINK) $(libgcjgc_la_LDFLAGS)
@@ -43,48 +43,11 @@
 libgcjgc_convenience_la_LIBADD = $(addobjs)
 libgcjgc_convenience_la_DEPENDENCIES = $(addobjs)
 
-AM_CXXFLAGS = $(GC_CFLAGS)
-AM_CFLAGS = $(GC_CFLAGS)
+AM_CXXFLAGS = $(GC_CFLAGS) $(THREADCFLAGS)
+AM_CFLAGS = $(GC_CFLAGS) $(THREADCFLAGS)
 AM_LDFLAGS = $(shell $(top_srcdir)/../libtool-ldflags $(LDFLAGS))
 override CFLAGS := $(filter-out $(O0_CFLAGS), $(CFLAGS)) $(O0_CFLAGS)
 
-test_ldadd = libgcjgc.la $(THREADLIBS) $(UNWINDLIBS) $(EXTRA_TEST_LIBS)
-
-check_PROGRAMS = gctest
-gctest_SOURCES = tests/test.c
-gctest_LDADD = $(test_ldadd)
-gctest_LDFLAGS = -shared-libgcc
-gctest_LINK = $(LINK) $(gctest_LDFLAGS)
-TESTS_ENVIRONMENT = LD_LIBRARY_PATH=../../$(MULTIBUILDTOP)gcc
-TESTS = gctest
-
-TESTS += leaktest$(EXEEXT)
-check_PROGRAMS += leaktest
-leaktest_SOURCES = tests/leak_test.c
-leaktest_LDADD = $(test_ldadd)
-leaktest_LDFLAGS = -shared-libgcc
-leaktest_LINK = $(LINK) $(leaktest_LDFLAGS)
-
-TESTS += middletest$(EXEEXT)
-check_PROGRAMS += middletest
-middletest_SOURCES = tests/middle.c
-middletest_LDADD = $(test_ldadd)
-middletest_LDFLAGS = -shared-libgcc
-middletest_LINK = $(LINK) $(middletest_LDFLAGS)
-
-TESTS += staticrootstest$(EXEEXT)
-check_PROGRAMS += staticrootstest
-staticrootstest_SOURCES = tests/staticrootstest.c
-staticrootstest_LDADD = $(test_ldadd) libstaticrootslib.la
-staticrootstest_LDFLAGS = -shared-libgcc
-staticrootstest_LINK = $(LINK) $(staticrootstest_LDFLAGS)
-check_LTLIBRARIES = libstaticrootslib.la
-libstaticrootslib_la_SOURCES = tests/staticrootslib.c
-libstaticrootslib_la_LIBADD = libgcjgc_convenience.la
-libstaticrootslib_la_LDFLAGS = -version-info 1:2:0 -no-undefined \
-				-rpath /nowhere -shared-libgcc
-libstaticrootslib_la_DEPENDENCIES = libgcjgc_convenience.la
-
 ## FIXME: we shouldn't have to do this, but automake forces us to.
 .s.lo:
 ## We use -Wp,-P to strip #line directives.  Irix `as' chokes on
@@ -116,7 +79,6 @@
 	"PICFLAG_FOR_TARGET=$(PICFLAG_FOR_TARGET)" \
 	"SHELL=$(SHELL)" \
 	"EXPECT=$(EXPECT)" \
-	"RUNTEST=$(RUNTEST)" \
 	"RUNTESTFLAGS=$(RUNTESTFLAGS)" \
 	"exec_prefix=$(exec_prefix)" \
 	"infodir=$(infodir)" \
diff -r 8efcb4b03d45 boehm-gc/configure.ac
--- a/boehm-gc/configure.ac	Sun Mar 20 14:28:11 2011 +0100
+++ b/boehm-gc/configure.ac	Sun Mar 20 21:37:14 2011 +0100
@@ -123,6 +123,7 @@
 )
 
 AM_CPPFLAGS="-I`cd $srcdir && ${PWDCMD-pwd}`/include"
+THREADCFLAGS=
 THREADLIBS=
 case "$THREADS" in
  no | none | single)
@@ -163,9 +164,9 @@
      *-*-hpux10*)
 	AC_MSG_WARN("Only HP-UX 11 POSIX threads are supported.")
 	;;
-      *-*-kfreebsd*-gnu)
+     *-*-kfreebsd*-gnu)
        AC_DEFINE(GC_FREEBSD_THREADS)
-       INCLUDES="$INCLUDES -pthread"
+       THREADCFLAGS=-pthread
        THREADDLLIBS=-pthread
        AC_DEFINE(_REENTRANT)
          if test "${enable_parallel_mark}" = yes; then
@@ -173,11 +174,11 @@
        fi
        AC_DEFINE(THREAD_LOCAL_ALLOC)
        AC_DEFINE(USE_COMPILER_TLS, 1,[use tls for boehm])
-               ;;
+       ;;
      *-*-freebsd*)
 	AC_MSG_WARN("FreeBSD does not yet fully support threads with Boehm GC.")
 	AC_DEFINE(GC_FREEBSD_THREADS,1,[support FreeBSD threads])
-	AM_CPPFLAGS="$AM_CPPFLAGS -pthread"
+	THREADCFLAGS=-pthread
 	THREADLIBS=-pthread
       	;;
      *-*-solaris2.8*)
@@ -218,7 +219,7 @@
 	  # May want to enable it in other cases, too.
 	  # Measurements havent yet been done.
 	fi
-	AM_CPPFLAGS="$AM_CPPFLAGS -pthread"
+	THREADCFLAGS=-pthread
 	THREADLIBS="-lpthread -lrt"
 	;;
     esac
@@ -228,20 +229,6 @@
     dnl Old wine getenv may not return NULL for missing entry.
     dnl Define EMPTY_GETENV_RESULTS here to work around the bug.
     ;;
- dgux386)
-    THREADS=dgux386
-AC_MSG_RESULT($THREADLIBS)
-    # Use pthread GCC  switch
-    THREADLIBS=-pthread
-    if test "${enable_parallel_mark}" = yes; then
-        AC_DEFINE(PARALLEL_MARK,1)
-    fi
-    AC_DEFINE(THREAD_LOCAL_ALLOC,1)
-    AC_DEFINE(GC_DGUX386_THREADS,1,[support for DB/UX on I386 threads])
-    AC_DEFINE(DGUX_THREADS,1,[No description])
-    # Enable _POSIX4A_DRAFT10_SOURCE with flag -pthread
-    AM_CPPFLAGS="-pthread $AM_CPPFLAGS"
-    ;;
  aix)
     THREADS=posix
     THREADLIBS=-lpthread
@@ -255,6 +242,7 @@
     AC_MSG_ERROR($THREADS is an unknown thread package)
     ;;
 esac
+AC_SUBST(THREADCFLAGS)
 AC_SUBST(THREADLIBS)
 
 case "$host" in
@@ -455,22 +443,6 @@
 AC_SUBST(addlibs)
 AC_SUBST(addtests)
 
-#
-# Check for AViiON Machines running DGUX
-#
-ac_is_dgux=no
-AC_CHECK_HEADER(sys/dg_sys_info.h, [ac_is_dgux=yes])
-
-AC_MSG_CHECKING(if host is AViiON running DGUX)
-AC_MSG_RESULT($ac_is_dgux)
-    ## :GOTCHA: we do not check anything but sys/dg_sys_info.h
-if test $ac_is_dgux = yes; then
-    if test "$enable_full_debug" = "yes"; then
-        GC_CFLAGS="$GC_CFLAGS -mstandard"
-    fi
-    GC_CFLAGS="$GC_CFLAGS -DDGUX -D_DGUX_SOURCE -Di386 -mno-legend"
-fi
-
 dnl As of 4.13a2, the collector will not properly work on Solaris when
 dnl built with gcc and -O.  So we remove -O in the appropriate case.
 dnl Not needed anymore on Solaris.
@@ -513,9 +485,6 @@
 	AC_MSG_WARN("Client must not use -fomit-frame-pointer.")
 	AC_DEFINE(SAVE_CALL_COUNT, 8, [number of call frames saved with objects allocated through the debugging interface])
       ;;
-      i[3456]86-*-dgux*)
-	AC_DEFINE(MAKE_BACK_GRAPH,1)
-      ;;
     esac 
   fi])
 
@@ -547,5 +516,5 @@
 
 AC_CONFIG_HEADERS([include/gc_config.h include/gc_ext_config.h])
 
-AC_CONFIG_FILES(Makefile include/Makefile threads.mk)
+AC_CONFIG_FILES(Makefile include/Makefile testsuite/Makefile threads.mk)
 AC_OUTPUT
diff -r 8efcb4b03d45 boehm-gc/testsuite/Makefile.am
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/boehm-gc/testsuite/Makefile.am	Sun Mar 20 21:37:14 2011 +0100
@@ -0,0 +1,44 @@
+## Process this file with automake to produce Makefile.in.
+
+AUTOMAKE_OPTIONS = foreign dejagnu
+
+# Setup the testing framework, if you have one
+EXPECT = `if [ -f $(top_builddir)/../expect/expect ] ; then \
+            echo $(top_builddir)/../expect/expect ; \
+          else echo expect ; fi`
+
+RUNTEST = `if [ -f $(top_srcdir)/../dejagnu/runtest ] ; then \
+	       echo $(top_srcdir)/../dejagnu/runtest ; \
+	    else echo runtest; fi`
+
+# Override default.
+DEJATOOL = boehm-gc
+
+CLEANFILES = *.exe core* *.log *.sum
+
+# We need more things in site.exp, but automake completely controls the
+# creation of that file; there's no way to append to it without messing up
+# the dependancy chains.  So we overrule automake.  This rule is exactly
+# what it would have generated, plus our own additions.
+site.exp: Makefile
+	@echo 'Making a new site.exp file...'
+	@echo '## these variables are automatically generated by make ##' >site.tmp
+	@echo '# Do not edit here.  If you wish to override these values' >>site.tmp
+	@echo '# edit the last section' >>site.tmp
+	@echo 'set srcdir $(srcdir)' >>site.tmp
+	@echo "set objdir `pwd`" >>site.tmp
+	@echo 'set build_alias "$(build_alias)"' >>site.tmp
+	@echo 'set build_triplet $(build_triplet)' >>site.tmp
+	@echo 'set host_alias "$(host_alias)"' >>site.tmp
+	@echo 'set host_triplet $(host_triplet)' >>site.tmp
+	@echo 'set target_alias "$(target_alias)"' >>site.tmp
+	@echo 'set target_triplet $(target_triplet)' >>site.tmp
+	@echo 'set threadcflags "$(THREADCFLAGS)"' >>site.tmp
+	@echo 'set threadlibs "$(THREADLIBS)"' >>site.tmp
+	@echo 'set extra_test_libs "$(EXTRA_TEST_LIBS)"' >>site.tmp
+	@echo '## All variables above are generated by configure. Do Not Edit ##' >>site.tmp
+	@test ! -f site.exp || \
+	  sed '1,/^## All variables above are.*##/ d' site.exp >> site.tmp
+	@-rm -f site.bak
+	@test ! -f site.exp || mv site.exp site.bak
+	@mv site.tmp site.exp
diff -r 8efcb4b03d45 boehm-gc/testsuite/boehm-gc.c/trace_test.c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/boehm-gc/testsuite/boehm-gc.c/trace_test.c	Sun Mar 20 21:37:14 2011 +0100
@@ -0,0 +1,32 @@
+/* { dg-skip-if "requires --enable-gc-debug" *-*-* } */
+
+#include <stdio.h>
+#define GC_DEBUG
+#include "gc.h"
+
+struct treenode {
+    struct treenode *x;
+    struct treenode *y;
+} * root[10];
+
+struct treenode * mktree(int i) {
+  struct treenode * r = GC_MALLOC(sizeof(struct treenode));
+  if (0 == i) return 0;
+  if (1 == i) r = GC_MALLOC_ATOMIC(sizeof(struct treenode));
+  r -> x = mktree(i-1);
+  r -> y = mktree(i-1);
+  return r;
+}
+
+int main()
+{
+  int i;
+  for (i = 0; i < 10; ++i) {
+    root[i] = mktree(12);
+  }
+  GC_generate_random_backtrace();
+  GC_generate_random_backtrace();
+  GC_generate_random_backtrace();
+  GC_generate_random_backtrace();
+  return 0;
+}
diff -r 8efcb4b03d45 boehm-gc/testsuite/boehm-gc.lib/lib.exp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/boehm-gc/testsuite/boehm-gc.lib/lib.exp	Sun Mar 20 21:37:14 2011 +0100
@@ -0,0 +1,26 @@
+# Copyright (C) 2011 Free Software Foundation, Inc.
+
+# 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; see the file COPYING3.  If not see
+# <http://www.gnu.org/licenses/>.
+
+dg-init
+boehm-gc-init
+
+# Gather list of tests, skipping library source files.
+set tests [lsort [glob -nocomplain $srcdir/$subdir/*.c]]
+set tests [prune $tests $srcdir/$subdir/*lib.c]
+
+boehm-gc-dg-runtest $tests "-O2" ""
+
+dg-finish
diff -r 8efcb4b03d45 boehm-gc/testsuite/boehm-gc.lib/staticrootstest.c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/boehm-gc/testsuite/boehm-gc.lib/staticrootstest.c	Sun Mar 20 21:37:14 2011 +0100
@@ -0,0 +1,48 @@
+/* { dg-add-shlib "staticrootslib.c" } */
+
+#include <stdio.h>
+
+#ifndef GC_DEBUG
+# define GC_DEBUG
+#endif
+
+#include "gc.h"
+#include "gc_backptr.h"
+
+struct treenode {
+    struct treenode *x;
+    struct treenode *y;
+} * root[10];
+
+static char *staticroot = 0;
+
+extern struct treenode * libsrl_mktree(int i);
+extern void * libsrl_init(void);
+extern void * libsrl_collect (void);
+
+int main(void)
+{
+  int i;
+  staticroot = libsrl_init();
+  for (i = 0; i < sizeof(struct treenode); ++i) {
+    staticroot[i] = 0x42;
+  }
+  libsrl_collect();
+  for (i = 0; i < 10; ++i) {
+    root[i] = libsrl_mktree(12);
+    libsrl_collect();
+  }
+  for (i = 0; i < sizeof(struct treenode); ++i) {
+    if (staticroot[i] != 0x42)
+      return -1;
+  }
+  for (i = 0; i < 10; ++i) {
+    root[i] = libsrl_mktree(12);
+    libsrl_collect();
+  }
+  for (i = 0; i < sizeof(struct treenode); ++i) {
+    if (staticroot[i] != 0x42)
+      return -1;
+  }
+  return 0;
+}
diff -r 8efcb4b03d45 boehm-gc/testsuite/config/default.exp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/boehm-gc/testsuite/config/default.exp	Sun Mar 20 21:37:14 2011 +0100
@@ -0,0 +1,1 @@
+load_lib "standard.exp"
diff -r 8efcb4b03d45 boehm-gc/testsuite/lib/boehm-gc.exp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/boehm-gc/testsuite/lib/boehm-gc.exp	Sun Mar 20 21:37:14 2011 +0100
@@ -0,0 +1,334 @@
+# Copyright (C) 2011 Free Software Foundation, Inc.
+
+# 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; see the file COPYING3.  If not see
+# <http://www.gnu.org/licenses/>.
+
+proc load_gcc_lib { filename } {
+    global srcdir loaded_libs
+    load_file $srcdir/../../gcc/testsuite/lib/$filename
+    set loaded_libs($filename) ""
+}
+
+load_lib dg.exp
+load_gcc_lib target-libpath.exp
+load_gcc_lib wrapper.exp
+# Required by target-supports-dg.exp.
+load_gcc_lib target-supports.exp
+# For dg-skip-if.
+load_gcc_lib target-supports-dg.exp
+# For ${tool}_exit.
+load_gcc_lib gcc-defs.exp
+# For prune_gcc_output.
+load_gcc_lib prune.exp
+
+set dg-do-what-default run
+
+# Define boehm-gc callbacks for dg.exp.
+
+# FIXME: The next two are independent of boehm-gc; move to some library.
+proc ${tool}-dg-test-1 { target_compile prog do_what extra_tool_flags } {
+
+    # Set up the compiler flags, based on what we're going to do.
+
+    set options [list]
+    switch $do_what {
+	"compile" {
+	    set compile_type "assembly"
+	    set output_file "[file rootname [file tail $prog]].s"
+	}
+        "assemble" {
+            set compile_type "object"
+            set output_file "[file rootname [file tail $prog]].o"
+        }
+        "ltassemble" {
+	    # Needs to be different from assemble since we cannot determine
+	    # from $prog whether to produce a regular or a libtool object.
+            set compile_type "object"
+            set output_file "[file rootname [file tail $prog]].lo"
+        }
+	"link" {
+	    set compile_type "executable"
+	    # Don't add .exe extension, libtool may strip if from output file.
+	    set output_file "[file rootname [file tail $prog]]"
+	    # If we're linking a libtool object, produce a libtool library.
+	    if { [file extension $prog] == ".lo" } {
+		set output_file "lib$output_file.la"
+	    }
+	}
+	"run" {
+	    set compile_type "executable"
+	    # FIXME: "./" is to cope with "." not being in $PATH.
+	    # Should this be handled elsewhere?
+	    # YES.
+	    set output_file "./[file rootname [file tail $prog]]"
+	    # This is the only place where we care if an executable was
+	    # created or not.  If it was, dg.exp will try to run it.
+	    remote_file build delete $output_file
+	}
+	default {
+	    perror "$do_what: not a valid dg-do keyword"
+	    return ""
+	}
+    }
+
+    if { $extra_tool_flags != "" } {
+	lappend options "additional_flags=$extra_tool_flags"
+    }
+
+    set comp_output [$target_compile "$prog" "$output_file" "$compile_type" $options];
+
+    return [list $comp_output $output_file]
+}
+
+proc ${tool}-dg-test { prog do_what extra_tool_flags } {
+    global tool
+
+    return [${tool}-dg-test-1 ${tool}_target_compile $prog $do_what $extra_tool_flags]
+}
+
+proc boehm-gc-init { args } {
+    global gluefile wrap_flags
+    global srcdir
+    global blddirgc
+    global TOOL_EXECUTABLE
+    global GCC_UNDER_TEST
+    global objdir
+    global gc_include
+    global gc_lib
+    global gc_lib_conv
+    global tool
+    global tool_root_dir
+    global ld_library_path
+
+    set blddirgc [lookfor_file [get_multilibs] ${tool}]
+    verbose "blddirgc: $blddirgc"
+
+    if ![info exists GCC_UNDER_TEST] then {
+	if [info exists TOOL_EXECUTABLE] {
+	    set GCC_UNDER_TEST $TOOL_EXECUTABLE
+	} else {
+	    set GCC_UNDER_TEST "[find_gcc]"
+	}
+    }
+
+    set gccdir [lookfor_file $tool_root_dir gcc/libgcc.a]
+    if {$gccdir != ""} {
+	set gccdir [file dirname $gccdir]
+    }
+    verbose "gccdir: $gccdir"
+
+    set ld_library_path "."
+    append ld_library_path ":${gccdir}"
+
+    set compiler "${gccdir}/xgcc"
+    if { [is_remote host] == 0 && [which $compiler] != 0 } {
+	foreach i "[exec $compiler --print-multi-lib]" {
+	    set mldir ""
+	    regexp -- "\[a-z0-9=_/\.-\]*;" $i mldir
+	    set mldir [string trimright $mldir "\;@"]
+	    if { "$mldir" == "." } {
+		continue
+	    }
+	    if { [llength [glob -nocomplain ${gccdir}/${mldir}/libgcc_s*.so.*]] >= 1 } {
+		append ld_library_path ":${gccdir}/${mldir}"
+	    }
+	}
+    }
+    # Add the library path for boehm-gc.
+    append ld_library_path ":${blddirgc}/.libs"
+
+    # Add the library path for boehm-gc.lib libtool libraries.
+    append ld_library_path ":.libs"
+
+    verbose "ld_library_path: $ld_library_path"
+
+    # Point to the headers in boehm-gc.
+    set gc_include "${blddirgc}/include"
+    verbose "gc_include: $gc_include"
+
+    set gc_lib "${blddirgc}/libgcjgc.la"
+    verbose "gc_lib: $gc_lib"
+
+    set gc_lib_conv "${blddirgc}/libgcjgc_convenience.la"
+    verbose "gc_lib_conv: $gc_lib_conv"
+
+    set_ld_library_path_env_vars
+    boehm-gc_maybe_build_wrapper "${objdir}/testglue.o"
+}
+
+proc boehm-gc_target_compile { source dest type options } {
+    global gluefile wrap_flags;
+    global srcdir
+    global TOOL_OPTIONS
+    global GCC_UNDER_TEST
+    global libtool
+    global gc_include
+    global gc_lib
+    global gc_lib_conv
+    global threadcflags
+    global threadlibs
+    global extra_test_libs
+
+    if { [target_info needs_status_wrapper]!="" && [info exists gluefile] } {
+	lappend options "libs=${gluefile}"
+	lappend options "ldflags=$wrap_flags"
+    }
+
+    # TOOL_OPTIONS must come first, so that it doesn't override testcase
+    # specific options.
+    if [info exists TOOL_OPTIONS] {
+	lappend options [concat "additional_flags=$TOOL_OPTIONS" $options];
+    }
+
+    # Map type to libtool mode.
+    switch $type {
+	"object" {
+	    set mode "compile"
+	}
+	"executable" {
+	    set mode "link"
+	}
+	default {
+	    perror "$type: unhandled type"
+	    return ""
+	}
+    }
+
+    # Set this once for reuse in boehm-gc.lib/lib.exp.
+    set libtool "../libtool"
+    # We have to run silently to avoid DejaGnu lossage.
+    lappend options "compiler=$libtool --silent --tag=CC --mode=$mode \
+    	$GCC_UNDER_TEST"
+
+    lappend options "additional_flags=-I${gc_include} -I${srcdir}/../include"
+    lappend options "additional_flags=${threadcflags}"
+
+    lappend options "libs=-Wc,-shared-libgcc"
+    
+    if { [file extension $dest] == ".la" } {
+	lappend options "libs=${gc_lib_conv}"
+    } else {
+	lappend options "libs=${gc_lib}"
+    }
+    lappend options "libs=${threadlibs} ${extra_test_libs}"
+
+    verbose "options: $options"
+    return [target_compile $source $dest $type $options]
+}
+
+# Prune harmless messages.
+proc boehm-gc-dg-prune { system text } {
+    # Prune the same messages as the gcc testsuite does.
+    set text [prune_gcc_output $text]
+
+    # Ignore harmless Darwin ranlib warnings.
+    regsub -all "(^|\n)(ranlib: file: \[^\n\]* has no symbols\n?)+" $text "\\1" text
+
+    return $text
+}
+
+# Build shared library from LIB.
+proc boehm-gc-build-shlib { lib flags extra-flags } {
+    global subdir
+    global dg-do-what-default
+    global libtool
+    global gc_lib_conv
+
+    # Determine basename.
+    set basename "[file rootname [file tail $lib]]"
+    verbose "basename: $basename"
+
+    # DejaGnu 1.4.4 doesn't support nested calls to dg-test.  Restore
+    # original state before calling it again.
+    if { [info procs dg-save-unknown] != [list] } {
+	rename unknown ""
+	rename dg-save-unknown unknown
+    }
+
+    set saved-dg-do-what ${dg-do-what-default}
+
+    # Compile $lib into libtool object.
+    set dg-do-what-default ltassemble
+    dg-test -keep-output $lib $flags ${extra-flags}
+
+    # FIXME: Explain options.
+    set shopt "-version-info 1:2:0 -no-undefined -rpath /nowhere"
+
+    # There's no way to get output_file out of dg-test, only
+    # ${tool}-dg-test returns it, so hardcode that here.
+    set dg-do-what-default link
+    dg-test -keep-output $basename.lo $flags "${extra-flags} $shopt"
+
+    set dg-do-what-default ${saved-dg-do-what}
+
+    # Restore unknown, dg-save-unknown as DejaGnu 1.4.4 dg-test expects them.
+    if { [info procs dg-save-unknown] == [list] } {
+    	rename unknown dg-save-unknown
+	proc unknown {} {
+	}
+    }
+
+    remote_exec host $libtool "--mode=clean rm -f $basename.lo"
+
+    return lib$basename.la
+}
+
+# Handle dg-add-shlib.
+proc dg-add-shlib { args } {
+    global tool
+    global srcdir subdir
+    global shlib
+
+    if { [llength $args] > 2 } {
+	error "[lindex $args 0]: too many arguments"
+	return
+    }
+
+    set lib [lindex $args 1]
+    set lib "$srcdir/$subdir/$lib"
+    verbose -log "dg-add-shlib $lib"
+
+    upvar tool_flags flags
+    upvar default_extra_tool_flags extra-flags
+    # Build support library.
+    set shlib [boehm-gc-build-shlib $lib $flags ${extra-flags}]
+
+    uplevel lappend tool_flags $shlib
+}
+
+# Run boehm-gc testcases.
+proc boehm-gc-dg-runtest { testcases flags extra-flags } {
+    global runtests
+    global libtool
+    global shlib
+
+    set shlib ""
+
+    foreach testcase $testcases {
+	# If we're only testing specific files and this isn't one of them,
+	# skip it.
+	if ![runtest_file_p $runtests $testcase] {
+	    return
+	}
+
+	# Run testcase.
+	# Keep output, otherwise libtool below won't remove the corresponding
+	# file in .libs.
+	dg-test -keep-output $testcase $flags ${extra-flags}
+
+	# Remove $execname and eventually $shlib.
+	remote_exec host $libtool "--mode=clean rm -f \
+		[file rootname [file tail $testcase]] $shlib"
+    }
+}


-- 
-----------------------------------------------------------------------------
Rainer Orth, Center for Biotechnology, Bielefeld University


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]