Allow combining -Cprofile-generate and -Cpanic=unwind when targeting
MSVC. The LLVM limitation that previously prevented this has been fixed in LLVM 9 which is older than the oldest LLVM version we currently support. See https://github.com/rust-lang/rust/issues/61002.
This commit is contained in:
parent
8df945c471
commit
d56c02d7e9
8 changed files with 2 additions and 81 deletions
|
@ -1,7 +1,7 @@
|
||||||
use crate::cgu_reuse_tracker::CguReuseTracker;
|
use crate::cgu_reuse_tracker::CguReuseTracker;
|
||||||
use crate::code_stats::CodeStats;
|
use crate::code_stats::CodeStats;
|
||||||
pub use crate::code_stats::{DataTypeKind, FieldInfo, SizeKind, VariantInfo};
|
pub use crate::code_stats::{DataTypeKind, FieldInfo, SizeKind, VariantInfo};
|
||||||
use crate::config::{self, CrateType, OutputType, PrintRequest, SwitchWithOptPath};
|
use crate::config::{self, CrateType, OutputType, SwitchWithOptPath};
|
||||||
use crate::filesearch;
|
use crate::filesearch;
|
||||||
use crate::lint::{self, LintId};
|
use crate::lint::{self, LintId};
|
||||||
use crate::parse::ParseSess;
|
use crate::parse::ParseSess;
|
||||||
|
@ -1440,25 +1440,6 @@ fn validate_commandline_args_with_session_available(sess: &Session) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// PGO does not work reliably with panic=unwind on Windows. Let's make it
|
|
||||||
// an error to combine the two for now. It always runs into an assertions
|
|
||||||
// if LLVM is built with assertions, but without assertions it sometimes
|
|
||||||
// does not crash and will probably generate a corrupted binary.
|
|
||||||
// We should only display this error if we're actually going to run PGO.
|
|
||||||
// If we're just supposed to print out some data, don't show the error (#61002).
|
|
||||||
if sess.opts.cg.profile_generate.enabled()
|
|
||||||
&& sess.target.is_like_msvc
|
|
||||||
&& sess.panic_strategy() == PanicStrategy::Unwind
|
|
||||||
&& sess.opts.prints.iter().all(|&p| p == PrintRequest::NativeStaticLibs)
|
|
||||||
{
|
|
||||||
sess.err(
|
|
||||||
"Profile-guided optimization does not yet work in conjunction \
|
|
||||||
with `-Cpanic=unwind` on Windows when targeting MSVC. \
|
|
||||||
See issue #61002 <https://github.com/rust-lang/rust/issues/61002> \
|
|
||||||
for more information.",
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Sanitizers can only be used on platforms that we know have working sanitizer codegen.
|
// Sanitizers can only be used on platforms that we know have working sanitizer codegen.
|
||||||
let supported_sanitizers = sess.target.options.supported_sanitizers;
|
let supported_sanitizers = sess.target.options.supported_sanitizers;
|
||||||
let unsupported_sanitizers = sess.opts.debugging_opts.sanitizer - supported_sanitizers;
|
let unsupported_sanitizers = sess.opts.debugging_opts.sanitizer - supported_sanitizers;
|
||||||
|
|
|
@ -1,8 +1,7 @@
|
||||||
// Test that `-Cprofile-generate` creates expected instrumentation artifacts in LLVM IR.
|
// Test that `-Cprofile-generate` creates expected instrumentation artifacts in LLVM IR.
|
||||||
// Compiling with `-Cpanic=abort` because PGO+unwinding isn't supported on all platforms.
|
|
||||||
|
|
||||||
// needs-profiler-support
|
// needs-profiler-support
|
||||||
// compile-flags: -Cprofile-generate -Ccodegen-units=1 -Cpanic=abort
|
// compile-flags: -Cprofile-generate -Ccodegen-units=1
|
||||||
|
|
||||||
// CHECK: @__llvm_profile_raw_version =
|
// CHECK: @__llvm_profile_raw_version =
|
||||||
// CHECK-DAG: @__profc_{{.*}}pgo_instrumentation{{.*}}some_function{{.*}} = {{.*}}global
|
// CHECK-DAG: @__profc_{{.*}}pgo_instrumentation{{.*}}some_function{{.*}} = {{.*}}global
|
||||||
|
|
|
@ -6,19 +6,6 @@
|
||||||
|
|
||||||
-include ../tools.mk
|
-include ../tools.mk
|
||||||
|
|
||||||
# This test makes sure that instrumented binaries record the right counts for
|
|
||||||
# functions being called and branches being taken. We run an instrumented binary
|
|
||||||
# with an argument that causes a know path through the program and then check
|
|
||||||
# that the expected counts get added to the use-phase LLVM IR.
|
|
||||||
|
|
||||||
# LLVM doesn't support instrumenting binaries that use SEH:
|
|
||||||
# https://github.com/rust-lang/rust/issues/61002
|
|
||||||
#
|
|
||||||
# Things work fine with -Cpanic=abort though.
|
|
||||||
ifdef IS_MSVC
|
|
||||||
COMMON_FLAGS=-Cpanic=abort
|
|
||||||
endif
|
|
||||||
|
|
||||||
# For some very small programs GNU ld seems to not properly handle
|
# For some very small programs GNU ld seems to not properly handle
|
||||||
# instrumentation sections correctly. Neither Gold nor LLD have that problem.
|
# instrumentation sections correctly. Neither Gold nor LLD have that problem.
|
||||||
ifeq ($(UNAME),Linux)
|
ifeq ($(UNAME),Linux)
|
||||||
|
|
|
@ -8,14 +8,6 @@
|
||||||
|
|
||||||
COMPILE_FLAGS=-Copt-level=3 -Clto=fat -Cprofile-generate="$(TMPDIR)"
|
COMPILE_FLAGS=-Copt-level=3 -Clto=fat -Cprofile-generate="$(TMPDIR)"
|
||||||
|
|
||||||
# LLVM doesn't yet support instrumenting binaries that use unwinding on MSVC:
|
|
||||||
# https://github.com/rust-lang/rust/issues/61002
|
|
||||||
#
|
|
||||||
# Things work fine with -Cpanic=abort though.
|
|
||||||
ifdef IS_MSVC
|
|
||||||
COMPILE_FLAGS+= -Cpanic=abort
|
|
||||||
endif
|
|
||||||
|
|
||||||
all:
|
all:
|
||||||
$(RUSTC) $(COMPILE_FLAGS) test.rs
|
$(RUSTC) $(COMPILE_FLAGS) test.rs
|
||||||
$(call RUN,test) || exit 1
|
$(call RUN,test) || exit 1
|
||||||
|
|
|
@ -4,14 +4,6 @@
|
||||||
|
|
||||||
COMPILE_FLAGS=-O -Ccodegen-units=1 -Cprofile-generate="$(TMPDIR)"
|
COMPILE_FLAGS=-O -Ccodegen-units=1 -Cprofile-generate="$(TMPDIR)"
|
||||||
|
|
||||||
# LLVM doesn't yet support instrumenting binaries that use unwinding on MSVC:
|
|
||||||
# https://github.com/rust-lang/rust/issues/61002
|
|
||||||
#
|
|
||||||
# Things work fine with -Cpanic=abort though.
|
|
||||||
ifdef IS_MSVC
|
|
||||||
COMPILE_FLAGS+= -Cpanic=abort
|
|
||||||
endif
|
|
||||||
|
|
||||||
all:
|
all:
|
||||||
$(RUSTC) $(COMPILE_FLAGS) --emit=llvm-ir test.rs
|
$(RUSTC) $(COMPILE_FLAGS) --emit=llvm-ir test.rs
|
||||||
# We expect symbols starting with "__llvm_profile_".
|
# We expect symbols starting with "__llvm_profile_".
|
||||||
|
|
|
@ -8,14 +8,6 @@
|
||||||
|
|
||||||
COMPILE_FLAGS=-g -Cprofile-generate="$(TMPDIR)"
|
COMPILE_FLAGS=-g -Cprofile-generate="$(TMPDIR)"
|
||||||
|
|
||||||
# LLVM doesn't yet support instrumenting binaries that use unwinding on MSVC:
|
|
||||||
# https://github.com/rust-lang/rust/issues/61002
|
|
||||||
#
|
|
||||||
# Things work fine with -Cpanic=abort though.
|
|
||||||
ifdef IS_MSVC
|
|
||||||
COMPILE_FLAGS+= -Cpanic=abort
|
|
||||||
endif
|
|
||||||
|
|
||||||
all:
|
all:
|
||||||
$(RUSTC) $(COMPILE_FLAGS) test.rs
|
$(RUSTC) $(COMPILE_FLAGS) test.rs
|
||||||
$(call RUN,test) || exit 1
|
$(call RUN,test) || exit 1
|
||||||
|
|
|
@ -6,20 +6,6 @@
|
||||||
|
|
||||||
-include ../tools.mk
|
-include ../tools.mk
|
||||||
|
|
||||||
# This test makes sure that indirect call promotion is performed. The test
|
|
||||||
# programs calls the same function a thousand times through a function pointer.
|
|
||||||
# Only PGO data provides the information that it actually always is the same
|
|
||||||
# function. We verify that the indirect call promotion pass inserts a check
|
|
||||||
# whether it can make a direct call instead of the indirect call.
|
|
||||||
|
|
||||||
# LLVM doesn't support instrumenting binaries that use SEH:
|
|
||||||
# https://github.com/rust-lang/rust/issues/61002
|
|
||||||
#
|
|
||||||
# Things work fine with -Cpanic=abort though.
|
|
||||||
ifdef IS_MSVC
|
|
||||||
COMMON_FLAGS=-Cpanic=abort
|
|
||||||
endif
|
|
||||||
|
|
||||||
all:
|
all:
|
||||||
# We don't compile `opaque` with either optimizations or instrumentation.
|
# We don't compile `opaque` with either optimizations or instrumentation.
|
||||||
# We don't compile `opaque` with either optimizations or instrumentation.
|
# We don't compile `opaque` with either optimizations or instrumentation.
|
||||||
|
|
|
@ -18,14 +18,6 @@
|
||||||
|
|
||||||
COMMON_FLAGS=-Copt-level=2 -Ccodegen-units=1 -Cllvm-args=-disable-preinline
|
COMMON_FLAGS=-Copt-level=2 -Ccodegen-units=1 -Cllvm-args=-disable-preinline
|
||||||
|
|
||||||
# LLVM doesn't support instrumenting binaries that use SEH:
|
|
||||||
# https://github.com/rust-lang/rust/issues/61002
|
|
||||||
#
|
|
||||||
# Things work fine with -Cpanic=abort though.
|
|
||||||
ifdef IS_MSVC
|
|
||||||
COMMON_FLAGS+= -Cpanic=abort
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(UNAME),Darwin)
|
ifeq ($(UNAME),Darwin)
|
||||||
# macOS does not have the `tac` command, but `tail -r` does the same thing
|
# macOS does not have the `tac` command, but `tail -r` does the same thing
|
||||||
TAC := tail -r
|
TAC := tail -r
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue