From f466e1a59fa79c36538ea0fe733a1ab98bc6e197 Mon Sep 17 00:00:00 2001 From: Nick Cameron Date: Tue, 7 Oct 2014 20:00:26 +1300 Subject: [PATCH 1/5] Add run-pass-valgrind tests Closes #16914 --- configure | 1 + mk/main.mk | 3 +++ mk/tests.mk | 24 +++++++++++++++++++----- src/compiletest/common.rs | 6 ++++++ src/compiletest/compiletest.rs | 4 +++- src/compiletest/runtest.rs | 25 +++++++++++++++++++++++-- src/libgetopts/lib.rs | 2 +- 7 files changed, 56 insertions(+), 9 deletions(-) diff --git a/configure b/configure index aced2fd64db..8604dfeaffc 100755 --- a/configure +++ b/configure @@ -906,6 +906,7 @@ do done make_dir $h/test/run-pass + make_dir $h/test/run-pass-valgrind make_dir $h/test/run-pass-fulldeps make_dir $h/test/run-fail make_dir $h/test/compile-fail diff --git a/mk/main.mk b/mk/main.mk index c43d17426b2..93fdda869c9 100644 --- a/mk/main.mk +++ b/mk/main.mk @@ -174,6 +174,8 @@ else CFG_VALGRIND_COMPILE := endif +VALGRIND_PATH :=$(CFG_VALGRIND) + ifdef CFG_ENABLE_VALGRIND $(info cfg: enabling valgrind (CFG_ENABLE_VALGRIND)) else @@ -182,6 +184,7 @@ endif ifdef CFG_BAD_VALGRIND $(info cfg: disabling valgrind due to its unreliability on this platform) CFG_VALGRIND := + VALGRIND_PATH := endif diff --git a/mk/tests.mk b/mk/tests.mk index 57f37b3450c..b9e6ab8909b 100644 --- a/mk/tests.mk +++ b/mk/tests.mk @@ -1,4 +1,4 @@ -# Copyright 2012 The Rust Project Developers. See the COPYRIGHT +# Copyright 2012-2014 The Rust Project Developers. See the COPYRIGHT # file at the top-level directory of this distribution and at # http://rust-lang.org/COPYRIGHT. # @@ -184,12 +184,12 @@ check-notidy: cleantmptestlogs cleantestlibs all check-stage2 # A slightly smaller set of tests for smoke testing. check-lite: cleantestlibs cleantmptestlogs \ $(foreach crate,$(TEST_TARGET_CRATES),check-stage2-$(crate)) \ - check-stage2-rpass \ + check-stage2-rpass check-stage2-rpass-valgrind \ check-stage2-rfail check-stage2-cfail check-stage2-rmake $(Q)$(CFG_PYTHON) $(S)src/etc/check-summary.py tmp/*.log # Only check the 'reference' tests: rpass/cfail/rfail/rmake. -check-ref: cleantestlibs cleantmptestlogs check-stage2-rpass \ +check-ref: cleantestlibs cleantmptestlogs check-stage2-rpass check-stage2-rpass-valgrind \ check-stage2-rfail check-stage2-cfail check-stage2-rmake $(Q)$(CFG_PYTHON) $(S)src/etc/check-summary.py tmp/*.log @@ -491,6 +491,8 @@ $(foreach host,$(CFG_HOST), \ RPASS_RC := $(wildcard $(S)src/test/run-pass/*.rc) RPASS_RS := $(wildcard $(S)src/test/run-pass/*.rs) +RPASS_VALGRIND_RC := $(wildcard $(S)src/test/run-pass-valgrind/*.rc) +RPASS_VALGRIND_RS := $(wildcard $(S)src/test/run-pass-valgrind/*.rs) RPASS_FULL_RC := $(wildcard $(S)src/test/run-pass-fulldeps/*.rc) RPASS_FULL_RS := $(wildcard $(S)src/test/run-pass-fulldeps/*.rs) CFAIL_FULL_RC := $(wildcard $(S)src/test/compile-fail-fulldeps/*.rc) @@ -511,6 +513,7 @@ CODEGEN_CC := $(wildcard $(S)src/test/codegen/*.cc) PERF_RS := $(wildcard $(S)src/test/bench/*.rs) RPASS_TESTS := $(RPASS_RC) $(RPASS_RS) +RPASS_VALGRIND_TESTS := $(RPASS_VALGRIND_RC) $(RPASS_VALGRIND_RS) RPASS_FULL_TESTS := $(RPASS_FULL_RC) $(RPASS_FULL_RS) CFAIL_FULL_TESTS := $(CFAIL_FULL_RC) $(CFAIL_FULL_RS) RFAIL_TESTS := $(RFAIL_RC) $(RFAIL_RS) @@ -527,6 +530,14 @@ CTEST_BUILD_BASE_rpass = run-pass CTEST_MODE_rpass = run-pass CTEST_RUNTOOL_rpass = $(CTEST_RUNTOOL) +CTEST_SRC_BASE_rpass-valgrind = run-pass-valgrind +CTEST_BUILD_BASE_rpass-valgrind = run-pass-valgrind +CTEST_MODE_rpass-valgrind = run-pass-valgrind +CTEST_RUNTOOL_rpass-valgrind = $(CTEST_RUNTOOL) +ifdef VALGRIND_PATH +CTEST_TESTARGS += --valgrind-path "$(VALGRIND_PATH)" +endif + CTEST_SRC_BASE_rpass-full = run-pass-fulldeps CTEST_BUILD_BASE_rpass-full = run-pass-fulldeps CTEST_MODE_rpass-full = run-pass @@ -622,7 +633,7 @@ TEST_SREQ$(1)_T_$(2)_H_$(3) = \ # remove directive, if present, from CFG_RUSTC_FLAGS (issue #7898). CTEST_RUSTC_FLAGS := $$(subst --cfg ndebug,,$$(CFG_RUSTC_FLAGS)) -# The tests can not be optimized while the rest of the compiler is optimized, so +# The tests cannot be optimized while the rest of the compiler is optimized, so # filter out the optimization (if any) from rustc and then figure out if we need # to be optimized CTEST_RUSTC_FLAGS := $$(subst -O,,$$(CTEST_RUSTC_FLAGS)) @@ -634,6 +645,7 @@ endif # slow things down. CTEST_RUSTC_FLAGS += -C codegen-units=1 + CTEST_COMMON_ARGS$(1)-T-$(2)-H-$(3) := \ --compile-lib-path $$(HLIB$(1)_H_$(3)) \ --run-lib-path $$(TLIB$(1)_T_$(2)_H_$(3)) \ @@ -655,6 +667,7 @@ CTEST_COMMON_ARGS$(1)-T-$(2)-H-$(3) := \ $$(CTEST_TESTARGS) CTEST_DEPS_rpass_$(1)-T-$(2)-H-$(3) = $$(RPASS_TESTS) +CTEST_DEPS_rpass-valgrind_$(1)-T-$(2)-H-$(3) = $$(RPASS_VALGRIND_TESTS) CTEST_DEPS_rpass-full_$(1)-T-$(2)-H-$(3) = $$(RPASS_FULL_TESTS) $$(CSREQ$(1)_T_$(3)_H_$(3)) $$(SREQ$(1)_T_$(2)_H_$(3)) CTEST_DEPS_cfail-full_$(1)-T-$(2)-H-$(3) = $$(CFAIL_FULL_TESTS) $$(CSREQ$(1)_T_$(3)_H_$(3)) $$(SREQ$(1)_T_$(2)_H_$(3)) CTEST_DEPS_rfail_$(1)-T-$(2)-H-$(3) = $$(RFAIL_TESTS) @@ -726,7 +739,7 @@ endif endef -CTEST_NAMES = rpass rpass-full cfail-full rfail cfail bench perf debuginfo-gdb debuginfo-lldb codegen +CTEST_NAMES = rpass rpass-valgrind rpass-full cfail-full rfail cfail bench perf debuginfo-gdb debuginfo-lldb codegen $(foreach host,$(CFG_HOST), \ $(eval $(foreach target,$(CFG_TARGET), \ @@ -895,6 +908,7 @@ TEST_GROUPS = \ $(foreach crate,$(TEST_CRATES),$(crate)) \ $(foreach crate,$(TEST_DOC_CRATES),doc-crate-$(crate)) \ rpass \ + rpass-valgrind \ rpass-full \ cfail-full \ rfail \ diff --git a/src/compiletest/common.rs b/src/compiletest/common.rs index 4c602b8e1a3..d8a0afc38e7 100644 --- a/src/compiletest/common.rs +++ b/src/compiletest/common.rs @@ -17,6 +17,7 @@ pub enum Mode { CompileFail, RunFail, RunPass, + RunPassValgrind, Pretty, DebugInfoGdb, DebugInfoLldb, @@ -29,6 +30,7 @@ impl FromStr for Mode { "compile-fail" => Some(CompileFail), "run-fail" => Some(RunFail), "run-pass" => Some(RunPass), + "run-pass-valgrind" => Some(RunPassValgrind), "pretty" => Some(Pretty), "debuginfo-lldb" => Some(DebugInfoLldb), "debuginfo-gdb" => Some(DebugInfoGdb), @@ -44,6 +46,7 @@ impl fmt::Show for Mode { CompileFail => "compile-fail", RunFail => "run-fail", RunPass => "run-pass", + RunPassValgrind => "run-pass-valgrind", Pretty => "pretty", DebugInfoGdb => "debuginfo-gdb", DebugInfoLldb => "debuginfo-lldb", @@ -70,6 +73,9 @@ pub struct Config { // The llvm binaries path pub llvm_bin_path: Option, + // The valgrind path + pub valgrind_path: Option, + // The directory containing the tests to run pub src_base: Path, diff --git a/src/compiletest/compiletest.rs b/src/compiletest/compiletest.rs index 28aaca1776b..3ac25937b38 100644 --- a/src/compiletest/compiletest.rs +++ b/src/compiletest/compiletest.rs @@ -50,13 +50,14 @@ pub fn parse_config(args: Vec ) -> Config { reqopt("", "run-lib-path", "path to target shared libraries", "PATH"), reqopt("", "rustc-path", "path to rustc to use for compiling", "PATH"), optopt("", "clang-path", "path to executable for codegen tests", "PATH"), + optopt("", "valgrind-path", "path to valgrind executable for valgrind tests", "PROGRAM"), optopt("", "llvm-bin-path", "path to directory holding llvm binaries", "DIR"), reqopt("", "src-base", "directory to scan for test files", "PATH"), reqopt("", "build-base", "directory to deposit test outputs", "PATH"), reqopt("", "aux-base", "directory to find auxiliary test files", "PATH"), reqopt("", "stage-id", "the target-stage identifier", "stageN-TARGET"), reqopt("", "mode", "which sort of compile tests to run", - "(compile-fail|run-fail|run-pass|pretty|debug-info)"), + "(compile-fail|run-fail|run-pass|run-pass-valgrind|pretty|debug-info)"), optflag("", "ignored", "run tests marked as ignored"), optopt("", "runtool", "supervisor program to run tests under \ (eg. emulator, valgrind)", "PROGRAM"), @@ -125,6 +126,7 @@ pub fn parse_config(args: Vec ) -> Config { run_lib_path: matches.opt_str("run-lib-path").unwrap(), rustc_path: opt_path(matches, "rustc-path"), clang_path: matches.opt_str("clang-path").map(|s| Path::new(s)), + valgrind_path: matches.opt_str("valgrind-path"), llvm_bin_path: matches.opt_str("llvm-bin-path").map(|s| Path::new(s)), src_base: opt_path(matches, "src-base"), build_base: opt_path(matches, "build-base"), diff --git a/src/compiletest/runtest.rs b/src/compiletest/runtest.rs index c703953ff70..6b542fed68d 100644 --- a/src/compiletest/runtest.rs +++ b/src/compiletest/runtest.rs @@ -9,7 +9,7 @@ // except according to those terms. use common::Config; -use common::{CompileFail, Pretty, RunFail, RunPass, DebugInfoGdb}; +use common::{CompileFail, Pretty, RunFail, RunPass, RunPassValgrind, DebugInfoGdb}; use common::{Codegen, DebugInfoLldb}; use errors; use header::TestProps; @@ -35,7 +35,6 @@ use std::time::Duration; use test::MetricMap; pub fn run(config: Config, testfile: String) { - match config.target.as_slice() { "arm-linux-androideabi" => { @@ -64,6 +63,7 @@ pub fn run_metrics(config: Config, testfile: String, mm: &mut MetricMap) { CompileFail => run_cfail_test(&config, &props, &testfile), RunFail => run_rfail_test(&config, &props, &testfile), RunPass => run_rpass_test(&config, &props, &testfile), + RunPassValgrind => run_valgrind_test(&config, &props, &testfile), Pretty => run_pretty_test(&config, &props, &testfile), DebugInfoGdb => run_debuginfo_gdb_test(&config, &props, &testfile), DebugInfoLldb => run_debuginfo_lldb_test(&config, &props, &testfile), @@ -164,6 +164,27 @@ fn run_rpass_test(config: &Config, props: &TestProps, testfile: &Path) { } } +fn run_valgrind_test(config: &Config, props: &TestProps, testfile: &Path) { + if config.valgrind_path.is_none() { + return run_rpass_test(config, props, testfile); + } + + let mut proc_res = compile_test(config, props, testfile); + + if !proc_res.status.success() { + fatal_proc_rec("compilation failed!", &proc_res); + } + + println!("running valgrind"); + let mut new_config = config.clone(); + new_config.runtool = new_config.valgrind_path.clone(); + proc_res = exec_compiled_test(&new_config, props, testfile); + + if !proc_res.status.success() { + fatal_proc_rec("test run failed!", &proc_res); + } +} + fn run_pretty_test(config: &Config, props: &TestProps, testfile: &Path) { if props.pp_exact.is_some() { logv(config, "testing for exact pretty-printing".to_string()); diff --git a/src/libgetopts/lib.rs b/src/libgetopts/lib.rs index 37b3458b555..aa625de9398 100644 --- a/src/libgetopts/lib.rs +++ b/src/libgetopts/lib.rs @@ -804,7 +804,7 @@ pub fn short_usage(program_name: &str, opts: &[OptGroup]) -> String { /// whitespace removed, and are only cut at whitespace boundaries. /// /// Note: Function was moved here from `std::str` because this module is the only place that -/// uses it, and because it was to specific for a general string function. +/// uses it, and because it was too specific for a general string function. /// /// #Failure: /// From edc5275563779c5d7b2239bd32f827c9cd6d65fb Mon Sep 17 00:00:00 2001 From: Nick Cameron Date: Tue, 7 Oct 2014 20:59:07 +1300 Subject: [PATCH 2/5] Move some tests to run-pass-valgrind --- .../{run-pass => run-pass-valgrind}/cleanup-auto-borrow-obj.rs | 0 src/test/{run-pass => run-pass-valgrind}/dst-dtor-1.rs | 0 src/test/{run-pass => run-pass-valgrind}/dst-dtor-2.rs | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename src/test/{run-pass => run-pass-valgrind}/cleanup-auto-borrow-obj.rs (100%) rename src/test/{run-pass => run-pass-valgrind}/dst-dtor-1.rs (100%) rename src/test/{run-pass => run-pass-valgrind}/dst-dtor-2.rs (100%) diff --git a/src/test/run-pass/cleanup-auto-borrow-obj.rs b/src/test/run-pass-valgrind/cleanup-auto-borrow-obj.rs similarity index 100% rename from src/test/run-pass/cleanup-auto-borrow-obj.rs rename to src/test/run-pass-valgrind/cleanup-auto-borrow-obj.rs diff --git a/src/test/run-pass/dst-dtor-1.rs b/src/test/run-pass-valgrind/dst-dtor-1.rs similarity index 100% rename from src/test/run-pass/dst-dtor-1.rs rename to src/test/run-pass-valgrind/dst-dtor-1.rs diff --git a/src/test/run-pass/dst-dtor-2.rs b/src/test/run-pass-valgrind/dst-dtor-2.rs similarity index 100% rename from src/test/run-pass/dst-dtor-2.rs rename to src/test/run-pass-valgrind/dst-dtor-2.rs From c562b5bd9d994c45bb6752be756c44c6d0df880b Mon Sep 17 00:00:00 2001 From: Nick Cameron Date: Wed, 8 Oct 2014 15:41:15 +1300 Subject: [PATCH 3/5] Make rpass-valgrind work with pretty --- mk/tests.mk | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/mk/tests.mk b/mk/tests.mk index b9e6ab8909b..f46064ebe82 100644 --- a/mk/tests.mk +++ b/mk/tests.mk @@ -326,7 +326,8 @@ check-stage$(1)-T-$(2)-H-$(3)-exec: \ check-stage$(1)-T-$(2)-H-$(3)-rpass-exec \ check-stage$(1)-T-$(2)-H-$(3)-rfail-exec \ check-stage$(1)-T-$(2)-H-$(3)-cfail-exec \ - check-stage$(1)-T-$(2)-H-$(3)-rpass-full-exec \ + check-stage$(1)-T-$(2)-H-$(3)-rpass-valgrind-exec \ + check-stage$(1)-T-$(2)-H-$(3)-rpass-full-exec \ check-stage$(1)-T-$(2)-H-$(3)-cfail-full-exec \ check-stage$(1)-T-$(2)-H-$(3)-rmake-exec \ check-stage$(1)-T-$(2)-H-$(3)-crates-exec \ @@ -364,6 +365,7 @@ check-stage$(1)-T-$(2)-H-$(3)-doc-exec: \ check-stage$(1)-T-$(2)-H-$(3)-pretty-exec: \ check-stage$(1)-T-$(2)-H-$(3)-pretty-rpass-exec \ + check-stage$(1)-T-$(2)-H-$(3)-pretty-rpass-valgrind-exec \ check-stage$(1)-T-$(2)-H-$(3)-pretty-rpass-full-exec \ check-stage$(1)-T-$(2)-H-$(3)-pretty-rfail-exec \ check-stage$(1)-T-$(2)-H-$(3)-pretty-bench-exec \ @@ -747,8 +749,9 @@ $(foreach host,$(CFG_HOST), \ $(eval $(foreach name,$(CTEST_NAMES), \ $(eval $(call DEF_RUN_COMPILETEST,$(stage),$(target),$(host),$(name)))))))))) -PRETTY_NAMES = pretty-rpass pretty-rpass-full pretty-rfail pretty-bench pretty-pretty +PRETTY_NAMES = pretty-rpass pretty-rpass-valgrind pretty-rpass-full pretty-rfail pretty-bench pretty-pretty PRETTY_DEPS_pretty-rpass = $(RPASS_TESTS) +PRETTY_DEPS_pretty-rpass-valgrind = $(RPASS_VALGRIND_TESTS) PRETTY_DEPS_pretty-rpass-full = $(RPASS_FULL_TESTS) PRETTY_DEPS_pretty-rfail = $(RFAIL_TESTS) PRETTY_DEPS_pretty-bench = $(BENCH_TESTS) @@ -761,6 +764,7 @@ PRETTY_DEPS$(1)_H_$(3)_pretty-rfail = PRETTY_DEPS$(1)_H_$(3)_pretty-bench = PRETTY_DEPS$(1)_H_$(3)_pretty-pretty = PRETTY_DIRNAME_pretty-rpass = run-pass +PRETTY_DIRNAME_pretty-rpass-valgrind = run-pass-valgrind PRETTY_DIRNAME_pretty-rpass-full = run-pass-fulldeps PRETTY_DIRNAME_pretty-rfail = run-fail PRETTY_DIRNAME_pretty-bench = bench @@ -923,6 +927,7 @@ TEST_GROUPS = \ $(foreach docname,$(DOCS),doc-$(docname)) \ pretty \ pretty-rpass \ + pretty-rpass-valgrind \ pretty-rpass-full \ pretty-rfail \ pretty-bench \ From 1285d4f4678e4e2082c8ebe5655ed6df157a4872 Mon Sep 17 00:00:00 2001 From: Nick Cameron Date: Wed, 8 Oct 2014 16:30:20 +1300 Subject: [PATCH 4/5] Remove support for .rc files from test.mk --- mk/tests.mk | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/mk/tests.mk b/mk/tests.mk index f46064ebe82..07e13057e36 100644 --- a/mk/tests.mk +++ b/mk/tests.mk @@ -491,17 +491,11 @@ $(foreach host,$(CFG_HOST), \ # Rules for the compiletest tests (rpass, rfail, etc.) ###################################################################### -RPASS_RC := $(wildcard $(S)src/test/run-pass/*.rc) RPASS_RS := $(wildcard $(S)src/test/run-pass/*.rs) -RPASS_VALGRIND_RC := $(wildcard $(S)src/test/run-pass-valgrind/*.rc) RPASS_VALGRIND_RS := $(wildcard $(S)src/test/run-pass-valgrind/*.rs) -RPASS_FULL_RC := $(wildcard $(S)src/test/run-pass-fulldeps/*.rc) RPASS_FULL_RS := $(wildcard $(S)src/test/run-pass-fulldeps/*.rs) -CFAIL_FULL_RC := $(wildcard $(S)src/test/compile-fail-fulldeps/*.rc) CFAIL_FULL_RS := $(wildcard $(S)src/test/compile-fail-fulldeps/*.rs) -RFAIL_RC := $(wildcard $(S)src/test/run-fail/*.rc) RFAIL_RS := $(wildcard $(S)src/test/run-fail/*.rs) -CFAIL_RC := $(wildcard $(S)src/test/compile-fail/*.rc) CFAIL_RS := $(wildcard $(S)src/test/compile-fail/*.rs) BENCH_RS := $(wildcard $(S)src/test/bench/*.rs) PRETTY_RS := $(wildcard $(S)src/test/pretty/*.rs) @@ -514,12 +508,12 @@ CODEGEN_CC := $(wildcard $(S)src/test/codegen/*.cc) # a performance monitor. PERF_RS := $(wildcard $(S)src/test/bench/*.rs) -RPASS_TESTS := $(RPASS_RC) $(RPASS_RS) -RPASS_VALGRIND_TESTS := $(RPASS_VALGRIND_RC) $(RPASS_VALGRIND_RS) -RPASS_FULL_TESTS := $(RPASS_FULL_RC) $(RPASS_FULL_RS) -CFAIL_FULL_TESTS := $(CFAIL_FULL_RC) $(CFAIL_FULL_RS) -RFAIL_TESTS := $(RFAIL_RC) $(RFAIL_RS) -CFAIL_TESTS := $(CFAIL_RC) $(CFAIL_RS) +RPASS_TESTS := $(RPASS_RS) +RPASS_VALGRIND_TESTS := $(RPASS_VALGRIND_RS) +RPASS_FULL_TESTS := $(RPASS_FULL_RS) +CFAIL_FULL_TESTS := $(CFAIL_FULL_RS) +RFAIL_TESTS := $(RFAIL_RS) +CFAIL_TESTS := $(CFAIL_RS) BENCH_TESTS := $(BENCH_RS) PERF_TESTS := $(PERF_RS) PRETTY_TESTS := $(PRETTY_RS) From 80ff1d1a107bc0b89e26c4179794573738bbb3fc Mon Sep 17 00:00:00 2001 From: Nick Cameron Date: Thu, 9 Oct 2014 12:11:37 +1300 Subject: [PATCH 5/5] Error if we should be able to Valgrind but can't --- configure | 10 +--------- mk/main.mk | 15 ++++++++------- mk/platform.mk | 14 ++++++++++++++ mk/tests.mk | 16 +++++++++++++--- src/compiletest/common.rs | 4 ++++ src/compiletest/compiletest.rs | 11 +++++++++-- src/compiletest/runtest.rs | 2 +- 7 files changed, 50 insertions(+), 22 deletions(-) diff --git a/configure b/configure index 8604dfeaffc..05bfdb3e9fd 100755 --- a/configure +++ b/configure @@ -411,6 +411,7 @@ VAL_OPTIONS="" opt valgrind 0 "run tests with valgrind (memcheck by default)" opt helgrind 0 "run tests with helgrind instead of memcheck" +opt valgrind-rpass 1 "run rpass-valgrind tests with valgrind" opt docs 1 "build documentation" opt optimize 1 "build optimized rust code" opt optimize-cxx 1 "build optimized C++ code" @@ -1236,15 +1237,6 @@ then putvar CFG_PANDOC fi -# Valgrind is only reliable on Linux. On Windows it doesn't work at all, and -# on the Mac the dynamic linker causes Valgrind to emit a huge stream of -# errors. -if [ $CFG_OSTYPE != unknown-linux-gnu ] && [ $CFG_OSTYPE != apple-darwin ] -then - CFG_BAD_VALGRIND=1 - putvar CFG_BAD_VALGRIND -fi - putvar CFG_LLVM_ROOT putvar CFG_LLVM_SRC_DIR diff --git a/mk/main.mk b/mk/main.mk index 93fdda869c9..e927f6ad468 100644 --- a/mk/main.mk +++ b/mk/main.mk @@ -174,19 +174,20 @@ else CFG_VALGRIND_COMPILE := endif -VALGRIND_PATH :=$(CFG_VALGRIND) + +ifndef CFG_DISABLE_VALGRIND_RPASS + $(info cfg: enabling valgrind run-pass tests (CFG_ENABLE_VALGRIND_RPASS)) + CFG_VALGRIND_RPASS :=$(CFG_VALGRIND) +else + CFG_VALGRIND_RPASS := +endif + ifdef CFG_ENABLE_VALGRIND $(info cfg: enabling valgrind (CFG_ENABLE_VALGRIND)) else CFG_VALGRIND := endif -ifdef CFG_BAD_VALGRIND - $(info cfg: disabling valgrind due to its unreliability on this platform) - CFG_VALGRIND := - VALGRIND_PATH := -endif - ###################################################################### # Target-and-rule "utility variables" diff --git a/mk/platform.mk b/mk/platform.mk index beefefcf5e5..9db9138d5e9 100644 --- a/mk/platform.mk +++ b/mk/platform.mk @@ -58,6 +58,20 @@ ifdef CFG_VALGRIND endif endif +# If we actually want to run Valgrind on a given platform, set this variable +define DEF_GOOD_VALGRIND + ifeq ($(OSTYPE_$(1)),unknown-linux-gnu) + GOOD_VALGRIND_$(1) = 1 + endif + ifneq (,$(filter $(OSTYPE_$(1)),darwin freebsd)) + ifeq (HOST_$(1),x86_64) + GOOD_VALGRIND_$(1) = 1 + endif + endif +endef +$(foreach t,$(CFG_TARGET),$(eval $(call DEF_GOOD_VALGRIND,$(t)))) +$(foreach t,$(CFG_TARGET),$(info cfg: good valgrind for $(t) is $(GOOD_VALGRIND_$(t)))) + ifneq ($(findstring linux,$(CFG_OSTYPE)),) ifdef CFG_PERF ifneq ($(CFG_PERF_WITH_LOGFD),) diff --git a/mk/tests.mk b/mk/tests.mk index 07e13057e36..3bbd871e5be 100644 --- a/mk/tests.mk +++ b/mk/tests.mk @@ -530,9 +530,6 @@ CTEST_SRC_BASE_rpass-valgrind = run-pass-valgrind CTEST_BUILD_BASE_rpass-valgrind = run-pass-valgrind CTEST_MODE_rpass-valgrind = run-pass-valgrind CTEST_RUNTOOL_rpass-valgrind = $(CTEST_RUNTOOL) -ifdef VALGRIND_PATH -CTEST_TESTARGS += --valgrind-path "$(VALGRIND_PATH)" -endif CTEST_SRC_BASE_rpass-full = run-pass-fulldeps CTEST_BUILD_BASE_rpass-full = run-pass-fulldeps @@ -662,6 +659,19 @@ CTEST_COMMON_ARGS$(1)-T-$(2)-H-$(3) := \ --target-rustcflags "$(RUSTC_FLAGS_$(2)) $$(CTEST_RUSTC_FLAGS) -L $$(RT_OUTPUT_DIR_$(2))" \ $$(CTEST_TESTARGS) +ifdef CFG_VALGRIND_RPASS +ifdef GOOD_VALGRIND_$(2) +$(info cfg: valgrind-path set to $(CFG_VALGRIND_RPASS)) +CTEST_COMMON_ARGS$(1)-T-$(2)-H-$(3) += --valgrind-path "$(CFG_VALGRIND_RPASS)" +endif +endif + +ifndef CFG_DISABLE_VALGRIND_RPASS +ifdef GOOD_VALGRIND_$(2) +CTEST_COMMON_ARGS$(1)-T-$(2)-H-$(3) += --force-valgrind +endif +endif + CTEST_DEPS_rpass_$(1)-T-$(2)-H-$(3) = $$(RPASS_TESTS) CTEST_DEPS_rpass-valgrind_$(1)-T-$(2)-H-$(3) = $$(RPASS_VALGRIND_TESTS) CTEST_DEPS_rpass-full_$(1)-T-$(2)-H-$(3) = $$(RPASS_FULL_TESTS) $$(CSREQ$(1)_T_$(3)_H_$(3)) $$(SREQ$(1)_T_$(2)_H_$(3)) diff --git a/src/compiletest/common.rs b/src/compiletest/common.rs index d8a0afc38e7..2c917f7aefe 100644 --- a/src/compiletest/common.rs +++ b/src/compiletest/common.rs @@ -76,6 +76,10 @@ pub struct Config { // The valgrind path pub valgrind_path: Option, + // Whether to fail if we can't run run-pass-valgrind tests under valgrind + // (or, alternatively, to silently run them like regular run-pass tests). + pub force_valgrind: bool, + // The directory containing the tests to run pub src_base: Path, diff --git a/src/compiletest/compiletest.rs b/src/compiletest/compiletest.rs index 3ac25937b38..7af25de1f6f 100644 --- a/src/compiletest/compiletest.rs +++ b/src/compiletest/compiletest.rs @@ -39,6 +39,11 @@ pub mod errors; pub fn main() { let args = os::args(); let config = parse_config(args); + + if config.valgrind_path.is_none() && config.force_valgrind { + fail!("Can't find Valgrind to run Valgrind tests"); + } + log_config(&config); run_tests(&config); } @@ -50,7 +55,8 @@ pub fn parse_config(args: Vec ) -> Config { reqopt("", "run-lib-path", "path to target shared libraries", "PATH"), reqopt("", "rustc-path", "path to rustc to use for compiling", "PATH"), optopt("", "clang-path", "path to executable for codegen tests", "PATH"), - optopt("", "valgrind-path", "path to valgrind executable for valgrind tests", "PROGRAM"), + optopt("", "valgrind-path", "path to Valgrind executable for Valgrind tests", "PROGRAM"), + optflag("", "force-valgrind", "fail if Valgrind tests cannot be run under Valgrind"), optopt("", "llvm-bin-path", "path to directory holding llvm binaries", "DIR"), reqopt("", "src-base", "directory to scan for test files", "PATH"), reqopt("", "build-base", "directory to deposit test outputs", "PATH"), @@ -127,6 +133,7 @@ pub fn parse_config(args: Vec ) -> Config { rustc_path: opt_path(matches, "rustc-path"), clang_path: matches.opt_str("clang-path").map(|s| Path::new(s)), valgrind_path: matches.opt_str("valgrind-path"), + force_valgrind: matches.opt_present("force-valgrind"), llvm_bin_path: matches.opt_str("llvm-bin-path").map(|s| Path::new(s)), src_base: opt_path(matches, "src-base"), build_base: opt_path(matches, "build-base"), @@ -164,7 +171,7 @@ pub fn parse_config(args: Vec ) -> Config { !opt_str2(matches.opt_str("adb-test-dir")).is_empty(), lldb_python_dir: matches.opt_str("lldb-python-dir"), test_shard: test::opt_shard(matches.opt_str("test-shard")), - verbose: matches.opt_present("verbose") + verbose: matches.opt_present("verbose"), } } diff --git a/src/compiletest/runtest.rs b/src/compiletest/runtest.rs index 6b542fed68d..34129dedbd8 100644 --- a/src/compiletest/runtest.rs +++ b/src/compiletest/runtest.rs @@ -166,6 +166,7 @@ fn run_rpass_test(config: &Config, props: &TestProps, testfile: &Path) { fn run_valgrind_test(config: &Config, props: &TestProps, testfile: &Path) { if config.valgrind_path.is_none() { + assert!(!config.force_valgrind); return run_rpass_test(config, props, testfile); } @@ -175,7 +176,6 @@ fn run_valgrind_test(config: &Config, props: &TestProps, testfile: &Path) { fatal_proc_rec("compilation failed!", &proc_res); } - println!("running valgrind"); let mut new_config = config.clone(); new_config.runtool = new_config.valgrind_path.clone(); proc_res = exec_compiled_test(&new_config, props, testfile);