@@ -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"
new file mode 100644
@@ -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
+ }
+}
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