about summary refs log tree commit diff
path: root/src/test
diff options
context:
space:
mode:
authorJonas Schievink <jonasschievink@gmail.com>2020-11-26 13:39:09 +0100
committerGitHub <noreply@github.com>2020-11-26 13:39:09 +0100
commit0ae653a5318f4eaa9a3f319d1a622b6f2b354029 (patch)
treeee1ccbe3c67ccf329e507247083d1bb8be108e8c /src/test
parent85c11de2f2ecc9dcc1b94f550351af0cd02e96dc (diff)
parentfdbc121620704ab50bd427ff1a2bb3282ffac745 (diff)
downloadrust-0ae653a5318f4eaa9a3f319d1a622b6f2b354029.tar.gz
rust-0ae653a5318f4eaa9a3f319d1a622b6f2b354029.zip
Rollup merge of #79365 - richkadel:llvm-cov-map-version-4, r=wesleywiser
Upgrades the coverage map to Version 4

Changes the coverage map injected into binaries compiled with
`-Zinstrument-coverage` to LLVM Coverage Mapping Format, Version 4 (from
Version 3). Note, binaries compiled with this version will require LLVM
tools from at least LLVM Version 11.

r? ``@wesleywiser``
Diffstat (limited to 'src/test')
-rw-r--r--src/test/run-make-fulldeps/coverage-llvmir-base/Makefile16
-rw-r--r--src/test/run-make-fulldeps/coverage-llvmir-base/filecheck.testprog.txt5
-rw-r--r--src/test/run-make-fulldeps/coverage-reports-base/Makefile10
-rw-r--r--src/test/run-make-fulldeps/coverage-spanview-base/Makefile5
-rw-r--r--src/test/run-make-fulldeps/coverage/coverage_tools.mk7
5 files changed, 40 insertions, 3 deletions
diff --git a/src/test/run-make-fulldeps/coverage-llvmir-base/Makefile b/src/test/run-make-fulldeps/coverage-llvmir-base/Makefile
index e84642922d9..219ba15ad11 100644
--- a/src/test/run-make-fulldeps/coverage-llvmir-base/Makefile
+++ b/src/test/run-make-fulldeps/coverage-llvmir-base/Makefile
@@ -12,10 +12,12 @@ ifeq ($(UNAME),Darwin)
 	INSTR_PROF_DATA_SUFFIX=,regular,live_support
 	DATA_SECTION_PREFIX=__DATA,
 	LLVM_COV_SECTION_PREFIX=__LLVM_COV,
+	COMDAT_IF_SUPPORTED=
 else
 	INSTR_PROF_DATA_SUFFIX=
 	DATA_SECTION_PREFIX=
 	LLVM_COV_SECTION_PREFIX=
+	COMDAT_IF_SUPPORTED=, comdat
 endif
 
 ifeq ($(LINK_DEAD_CODE),yes)
@@ -29,28 +31,39 @@ ifdef IS_WINDOWS
 		-check-prefixes=CHECK,WINDOWS \
 		-DPRIVATE_GLOBAL='internal global' \
 		-DDEFINE_INTERNAL='$(DEFINE_INTERNAL)' \
+		-DCOMDAT_IF_SUPPORTED='$(COMDAT_IF_SUPPORTED)' \
 		-DINSTR_PROF_DATA='.lprfd$$M' \
 		-DINSTR_PROF_NAME='.lprfn$$M' \
 		-DINSTR_PROF_CNTS='.lprfc$$M' \
 		-DINSTR_PROF_VALS='.lprfv$$M' \
 		-DINSTR_PROF_VNODES='.lprfnd$$M' \
 		-DINSTR_PROF_COVMAP='.lcovmap$$M' \
+		-DINSTR_PROF_COVFUN='.lcovfun$$M' \
 		-DINSTR_PROF_ORDERFILE='.lorderfile$$M'
 else
 	LLVM_FILECHECK_OPTIONS=\
 		-check-prefixes=CHECK \
 		-DPRIVATE_GLOBAL='private global' \
 		-DDEFINE_INTERNAL='$(DEFINE_INTERNAL)' \
+		-DCOMDAT_IF_SUPPORTED='$(COMDAT_IF_SUPPORTED)' \
 		-DINSTR_PROF_DATA='$(DATA_SECTION_PREFIX)__llvm_prf_data$(INSTR_PROF_DATA_SUFFIX)' \
 		-DINSTR_PROF_NAME='$(DATA_SECTION_PREFIX)__llvm_prf_names' \
 		-DINSTR_PROF_CNTS='$(DATA_SECTION_PREFIX)__llvm_prf_cnts' \
 		-DINSTR_PROF_VALS='$(DATA_SECTION_PREFIX)__llvm_prf_vals' \
 		-DINSTR_PROF_VNODES='$(DATA_SECTION_PREFIX)__llvm_prf_vnds' \
 		-DINSTR_PROF_COVMAP='$(LLVM_COV_SECTION_PREFIX)__llvm_covmap' \
+		-DINSTR_PROF_COVFUN='$(LLVM_COV_SECTION_PREFIX)__llvm_covfun' \
 		-DINSTR_PROF_ORDERFILE='$(DATA_SECTION_PREFIX)__llvm_orderfile'
 endif
 
+ifeq ($(LLVM_VERSION_11_PLUS),true)
+all: test_llvm_ir
+else
+$(info Rust option `-Z instrument-coverage` requires LLVM 11 or higher. Test skipped.)
 all:
+endif
+
+test_llvm_ir:
 	# Compile the test program with non-experimental coverage instrumentation, and generate LLVM IR
 	#
 	# Note: `-Clink-dead-code=no` disables the option, needed because the option is automatically
@@ -62,4 +75,5 @@ all:
 			-Clink-dead-code=$(LINK_DEAD_CODE) \
 			--emit=llvm-ir
 
-	cat "$(TMPDIR)"/testprog.ll | "$(LLVM_FILECHECK)" $(BASEDIR)/filecheck.testprog.txt $(LLVM_FILECHECK_OPTIONS)
+	cat "$(TMPDIR)"/testprog.ll | \
+			"$(LLVM_FILECHECK)" $(BASEDIR)/filecheck.testprog.txt $(LLVM_FILECHECK_OPTIONS)
diff --git a/src/test/run-make-fulldeps/coverage-llvmir-base/filecheck.testprog.txt b/src/test/run-make-fulldeps/coverage-llvmir-base/filecheck.testprog.txt
index bd2a2475d9e..a312ec48e84 100644
--- a/src/test/run-make-fulldeps/coverage-llvmir-base/filecheck.testprog.txt
+++ b/src/test/run-make-fulldeps/coverage-llvmir-base/filecheck.testprog.txt
@@ -3,7 +3,10 @@
 
 WINDOWS:      $__llvm_profile_runtime_user = comdat any
 
-CHECK:        @__llvm_coverage_mapping = internal constant
+CHECK:        @__covrec_{{[A-F0-9]+}}u = linkonce_odr hidden constant
+CHECK-SAME:   section "[[INSTR_PROF_COVFUN]]"[[COMDAT_IF_SUPPORTED]], align 8
+
+CHECK:        @__llvm_coverage_mapping = private constant
 CHECK-SAME:   section "[[INSTR_PROF_COVMAP]]", align 8
 
 WINDOWS:      @__llvm_profile_runtime = external global i32
diff --git a/src/test/run-make-fulldeps/coverage-reports-base/Makefile b/src/test/run-make-fulldeps/coverage-reports-base/Makefile
index 1e2aa056e40..2dac8fc2225 100644
--- a/src/test/run-make-fulldeps/coverage-reports-base/Makefile
+++ b/src/test/run-make-fulldeps/coverage-reports-base/Makefile
@@ -18,7 +18,10 @@ SOURCEDIR=../coverage
 # `llvm/release_debuginfo`. Note that some CI builds disable debug assertions (by setting
 # `NO_LLVM_ASSERTIONS=1`), so it is not OK to fail the test, but `bless`ed test results cannot be
 # generated without debug assertions.
-LLVM_COV_DEBUG := $(shell "$(LLVM_BIN_DIR)"/llvm-cov show --debug 2>&1 | grep -q "Unknown command line argument '--debug'"; echo $$?)
+LLVM_COV_DEBUG := $(shell \
+		"$(LLVM_BIN_DIR)"/llvm-cov show --debug 2>&1 | \
+		grep -q "Unknown command line argument '--debug'"; \
+		echo $$?)
 ifeq ($(LLVM_COV_DEBUG), 1)
 DEBUG_FLAG=--debug
 endif
@@ -30,7 +33,12 @@ ifdef RUSTC_BLESS_TEST
 DEBUG_FLAG=--debug
 endif
 
+ifeq ($(LLVM_VERSION_11_PLUS),true)
 all: $(patsubst $(SOURCEDIR)/%.rs,%,$(wildcard $(SOURCEDIR)/*.rs))
+else
+$(info Rust option `-Z instrument-coverage` requires LLVM 11 or higher. Test skipped.)
+all:
+endif
 
 # Ensure there are no `expected` results for tests that may have been removed or renamed
 .PHONY: clear_expected_if_blessed
diff --git a/src/test/run-make-fulldeps/coverage-spanview-base/Makefile b/src/test/run-make-fulldeps/coverage-spanview-base/Makefile
index 03ef04776a0..9f9440340e0 100644
--- a/src/test/run-make-fulldeps/coverage-spanview-base/Makefile
+++ b/src/test/run-make-fulldeps/coverage-spanview-base/Makefile
@@ -24,7 +24,12 @@ For revisions in Pull Requests (PR):
 endef
 export SPANVIEW_HEADER
 
+ifeq ($(LLVM_VERSION_11_PLUS),true)
 all: $(patsubst $(SOURCEDIR)/%.rs,%,$(wildcard $(SOURCEDIR)/*.rs))
+else
+$(info Rust option `-Z instrument-coverage` requires LLVM 11 or higher. Test skipped.)
+all:
+endif
 
 # Ensure there are no `expected` results for tests that may have been removed or renamed
 .PHONY: clear_expected_if_blessed
diff --git a/src/test/run-make-fulldeps/coverage/coverage_tools.mk b/src/test/run-make-fulldeps/coverage/coverage_tools.mk
index 17f7696a8cf..99a2e0ba952 100644
--- a/src/test/run-make-fulldeps/coverage/coverage_tools.mk
+++ b/src/test/run-make-fulldeps/coverage/coverage_tools.mk
@@ -38,6 +38,13 @@ endif
 
 UNAME = $(shell uname)
 
+# Rust option `-Z instrument-coverage` uses LLVM Coverage Mapping Format version 4,
+# which requires LLVM 11 or greater.
+LLVM_VERSION_11_PLUS := $(shell \
+		LLVM_VERSION=$$("$(LLVM_BIN_DIR)"/llvm-config --version) && \
+		LLVM_VERSION_MAJOR=$${LLVM_VERSION/.*/} && \
+		[ $$LLVM_VERSION_MAJOR -ge 11 ] && echo true || echo false)
+
 # FIXME(richkadel): Can any of the features tested by `run-make-fulldeps/coverage-*` tests be tested
 # just as completely by more focused unit tests of the code logic itself, to reduce the number of
 # test result files generated and maintained, and to help identify specific test failures and root