diff mbox

[1/2,testsuite] Move non-standard parallelization support into new lib and fix flaw

Message ID 20170519063418.7836-1-daniel.santos@pobox.com
State New
Headers show

Commit Message

Daniel Santos May 19, 2017, 6:34 a.m. UTC
This fixes a flaw in my parallelization code that caused it to fail when
GCC_RUNTEST_PARALLELIZE_DIR wasn't set.  It worked fine with make -j1,
but failed with just make.

As there could be other tests that might need to do their own
paralellization, I'm moving the that code into it's own file under
gcc/testsuite/lib.

Signed-off-by: Daniel Santos <daniel.santos@pobox.com>
---
 .../gcc.target/x86_64/abi/ms-sysv/ms-sysv.exp      | 48 ++++--------
 gcc/testsuite/lib/parallelize.exp                  | 88 ++++++++++++++++++++++
 2 files changed, 103 insertions(+), 33 deletions(-)
 create mode 100644 gcc/testsuite/lib/parallelize.exp
diff mbox

Patch

diff --git a/gcc/testsuite/gcc.target/x86_64/abi/ms-sysv/ms-sysv.exp b/gcc/testsuite/gcc.target/x86_64/abi/ms-sysv/ms-sysv.exp
index e317af9bd85..77c40dbf349 100644
--- a/gcc/testsuite/gcc.target/x86_64/abi/ms-sysv/ms-sysv.exp
+++ b/gcc/testsuite/gcc.target/x86_64/abi/ms-sysv/ms-sysv.exp
@@ -30,13 +30,11 @@  if { (![istarget x86_64-*-*] && ![istarget i?86-*-*])
     return
 }
 
-global GCC_RUNTEST_PARALLELIZE_DIR
-
 load_lib gcc-dg.exp
+load_lib parallelize.exp
 
 proc runtest_ms_sysv { cflags generator_args } {
-    global GCC_UNDER_TEST HOSTCXX HOSTCXXFLAGS tmpdir srcdir subdir \
-	   parallel_dir next_test
+    global GCC_UNDER_TEST HOSTCXX HOSTCXXFLAGS tmpdir srcdir subdir
 
     set objdir "$tmpdir/ms-sysv"
     set generator "$tmpdir/ms-sysv-generate.exe"
@@ -46,22 +44,6 @@  proc runtest_ms_sysv { cflags generator_args } {
     set ms_sysv_exe "$objdir/ms-sysv.exe"
     set status 0
     set warn_flags "-Wall"
-    set this_test $next_test
-    incr next_test
-
-    # Do parallelization here
-    if [catch {set fd [open "$parallel_dir/$this_test" \
-			    [list RDWR CREAT EXCL]]} ] {
-	if { [lindex $::errorCode 1] eq "EEXIST" } then {
-	    # Another job is running this test
-	    return
-	} else {
-	    error "Failed to open $parallel_dir/$this_test: $::errorCode"
-	    set status 1
-	}
-    } else {
-      close $fd
-    }
 
     # Detect when hard frame pointers are enabled (or required) so we know not
     # to generate bp clobbers.
@@ -73,9 +55,17 @@  proc runtest_ms_sysv { cflags generator_args } {
     set descr "$subdir CFLAGS=\"$cflags\" generator_args=\"$generator_args\""
     verbose "$tmpdir: Running test $descr" 1
 
-    # Cleanup any previous test in objdir
-    file delete -force $objdir
-    file mkdir $objdir
+    set status [parallel-should-run-test]
+
+    if { $status == 1 } then {
+	return
+    }
+
+    if { $status == 0 } then {
+	# Cleanup any previous test in objdir
+	file delete -force $objdir
+	file mkdir $objdir
+    }
 
     # Build the generator (only needs to be done once).
     set src "$srcdir/$subdir/gen.cc"
@@ -148,16 +138,8 @@  proc runtest_ms_sysv { cflags generator_args } {
 }
 
 dg-init
-
-# Setup parallelization
-set next_test 0
-set parallel_dir "$env(GCC_RUNTEST_PARALLELIZE_DIR)/abi-ms-sysv"
-file mkdir "$env(GCC_RUNTEST_PARALLELIZE_DIR)"
-file mkdir "$parallel_dir"
-
-if { ![file isdirectory "$parallel_dir"] } then {
-    error "Failed to create directory $parallel_dir: $::errorCode"
-    return
+if { [parallel-init "ms2sysv"] != 0 } then {
+    return;
 }
 
 set gen_opts "-p0-5"
diff --git a/gcc/testsuite/lib/parallelize.exp b/gcc/testsuite/lib/parallelize.exp
new file mode 100644
index 00000000000..346a06f0fa0
--- /dev/null
+++ b/gcc/testsuite/lib/parallelize.exp
@@ -0,0 +1,88 @@ 
+# Functions for parallelizing tests that cannot use the standard dg-run,
+# dg-runtest or gcc-dg-runtest for some reason.
+#
+# Copyright (C) 2017 Free Software Foundation, Inc.
+# Contributed by Daniel Santos <daniel.santos@pobox.com>
+#
+# This file is part of GCC.
+#
+# GCC 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, or (at your option)
+# any later version.
+#
+# GCC 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.
+#
+# Under Section 7 of GPL version 3, you are granted additional
+# permissions described in the GCC Runtime Library Exception, version
+# 3.1, as published by the Free Software Foundation.
+#
+# You should have received a copy of the GNU General Public License and
+# a copy of the GCC Runtime Library Exception along with this program;
+# see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
+# <http://www.gnu.org/licenses/>.
+
+set is_parallel_build 0
+set parallel_next_test 0
+set parallel_dir ""
+
+# Setup parallelization directory and variables.
+#
+# Returns 0 upon success, -1 on failure.
+proc parallel-init { uid } {
+    global is_parallel_build parallel_dir parallel_parallel_next_test env
+
+    if { [info exists env(GCC_RUNTEST_PARALLELIZE_DIR) ] } {
+	set gcc_pardir "$env(GCC_RUNTEST_PARALLELIZE_DIR)"
+	set is_parallel_build 1
+	set parallel_dir "${gcc_pardir}/${uid}"
+	if [catch {file mkdir "$gcc_pardir"}] {
+	    if { [lindex $::errorCode 1] ne "EEXIST" } {
+	      error "Failed to create directory $gcc_pardir: $::errorCode"
+	      return -1
+	    }
+	}
+	if [catch {file mkdir "$parallel_dir"}] {
+	    if { [lindex $::errorCode 1] ne "EEXIST" } {
+		error "Failed to create directory $parallel_dir: $::errorCode"
+		return -1
+	    }
+	}
+    }
+    return 0
+}
+
+# Test if a test should be run on by this job or not.
+#
+# Returns:
+# 	0 if the test should be run by this job
+# 	1 if it should not,
+#	-1 upon error.
+proc parallel-should-run-test {} {
+    global is_parallel_build parallel_dir parallel_next_test
+
+    # Not a parallel build
+    if { $is_parallel_build != 1 } {
+	return 0
+    }
+
+    set this_test $parallel_next_test
+    incr parallel_next_test
+
+    if [catch {set fd [open "$parallel_dir/$this_test" \
+			    [list RDWR CREAT EXCL]]} ] {
+	if { [lindex $::errorCode 1] eq "EEXIST" } then {
+	    # Another job is running this test
+	    return 1
+	} else {
+	    error "Failed to open $parallel_dir/$this_test: $::errorCode"
+	    return -1
+	}
+    } else {
+	close $fd
+	return 0
+    }
+}