about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2020-01-03 22:03:20 +0000
committerbors <bors@rust-lang.org>2020-01-03 22:03:20 +0000
commite845e691c988303ea54cb9de9639a8577b5a9d6b (patch)
treea7da310c2ebd20fff955193d1890595fb549f4f1
parentc5840f9d252c2f5cc16698dbf385a29c5de3ca07 (diff)
parent971aa2bd6218fb6c843db965f7da70586865171d (diff)
downloadrust-e845e691c988303ea54cb9de9639a8577b5a9d6b.tar.gz
rust-e845e691c988303ea54cb9de9639a8577b5a9d6b.zip
Auto merge of #67829 - michaelwoerister:try-to-fix-pgo-branch-weights-test, r=Mark-Simulacrum
Attempt to fix intermittent failures of pgo-branch-weights test.

This PR tries to fix the intermittent failures of the pgo-branch-weights test (https://github.com/rust-lang/rust/issues/67746). The failing instances show no `!prof` annotations in LLVM IR. One possible cause is that the instrumented binary did not record anything. This is something I've occasionally seen happen for similarly small programs when using GNU ld as linker. The linker would not properly append the instruction counter sections, leading to most counters being dropped. This PR makes the test use the Gold linker instead.

It also makes each command exit immediately on failure so we can pinpoint the failure source better, should there still be a problem.

r? @Mark-Simulacrum
-rw-r--r--src/test/run-make-fulldeps/pgo-branch-weights/Makefile30
1 files changed, 19 insertions, 11 deletions
diff --git a/src/test/run-make-fulldeps/pgo-branch-weights/Makefile b/src/test/run-make-fulldeps/pgo-branch-weights/Makefile
index edb4006313a..c13297b3a61 100644
--- a/src/test/run-make-fulldeps/pgo-branch-weights/Makefile
+++ b/src/test/run-make-fulldeps/pgo-branch-weights/Makefile
@@ -15,21 +15,29 @@ ifdef IS_MSVC
 COMMON_FLAGS=-Cpanic=abort
 endif
 
+# For some very small programs GNU ld seems to not properly handle
+# instrumentation sections correctly. Neither Gold nor LLD have that problem.
+ifeq ($(UNAME),Linux)
+ifneq (,$(findstring x86,$(TARGET)))
+COMMON_FLAGS=-Clink-args=-fuse-ld=gold
+endif
+endif
+
+
 all:
 	# We don't compile `opaque` with either optimizations or instrumentation.
-	# We don't compile `opaque` with either optimizations or instrumentation.
-	$(RUSTC) $(COMMON_FLAGS) opaque.rs
+	$(RUSTC) $(COMMON_FLAGS) opaque.rs || exit 1
 	# Compile the test program with instrumentation
-	mkdir -p "$(TMPDIR)"/prof_data_dir
+	mkdir -p "$(TMPDIR)/prof_data_dir" || exit 1
 	$(RUSTC) $(COMMON_FLAGS) interesting.rs \
-		-Cprofile-generate="$(TMPDIR)"/prof_data_dir -O -Ccodegen-units=1
-	$(RUSTC) $(COMMON_FLAGS) main.rs -Cprofile-generate="$(TMPDIR)"/prof_data_dir -O
+		-Cprofile-generate="$(TMPDIR)/prof_data_dir" -O -Ccodegen-units=1 || exit 1
+	$(RUSTC) $(COMMON_FLAGS) main.rs -Cprofile-generate="$(TMPDIR)/prof_data_dir" -O || exit 1
 	# The argument below generates to the expected branch weights
 	$(call RUN,main aaaaaaaaaaaa2bbbbbbbbbbbb2bbbbbbbbbbbbbbbbcc) || exit 1
-	"$(LLVM_BIN_DIR)"/llvm-profdata merge \
-		-o "$(TMPDIR)"/prof_data_dir/merged.profdata \
-		"$(TMPDIR)"/prof_data_dir
+	"$(LLVM_BIN_DIR)/llvm-profdata" merge \
+		-o "$(TMPDIR)/prof_data_dir/merged.profdata" \
+		"$(TMPDIR)/prof_data_dir" || exit 1
 	$(RUSTC) $(COMMON_FLAGS) interesting.rs \
-		-Cprofile-use="$(TMPDIR)"/prof_data_dir/merged.profdata -O \
-		-Ccodegen-units=1 --emit=llvm-ir
-	cat "$(TMPDIR)"/interesting.ll | "$(LLVM_FILECHECK)" filecheck-patterns.txt
+		-Cprofile-use="$(TMPDIR)/prof_data_dir/merged.profdata" -O \
+		-Ccodegen-units=1 --emit=llvm-ir || exit 1
+	cat "$(TMPDIR)/interesting.ll" | "$(LLVM_FILECHECK)" filecheck-patterns.txt