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]

Test Objective-C more thoroughly


This patch finally updates Objective-C torture testing to iterate
over optimization and debug options just like the C tests.  As we
want our tests to do, it exposes additional problems - my last
patch fixes one set, but on GNU/Linux I see three other failures
involving protocols vs Dwarf-2 at -O3 -g, so those will show as
new regressions until I or somebody figures out the twisty little
DIEs, all alike...

Incidentally, I have a more sweeping change that consolidates
all the <lang>-torture.exp files into a shared torture.exp, but
it needs more testing before being unleashed on everybody's test
runs.

Stan

2001-12-28  Stan Shebs  <shebs@apple.com>

        * lib/objc-torture.exp: Resync with c-torture.exp.
        * lib/objc.exp: Load standard libraries.

Index: lib/objc-torture.exp
===================================================================
RCS file: /cvs/gcc/gcc/gcc/testsuite/lib/objc-torture.exp,v
retrieving revision 1.4
diff -c -3 -p -r1.4 objc-torture.exp
*** objc-torture.exp	1999/03/27 23:50:40	1.4
--- objc-torture.exp	2001/12/28 23:32:16
***************
*** 1,30 ****
! # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997 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 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, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  
  # Please email any bugs, comments, and/or additions to this file to:
! # bug-dejagnu.prep.ai.mit.edu
  
  # This file was written by Rob Savoye. (rob@cygnus.com)
  
  # The default option list can be overridden by
  # TORTURE_OPTIONS="{ { list1 } ... { listN } }"
  
  if ![info exists TORTURE_OPTIONS] {
!     # FIXME: We should test -g at least once.
!     set TORTURE_OPTIONS [list { -O }]
  }
  
  
--- 1,46 ----
! # Copyright (C) 1992-1998, 1999, 2000 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 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, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  
  # Please email any bugs, comments, and/or additions to this file to:
! # bug-dejagnu@gnu.org.
  
  # This file was written by Rob Savoye. (rob@cygnus.com)
  
+ load_lib file-format.exp
+ 
  # The default option list can be overridden by
  # TORTURE_OPTIONS="{ { list1 } ... { listN } }"
  
  if ![info exists TORTURE_OPTIONS] {
!     # It is theoretically beneficial to group all of the O2/O3 options together,
!     # as in many cases the compiler will generate identical executables for
!     # all of them--and the objc-torture testsuite will skip testing identical
!     # executables multiple times.
!     # Also note that -finline-functions is explicitly included in one of the
!     # items below, even though -O3 is also specified, because some ports may
!     # choose to disable inlining functions by default, even when optimizing.
!     set TORTURE_OPTIONS [list \
! 	{ -O0 } \
! 	{ -O1 } \
! 	{ -O2 } \
! 	{ -O3 -fomit-frame-pointer } \
! 	{ -O3 -fomit-frame-pointer -funroll-loops } \
! 	{ -O3 -fomit-frame-pointer -funroll-all-loops -finline-functions } \
! 	{ -O3 -g } \
! 	{ -Os } ]
  }
  
  
*************** foreach option $TORTURE_OPTIONS {
*** 40,46 ****
  }
  
  #
! # objc-torture-compile -- runs the Tege C-torture test
  #
  # SRC is the full pathname of the testcase.
  # OPTION is the specific compiler flag we're testing (eg: -O2).
--- 56,62 ----
  }
  
  #
! # objc-torture-compile -- runs the Tege OBJC-torture test
  #
  # SRC is the full pathname of the testcase.
  # OPTION is the specific compiler flag we're testing (eg: -O2).
*************** proc objc-torture-compile { src option }
*** 65,117 ****
  
      # Run the compiler and analyze the results.
      set options ""
!     lappend options "additional_flags=-w $option"
  
      set comp_output [objc_target_compile "$src" "$output" object $options];
!     
!     # Set a few common compiler messages.
!     set fatal_signal "*Obj-C*: Internal compiler error: program*got fatal signal"
!  
!     if [string match "$fatal_signal 6" $comp_output] then {
! 	objc_fail $testcase "Got Signal 6, $option"
! 	remote_file build delete $output
! 	return
!     }
! 
!     if [string match "$fatal_signal 11" $comp_output] then {
! 	objc_fail $testcase "Got Signal 11, $option"
! 	remote_file build delete $output
! 	return
!     }
! 
!     # We shouldn't get these because of -w, but just in case.
!     if [string match "*Obj-C*:*warning:*" $comp_output] then {
! 	warning "$testcase: (with warnings) $option"
! 	send_log "$comp_output\n"
! 	unresolved "$testcase, $option"
! 	remote_file build delete $output
! 	return
!     }
! 
!     set comp_output [prune_warnings $comp_output]
! 
!     set unsupported_message [objc_check_unsupported_p $comp_output]
!     if { $unsupported_message != "" } {
! 	unsupported "$testcase: $unsupported_message"
! 	remote_file build delete $output
! 	return
!     }
! 
!     # remove any leftover LF/CR to make sure any output is legit
!     regsub -all -- "\[\r\n\]*" $comp_output "" comp_output
!     # If any message remains, we fail.
!     if ![string match "" $comp_output] then {
! 	objc_fail $testcase $option
! 	remote_file build delete $output
! 	return
!     }
! 
!     objc_pass $testcase $option
      remote_file build delete $output
  }
  
--- 81,90 ----
  
      # Run the compiler and analyze the results.
      set options ""
!     lappend options "additional_flags=-w $option -I${srcdir}/../../libobjc"
  
      set comp_output [objc_target_compile "$src" "$output" object $options];
!     objc_check_compile $testcase $option $output $comp_output
      remote_file build delete $output
  }
  
*************** proc objc-torture-compile { src option }
*** 120,148 ****
  #
  # SRC is the full pathname of the testcase.
  #
! # If the testcase has an associated .cexp file, we source that to run the
! # test instead.  We use .cexp instead of .exp so that the testcase is still
! # controlled by the main .exp driver (this is useful when one wants to only
! # run the compile.exp tests for example - one need only pass compile.exp to
! # dejagnu, and not compile.exp, foo1.exp, foo2.exp, etc.).
  #
! proc objc-torture-execute { src } {
!     global tmpdir tool srcdir output 
  
      # Check for alternate driver.
!     if [file exists [file rootname $src].cexp] {
! 	verbose "Using alternate driver [file rootname [file tail $src]].cexp" 2
  	set done_p 0
! 	catch "set done_p \[source [file rootname $src].cexp\]"
  	if { $done_p } {
  	    return
  	}
      }
!    
      # Look for a loop within the source code - if we don't find one,
      # don't pass -funroll[-all]-loops.
      global torture_with_loops torture_without_loops
!     if [expr [search_for $src "do *\[0-9\]"]+[search_for $src "end *do"]] then {
  	set option_list $torture_with_loops
      } else {
  	set option_list $torture_without_loops
--- 93,124 ----
  #
  # SRC is the full pathname of the testcase.
  #
! # If the testcase has an associated .x file, we source that to run the
! # test instead.  We use .x so that we don't lengthen the existing filename
! # to more than 14 chars.
  #
! proc objc-torture-execute { src args } {
!     global tmpdir tool srcdir output compiler_conditional_xfail_data
  
+     if { [llength $args] > 0 } {
+ 	set additional_flags [lindex $args 0];
+     } else {
+ 	set additional_flags "";
+     }
      # Check for alternate driver.
!     if [file exists [file rootname $src].x] {
! 	verbose "Using alternate driver [file rootname [file tail $src]].x" 2
  	set done_p 0
! 	catch "set done_p \[source [file rootname $src].x\]"
  	if { $done_p } {
  	    return
  	}
      }
! 
      # Look for a loop within the source code - if we don't find one,
      # don't pass -funroll[-all]-loops.
      global torture_with_loops torture_without_loops
!     if [expr [search_for $src "for*("]+[search_for $src "while*("]] then {
  	set option_list $torture_with_loops
      } else {
  	set option_list $torture_without_loops
*************** proc objc-torture-execute { src } {
*** 159,228 ****
  	set testcase "[file tail [file dirname $src]]/[file tail $src]"
      }
  
      foreach option $option_list {
! 	# torture_{compile,execute}_xfail are set by the .cexp script
  	# (if present)
  	if [info exists torture_compile_xfail] {
  	    setup_xfail $torture_compile_xfail
  	}
! 	remote_file build delete $executable
  	verbose "Testing $testcase, $option" 1
  
  	set options ""
  	lappend options "additional_flags=-w $option -I${srcdir}/../../libobjc"
! 	set comp_output [objc_target_compile "$src" "$executable" executable $options];
! 
! 	# Set a few common compiler messages.
! 	set fatal_signal "*Obj-C*: Internal compiler error: program*got fatal signal"
! 	
! 	if [string match "$fatal_signal 6" $comp_output] then {
! 	    objc_fail $testcase "Got Signal 6, $option"
! 	    remote_file build delete $executable
! 	    continue
! 	}
! 	
! 	if [string match "$fatal_signal 11" $comp_output] then {
! 	    objc_fail $testcase "Got Signal 11, $option"
! 	    remote_file build delete $executable
! 	    continue
! 	}
! 	
! 	# We shouldn't get these because of -w, but just in case.
! 	if [string match "*Obj-C*:*warning:*" $comp_output] then {
! 	    warning "$testcase: (with warnings) $option"
! 	    send_log "$comp_output\n"
! 	    unresolved "$testcase, $option"
! 	    remote_file build delete $executable
! 	    continue
  	}
! 	
! 	set comp_output [prune_warnings $comp_output]
! 	
! 	set unsupported_message [objc_check_unsupported_p $comp_output]
  
! 	if { $unsupported_message != "" } {
! 	    unsupported "$testcase: $unsupported_message"
  	    continue
- 	} elseif ![file exists $executable] {
- 	    if ![is3way] {
- 		fail "$testcase compilation, $option"
- 		untested "$testcase execution, $option"
- 		continue
- 	    } else {
- 		# FIXME: since we can't test for the existance of a remote
- 		# file without short of doing an remote file list, we assume
- 		# that since we got no output, it must have compiled.
- 		pass "$testcase compilation, $option"		
- 	    }
- 	} else {
- 	    pass "$testcase compilation, $option"
  	}
  
  	# See if this source file uses "long long" types, if it does, and
  	# no_long_long is set, skip execution of the test.
  	if [target_info exists no_long_long] then {
! 	    if [expr [search_for $src "integer\*8"]] then {
! 		untested "$testcase execution, $option"
  		continue
  	    }
  	}
--- 135,182 ----
  	set testcase "[file tail [file dirname $src]]/[file tail $src]"
      }
  
+     set count 0;
+     set oldstatus "foo";
      foreach option $option_list {
! 	if { $count > 0 } {
! 	    set oldexec $execname;
! 	}
! 	set execname "${executable}${count}";
! 	incr count;
! 
! 	# torture_{compile,execute}_xfail are set by the .x script
  	# (if present)
  	if [info exists torture_compile_xfail] {
  	    setup_xfail $torture_compile_xfail
+ 	}
+ 
+ 	# torture_execute_before_{compile,execute} can be set by the .x script
+ 	# (if present)
+ 	if [info exists torture_eval_before_compile] {
+             set ignore_me [eval $torture_eval_before_compile]
  	}
! 
! 	remote_file build delete $execname;
  	verbose "Testing $testcase, $option" 1
  
  	set options ""
  	lappend options "additional_flags=-w $option -I${srcdir}/../../libobjc"
! 	if { $additional_flags != "" } {
! 	    lappend options "additional_flags=$additional_flags";
  	}
! 	set comp_output [objc_target_compile "$src" "${execname}" executable $options];
  
! 	if ![objc_check_compile "$testcase compilation" $option $execname $comp_output] {
! 	    unresolved "$testcase execution, $option"
! 	    remote_file build delete $execname
  	    continue
  	}
  
  	# See if this source file uses "long long" types, if it does, and
  	# no_long_long is set, skip execution of the test.
  	if [target_info exists no_long_long] then {
! 	    if [expr [search_for $src "long long"]] then {
! 		unsupported "$testcase execution, $option"
  		continue
  	    }
  	}
*************** proc objc-torture-execute { src } {
*** 230,243 ****
  	if [info exists torture_execute_xfail] {
  	    setup_xfail $torture_execute_xfail
  	}
! 	
! 	set result [objc_load "$executable" "" ""]
! 	set status [lindex $result 0];
! 	set output [lindex $result 1];
!         if { $status == "pass" } {
! 	    remote_file build delete $executable
          }
  	$status "$testcase execution, $option"
      }
  }
  
--- 184,229 ----
  	if [info exists torture_execute_xfail] {
  	    setup_xfail $torture_execute_xfail
  	}
! 
! 	if [info exists torture_eval_before_execute] {
!             set ignore_me [eval $torture_eval_before_execute]
! 	}
! 
! 
! 	# Sometimes we end up creating identical executables for two
! 	# consecutive sets of different of compiler options.
! 	#
! 	# In such cases we know the result of this test will be identical
! 	# to the result of the last test.
! 	#
! 	# So in cases where the time to load and run/simulate the test
! 	# is relatively high, compare the two binaries and avoid rerunning
! 	# tests if the executables are identical.
! 	#
! 	# Do not do this for native testing since the cost to load/execute
! 	# the test is fairly small and the comparison step actually slows
! 	# the entire process down because it usually does not "hit".
! 	set skip 0;
! 	if { ![isnative] && [info exists oldexec] } {
! 	    if { [remote_file build cmp $oldexec $execname] == 0 } {
! 		set skip 1;
! 	    }
! 	}
! 	if { $skip == 0 } {
! 	    set result [objc_load "$execname" "" ""]
! 	    set status [lindex $result 0];
! 	    set output [lindex $result 1];
! 	}
!         if { $oldstatus == "pass" } {
! 	    remote_file build delete $oldexec;
          }
  	$status "$testcase execution, $option"
+ 	set oldstatus $status;
+     }
+     if [info exists status] {
+ 	if { $status == "pass" } {
+ 	    remote_file build delete $execname;
+ 	}
      }
  }
  
*************** proc objc-torture-execute { src } {
*** 247,254 ****
  proc search_for { file pattern } {
      set fd [open $file r]
      while { [gets $fd cur_line]>=0 } {
! 	set lower [string tolower $cur_line]
! 	if [regexp "$pattern" $lower] then {
  	    close $fd
  	    return 1
  	}
--- 233,239 ----
  proc search_for { file pattern } {
      set fd [open $file r]
      while { [gets $fd cur_line]>=0 } {
! 	if [string match "*$pattern*" $cur_line] then {
  	    close $fd
  	    return 1
  	}
*************** proc search_for { file pattern } {
*** 264,277 ****
  # SRC is the full pathname of the testcase, or just a file name in which case
  # we prepend $srcdir/$subdir.
  #
! # If the testcase has an associated .cexp file, we source that to run the
! # test instead.  We use .cexp instead of .exp so that the testcase is still
! # controlled by the main .exp driver (this is useful when one wants to only
! # run the compile.exp tests for example - one need only pass compile.exp to
! # dejagnu, and not compile.exp, foo1.exp, foo2.exp, etc.).
  #
  proc objc-torture { args } {
!     global srcdir subdir
  
      set src [lindex $args 0];
      if { [llength $args] > 1 } {
--- 249,260 ----
  # SRC is the full pathname of the testcase, or just a file name in which case
  # we prepend $srcdir/$subdir.
  #
! # If the testcase has an associated .x file, we source that to run the
! # test instead.  We use .x so that we don't lengthen the existing filename
! # to more than 14 chars.
  #
  proc objc-torture { args } {
!     global srcdir subdir compiler_conditional_xfail_data
  
      set src [lindex $args 0];
      if { [llength $args] > 1 } {
*************** proc objc-torture { args } {
*** 286,304 ****
      }
  
      # Check for alternate driver.
!     if [file exists [file rootname $src].cexp] {
! 	verbose "Using alternate driver [file rootname [file tail $src]].cexp" 2
  	set done_p 0
! 	catch "set done_p \[source [file rootname $src].cexp\]"
  	if { $done_p } {
  	    return
  	}
      }
!    
      # Look for a loop within the source code - if we don't find one,
      # don't pass -funroll[-all]-loops.
      global torture_with_loops torture_without_loops
!     if [expr [search_for $src "do *\[0-9\]"]+[search_for $src "end *do"]] then {
  	set option_list $torture_with_loops
      } else {
  	set option_list $torture_without_loops
--- 269,287 ----
      }
  
      # Check for alternate driver.
!     if [file exists [file rootname $src].x] {
! 	verbose "Using alternate driver [file rootname [file tail $src]].x" 2
  	set done_p 0
! 	catch "set done_p \[source [file rootname $src].x\]"
  	if { $done_p } {
  	    return
  	}
      }
! 
      # Look for a loop within the source code - if we don't find one,
      # don't pass -funroll[-all]-loops.
      global torture_with_loops torture_without_loops
!     if [expr [search_for $src "for*("]+[search_for $src "while*("]] then {
  	set option_list $torture_with_loops
      } else {
  	set option_list $torture_without_loops
*************** proc objc-torture { args } {
*** 306,314 ****
  
      # loop through all the options
      foreach option $option_list {
! 	# torture_compile_xfail is set by the .cexp script (if present)
  	if [info exists torture_compile_xfail] {
  	    setup_xfail $torture_compile_xfail
  	}
  
  	objc-torture-compile $src "$option $options"
--- 289,302 ----
  
      # loop through all the options
      foreach option $option_list {
! 	# torture_compile_xfail is set by the .x script (if present)
  	if [info exists torture_compile_xfail] {
  	    setup_xfail $torture_compile_xfail
+ 	}
+ 
+ 	# torture_execute_before_compile is set by the .x script (if present)
+ 	if [info exists torture_eval_before_compile] {
+             set ignore_me [eval $torture_eval_before_compile]
  	}
  
  	objc-torture-compile $src "$option $options"
Index: lib/objc.exp
===================================================================
RCS file: /cvs/gcc/gcc/gcc/testsuite/lib/objc.exp,v
retrieving revision 1.10
diff -c -3 -p -r1.10 objc.exp
*** objc.exp	2001/07/27 12:21:56	1.10
--- objc.exp	2001/12/28 23:32:16
***************
*** 25,30 ****
--- 25,34 ----
  # They are also used by the various testsuites to define the environment:
  # where to find stdio.h, libc.a, etc.
  
+ load_lib libgloss.exp
+ load_lib prune.exp
+ load_lib gcc-defs.exp
+ 
  #
  # OBJC_UNDER_TEST is the compiler under test.
  #


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