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]

PATCH: Run V3 tests on installed compiler


This patch makes it possible to run the V3 testsuite on an installed
compiler, which us allows us to validate the bits we actually ship.

The V3 testsuite was (long ago) converted to DejaGNU from its previous
format.  Perhaps for this reason, the testsuite was not set up to work
well with installed compilers.

It is wrong for the V3 Makefiles to build anything that will be an
input to the test process, unless that thing is installed with V3.
For example, libv3test.a should not be built as part of the ordinary
build process, because it is (rightly) not installed.  Instead, these
kinds of things should be built as part of the test process, just as
we already handle things like testglue.o.

In this patch, I fixed the most important cases of this problem: the
use of the testsuite_files file, and the use of libv3test.a.  (In the
case of the former, we now generate the list of tests dynamically; in
the case of the latter, we build the objects at test-time.)  I did not
correct the handling of fr.po and de.po; these, too, should be built
at test time, with the result that LOCALEDIR should just be the
current directory.  I will work on that in the near future.

In a follow-on patch, I would like to do the following:

1. Remove check_compile, in favor of providing an option to DejaGNU to
   just generate assembly files, if people still need this
   functionality.

2. Modify check_performance to work without testsuite_files, probably
   by integrating that functionality with DejaGNU.

3. Remove libv3test.a from Makefile.am.

4. Remove all traces of create_testsuite_files, including the
   stamp_thread and stamp_wchar targets in testsuite/Makefile.am.

5. Remove stuff from configure.ac that, as a result of the above, is
   no longer required. 

Any objections?

(Minor note: libstdc++.exp uses "v3-" as a prefix for some functions;
it should really be using "libstdc++_" as that is the convention for
tool configuration files.)

Tested (in the build directory) with and without "--target_board
'unix{-32,}'" on x86_64-unknown-linux-gnu, and on an installed
compiler for both x86_64-unknown-linux-gnu and arm-none-abi.  Applied
on the mainline; will shortly be applied on the csl-arm-branch as
well.

--
Mark Mitchell
CodeSourcery, LLC
mark@codesourcery.com

2005-03-23  Mark Mitchell  <mark@codesourcery.com>

	* lib/target-supports.exp (check_iconv_available): Default
	libiconv to -liconv, if there is no definition.

2005-03-23  Mark Mitchell  <mark@codesourcery.com>

	* testsuite/lib/libstdc++.exp (libstdc++_init): Improve handling
	of compilers not in the build directory.
	(libstdc++_wchar_t): New variable.
	(libstdc++_threads): Likewise.
	(libstdc++_test_objs): Likewise.
	(v3_target_compile): Use libstdc++_test_objs.
	(v3-list-tests): Remove.
	(listdc++_build_support): New function.
	* testsuite/libstdc++-dg/normal.exp: Rework to dynamically
	generate list of tests.
	
Index: gcc/testsuite/lib/target-supports.exp
===================================================================
RCS file: /cvs/gcc/gcc/gcc/testsuite/lib/target-supports.exp,v
retrieving revision 1.44
diff -c -5 -p -r1.44 target-supports.exp
*** gcc/testsuite/lib/target-supports.exp	15 Mar 2005 18:41:19 -0000	1.44
--- gcc/testsuite/lib/target-supports.exp	23 Mar 2005 16:36:37 -0000
*************** proc check_iconv_available { test_what }
*** 301,310 ****
--- 301,314 ----
      puts $f "cd = iconv_open (\"[lindex $test_what 1]\", \"UTF-8\");\n"
      puts $f "if (cd == (iconv_t) -1)\n return 1;\n"
      puts $f "return 0;\n}"
      close $f
  
+     # If the tool configuration file has not set libiconv, try "-liconv"
+     if { ![info exists libiconv] } {
+ 	set libiconv "-liconv"
+     }
      set lines [${tool}_target_compile $src $exe executable "libs=$libiconv" ]
      file delete $src
  
      if [string match "" $lines] then {
  	# No error messages, everything is OK.
Index: libstdc++-v3/testsuite/lib/libstdc++.exp
===================================================================
RCS file: /cvs/gcc/gcc/libstdc++-v3/testsuite/lib/libstdc++.exp,v
retrieving revision 1.32
diff -c -5 -p -r1.32 libstdc++.exp
*** libstdc++-v3/testsuite/lib/libstdc++.exp	11 Feb 2005 22:40:15 -0000	1.32
--- libstdc++-v3/testsuite/lib/libstdc++.exp	23 Mar 2005 16:36:37 -0000
*************** proc libstdc++_init { testfile } {
*** 132,162 ****
          set gccdir [file dirname $gccdir]
      }
      v3track gccdir 3
  
      # Compute what needs to be added to the existing LD_LIBRARY_PATH.
!     set ld_library_path ""
!     append ld_library_path ":${gccdir}"
!     set compiler ${gccdir}/g++
!     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}"
!         }
!       }
!     }
!     append ld_library_path ":${blddir}/src/.libs"
! 
!     set_ld_library_path_env_vars
!     if [info exists env(LD_LIBRARY_PATH)] {
!       verbose -log "LD_LIBRARY_PATH = $env(LD_LIBRARY_PATH)"
      }
  
      # Do a bunch of handstands and backflips for cross compiling and
      # finding simulators...
      if [is_remote host] {
--- 132,167 ----
          set gccdir [file dirname $gccdir]
      }
      v3track gccdir 3
  
      # Compute what needs to be added to the existing LD_LIBRARY_PATH.
!     if {$gccdir != ""} {
! 	set ld_library_path ""
! 	append ld_library_path ":${gccdir}"
! 	set compiler ${gccdir}/g++
! 	append ld_library_path ":${blddir}/src/.libs"
! 
! 	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}"
! 	    }
! 	  }
! 	}
! 
! 	set_ld_library_path_env_vars
! 	if [info exists env(LD_LIBRARY_PATH)] {
! 	  verbose -log "LD_LIBRARY_PATH = $env(LD_LIBRARY_PATH)"
! 	}
!     } else {
! 	set compiler [transform "g++"]
      }
  
      # Do a bunch of handstands and backflips for cross compiling and
      # finding simulators...
      if [is_remote host] {
*************** proc libstdc++_init { testfile } {
*** 174,184 ****
              set cxx [exec sh $flags_file --build-cxx]
              set cxxflags [exec sh $flags_file --cxxflags]
              set includes [exec sh $flags_file --build-includes]
          } else {
              set cxx [transform "g++"]
!             set cxxflags "-ggdb3"
              set includes "-I${srcdir}"
          }
      }
  
      libstdc++_maybe_build_wrapper "${objdir}/testglue.o"
--- 179,189 ----
              set cxx [exec sh $flags_file --build-cxx]
              set cxxflags [exec sh $flags_file --cxxflags]
              set includes [exec sh $flags_file --build-includes]
          } else {
              set cxx [transform "g++"]
!             set cxxflags "-g -O2 -D_GLIBCXX_ASSERT -fmessage-length=0" 
              set includes "-I${srcdir}"
          }
      }
  
      libstdc++_maybe_build_wrapper "${objdir}/testglue.o"
*************** proc libstdc++-dg-test { prog do_what ex
*** 240,258 ****
--- 245,273 ----
      set comp_output [ prune_g++_output $comp_output ];
  
      return [list $comp_output $output_file]
  }
  
+ # True if the library supports wchar_t.
+ set libstdc++_wchar_t 0
+ 
+ # True if the library supports threads.
+ set libstdc++_threads 0
+ 
+ # A string naming object files to be linked into all tests.
+ set libstdc++_test_objs ""
+ 
  # Called from libstdc++-dg-test above.  Calls back into system's
  # target_compile to actually do the work.
  proc v3_target_compile { source dest type options } {
      global gluefile 
      global wrap_flags
      global cxx
      global cxxflags
      global includes
      global blddir
+     global libstdc++_test_objs
  
      if { [target_info needs_status_wrapper] != "" && [info exists gluefile] } {
          lappend options "libs=${gluefile}"
          lappend options "ldflags=${wrap_flags}"
      }
*************** proc v3_target_compile { source dest typ
*** 260,303 ****
      set cxx_final $cxx
      set cxxlibglossflags  [libgloss_link_flags]
      set cxx_final [concat $cxx_final $cxxlibglossflags]
      set cxx_final [concat $cxx_final $cxxflags]
      set cxx_final [concat $cxx_final $includes]
  
      lappend options "compiler=$cxx_final"
  
-     # Picks up the freshly-built testsuite library corresponding to the
-     # multilib under test.
-     lappend options "ldflags=-L${blddir}/testsuite"
-     lappend options "libs=-lv3test"
- 
      return [target_compile $source $dest $type $options]
  }
  
! 
! # Called once, from libstdc++/normal.exp.
! proc v3-list-tests { filename } {
      global srcdir
!     global blddir
! 
!     set tests_file "${blddir}/testsuite/${filename}"
!     set sfiles ""
! 
!     verbose -log "In v3-list-tests"
!     verbose -log "blddir = ${blddir}"
!     verbose -log "tests_file = $tests_file"
! 
!     # If there is a testsuite_file, use it. 
!     if { [file exists $tests_file] } {
!         set f [open $tests_file]
!         while { ! [eof $f] } {
!             set t [gets $f]
!             if { [string length "$t"] != 0 } {
!                 lappend sfiles  ${srcdir}/${t}
!             }
!         } 
!         close $f
!     } else {
!         verbose "cannot open $tests_file"
      }
-     return $sfiles
  }
--- 275,332 ----
      set cxx_final $cxx
      set cxxlibglossflags  [libgloss_link_flags]
      set cxx_final [concat $cxx_final $cxxlibglossflags]
      set cxx_final [concat $cxx_final $cxxflags]
      set cxx_final [concat $cxx_final $includes]
+     # Link the support objects into executables.
+     if { $type == "executable" } {
+ 	set cxx_final [concat $cxx_final ${libstdc++_test_objs}]
+     }
  
      lappend options "compiler=$cxx_final"
  
      return [target_compile $source $dest $type $options]
  }
  
! # Build the support objects linked in with the libstdc++ tests.  In
! # addition, set libstdc++_wchar_t, libstdc++_threads, and libstdc++_test_objs
! # appropriately.
! proc libstdc++_build_support {} {
      global srcdir
!     global libstdc++_wchar_t
!     global libstdc++_threads
!     global libstdc++_test_objs
! 
!     # Figure out whether or not the library supports certain features.
!     set libstdc++_wchar_t 0
!     set libstdc++_threads 0
!     set libstdc++_test_objs ""
! 
!     set config_src "config.cc"
!     set f [open $config_src "w"]
!     puts $f "#include <bits/c++config.h>"
!     close $f
!     set preprocessed [v3_target_compile $config_src "" \
! 	    	       preprocess "additional_flags=-dN"]
!     foreach l $preprocessed {
! 	if { [string first "_GLIBCXX_USE_WCHAR_T" $l] != -1 } {
! 	    verbose -log "wchar_t support detected"
! 	    set libstdc++_wchar_t 1
! 	} elseif { [string first "_GLIBCXX_HAVE_GTHR_DEFAULT" $l] != -1 } {
! 	    verbose -log "thread support detected"
! 	    set libstdc++_threads 1
! 	}
!     }
! 
!     # Build the support objects.
!     set source_files \
! 	[list testsuite_abi.cc testsuite_allocator.cc testsuite_hooks.cc]
!     foreach f $source_files {
! 	set object_file [file rootname $f].o
! 	if { [v3_target_compile $srcdir/$f $object_file "object" \
!                "incdir=$srcdir"] 
! 	     != "" } {
! 	    error "could not compile $f"
! 	}
! 	append libstdc++_test_objs "$object_file "
      }
  }
Index: libstdc++-v3/testsuite/libstdc++-dg/normal.exp
===================================================================
RCS file: /cvs/gcc/gcc/libstdc++-v3/testsuite/libstdc++-dg/normal.exp,v
retrieving revision 1.4
diff -c -5 -p -r1.4 normal.exp
*** libstdc++-v3/testsuite/libstdc++-dg/normal.exp	27 Feb 2004 22:01:32 -0000	1.4
--- libstdc++-v3/testsuite/libstdc++-dg/normal.exp	23 Mar 2005 16:36:37 -0000
***************
*** 19,30 ****
  # libstdc++-v3 testsuite that uses the 'dg.exp' driver.
  
  # Initialization.
  dg-init
  
  # Main loop.
  global DEFAULT_CXXFLAGS
! dg-runtest [v3-list-tests testsuite_files] "" $DEFAULT_CXXFLAGS
! #dg-runtest [v3-list-tests testsuite_files_interactive] "" $DEFAULT_CXXFLAGS
  
  # All done.
  dg-finish
--- 19,67 ----
  # libstdc++-v3 testsuite that uses the 'dg.exp' driver.
  
  # Initialization.
  dg-init
  
+ # Build the support objects.
+ libstdc++_build_support
+ 
+ # Find directories that might have tests.
+ set subdirs [glob "$srcdir/\[0-9\]\[0-9\]*"]
+ foreach d [glob "$srcdir/\[a-z\]*"] {
+     if {[file isdirectory $d]} { 
+ 	lappend subdirs $d
+     }
+ }
+ 
+ # Find all the tests.
+ set tests [list]
+ foreach s $subdirs {
+     set subdir_tests [find $s *.cc]
+     # Filter out tests that should not be run.
+     foreach t $subdir_tests {
+ 	# The DejaGNU "find" procedure sometimes returns a list 
+ 	# containing an empty string, when it should realy return
+ 	# an empty list.
+ 	if { $t == "" } {
+ 	    continue
+ 	}
+ 	# Filter out:
+ 	# 1. interactive tests.
+ 	# 2. performance tests.
+ 	# 3. wchar_t tests, if not supported.
+ 	# 4. thread tests, if not supported. 
+ 	if { [string first _xin $t] == -1
+ 	     && [string first performance $t] == -1
+ 	     && (${libstdc++_wchar_t} || [string first wchar_t $t] == -1) 
+              && (${libstdc++_threads} || [string first thread $t] == -1) } {
+ 	    lappend tests $t
+ 	}
+     }
+ }
+ set tests [lsort $tests]
+ 
  # Main loop.
  global DEFAULT_CXXFLAGS
! dg-runtest $tests "" $DEFAULT_CXXFLAGS
  
  # All done.
  dg-finish


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