2019-04-25 13:11:08 +02:00
|
|
|
# needs-profiler-support
|
|
|
|
|
|
|
|
-include ../tools.mk
|
|
|
|
|
|
|
|
# This test makes sure that PGO profiling data leads to cold functions being
|
|
|
|
# marked as `cold` and hot functions with `inlinehint`.
|
|
|
|
# The test program contains an `if` were actual execution only ever takes the
|
|
|
|
# `else` branch. Accordingly, we expect the function that is never called to
|
|
|
|
# be marked as cold.
|
|
|
|
#
|
|
|
|
# The program is compiled with `-Copt-level=s` because this setting disables
|
|
|
|
# LLVM's pre-inlining pass (i.e. a pass that does some inlining before it adds
|
|
|
|
# the profiling instrumentation). Disabling this pass leads to rather
|
|
|
|
# predictable IR which we need for this test to be stable.
|
|
|
|
|
|
|
|
COMMON_FLAGS=-Copt-level=s -Ccodegen-units=1
|
|
|
|
|
|
|
|
# LLVM doesn't support instrumenting binaries that use SEH:
|
|
|
|
# https://bugs.llvm.org/show_bug.cgi?id=41279
|
|
|
|
#
|
|
|
|
# Things work fine with -Cpanic=abort though.
|
|
|
|
ifdef IS_MSVC
|
|
|
|
COMMON_FLAGS+= -Cpanic=abort
|
|
|
|
endif
|
|
|
|
|
|
|
|
all:
|
|
|
|
# Compile the test program with instrumentation
|
|
|
|
$(RUSTC) $(COMMON_FLAGS) -Z pgo-gen="$(TMPDIR)" main.rs
|
|
|
|
# Run it in order to generate some profiling data
|
|
|
|
$(call RUN,main some-argument) || exit 1
|
|
|
|
# Postprocess the profiling data so it can be used by the compiler
|
2019-04-29 14:40:07 +02:00
|
|
|
"$(LLVM_BIN_DIR)"/llvm-profdata merge \
|
2019-04-25 13:11:08 +02:00
|
|
|
-o "$(TMPDIR)"/merged.profdata \
|
|
|
|
"$(TMPDIR)"/default_*.profraw
|
|
|
|
# Compile the test program again, making use of the profiling data
|
|
|
|
$(RUSTC) $(COMMON_FLAGS) -Z pgo-use="$(TMPDIR)"/merged.profdata --emit=llvm-ir main.rs
|
|
|
|
# Check that the generate IR contains some things that we expect
|
|
|
|
#
|
|
|
|
# We feed the file into LLVM FileCheck tool *in reverse* so that we see the
|
|
|
|
# line with the function name before the line with the function attributes.
|
|
|
|
# FileCheck only supports checking that something matches on the next line,
|
|
|
|
# but not if something matches on the previous line.
|
|
|
|
tac "$(TMPDIR)"/main.ll | "$(LLVM_FILECHECK)" filecheck-patterns.txt
|