File tree 6 files changed +53
-8
lines changed
6 files changed +53
-8
lines changed Original file line number Diff line number Diff line change @@ -1285,6 +1285,18 @@ fn validate_commandline_args_with_session_available(sess: &Session) {
1285
1285
path. display( ) ) ) ;
1286
1286
}
1287
1287
}
1288
+
1289
+ // PGO does not work reliably with panic=unwind on Windows. Let's make it
1290
+ // an error to combine the two for now. It always runs into an assertions
1291
+ // if LLVM is built with assertions, but without assertions it sometimes
1292
+ // does not crash and will probably generate a corrupted binary.
1293
+ if sess. opts . debugging_opts . pgo_gen . enabled ( ) &&
1294
+ sess. target . target . options . is_like_msvc &&
1295
+ sess. panic_strategy ( ) == PanicStrategy :: Unwind {
1296
+ sess. err ( "Profile-guided optimization does not yet work in conjunction \
1297
+ with `-Cpanic=unwind` on Windows when targeting MSVC. \
1298
+ See https://github.com/rust-lang/rust/issues/61002 for details.") ;
1299
+ }
1288
1300
}
1289
1301
1290
1302
/// Hash value constructed out of all the `-C metadata` arguments passed to the
Original file line number Diff line number Diff line change 1
1
// Test that `-Zpgo-gen` creates expected instrumentation artifacts in LLVM IR.
2
+ // Compiling with `-Cpanic=abort` because PGO+unwinding isn't supported on all platforms.
2
3
3
4
// needs-profiler-support
4
- // compile-flags: -Z pgo-gen -Ccodegen-units=1
5
+ // compile-flags: -Z pgo-gen -Ccodegen-units=1 -Cpanic=abort
5
6
6
7
// CHECK: @__llvm_profile_raw_version =
7
8
// CHECK: @__profc_{{.*}}pgo_instrumentation{{.*}}some_function{{.*}} = private global
8
9
// CHECK: @__profd_{{.*}}pgo_instrumentation{{.*}}some_function{{.*}} = private global
9
- // CHECK: @__profc_{{.*}}pgo_instrumentation{{.*}}main {{.*}} = private global
10
- // CHECK: @__profd_{{.*}}pgo_instrumentation{{.*}}main {{.*}} = private global
10
+ // CHECK: @__profc_{{.*}}pgo_instrumentation{{.*}}some_other_function {{.*}} = private global
11
+ // CHECK: @__profd_{{.*}}pgo_instrumentation{{.*}}some_other_function {{.*}} = private global
11
12
// CHECK: @__llvm_profile_filename = {{.*}}"default_%m.profraw\00"{{.*}}
12
13
14
+ #![ crate_type="lib" ]
15
+
13
16
#[ inline( never) ]
14
17
fn some_function ( ) {
15
18
16
19
}
17
20
18
- fn main ( ) {
21
+ pub fn some_other_function ( ) {
19
22
some_function ( ) ;
20
23
}
Original file line number Diff line number Diff line change 2
2
3
3
-include ../tools.mk
4
4
5
+ COMPILE_FLAGS=-Copt-level =3 -Clto=fat -Z pgo-gen="$(TMPDIR ) "
6
+
7
+ # LLVM doesn't yet support instrumenting binaries that use unwinding on MSVC:
8
+ # https://github.com/rust-lang/rust/issues/61002
9
+ #
10
+ # Things work fine with -Cpanic=abort though.
11
+ ifdef IS_MSVC
12
+ COMPILE_FLAGS+ = -Cpanic=abort
13
+ endif
14
+
5
15
all :
6
- $(RUSTC ) -Copt-level=3 -Clto=fat -Z pgo-gen= " $( TMPDIR ) " test.rs
16
+ $(RUSTC ) $( COMPILE_FLAGS ) test.rs
7
17
$(call RUN,test) || exit 1
8
18
[ -e " $( TMPDIR) " /default_* .profraw ] || (echo " No .profraw file" ; exit 1)
Original file line number Diff line number Diff line change 2
2
3
3
-include ../tools.mk
4
4
5
+ COMPILE_FLAGS =-O -Ccodegen-units=1 -Z pgo-gen="$(TMPDIR ) "
6
+
7
+ # LLVM doesn't yet support instrumenting binaries that use unwinding on MSVC:
8
+ # https://github.com/rust-lang/rust/issues/61002
9
+ #
10
+ # Things work fine with -Cpanic=abort though.
11
+ ifdef IS_MSVC
12
+ COMPILE_FLAGS+ = -Cpanic=abort
13
+ endif
14
+
5
15
all :
6
- $(RUSTC ) -O -Ccodegen-units=1 -Z pgo-gen= " $( TMPDIR ) " --emit=llvm-ir test.rs
16
+ $(RUSTC ) $( COMPILE_FLAGS ) --emit=llvm-ir test.rs
7
17
# We expect symbols starting with "__llvm_profile_".
8
18
$(CGREP ) " __llvm_profile_" < $(TMPDIR ) /test.ll
9
19
# We do NOT expect the "__imp_" version of these symbols.
Original file line number Diff line number Diff line change 2
2
3
3
-include ../tools.mk
4
4
5
+ COMPILE_FLAGS =-g -Z pgo-gen="$(TMPDIR ) "
6
+
7
+ # LLVM doesn't yet support instrumenting binaries that use unwinding on MSVC:
8
+ # https://github.com/rust-lang/rust/issues/61002
9
+ #
10
+ # Things work fine with -Cpanic=abort though.
11
+ ifdef IS_MSVC
12
+ COMPILE_FLAGS+ = -Cpanic=abort
13
+ endif
14
+
5
15
all :
6
- $(RUSTC ) -g -Z pgo-gen= " $( TMPDIR ) " test.rs
16
+ $(RUSTC ) $( COMPILE_FLAGS ) test.rs
7
17
$(call RUN,test) || exit 1
8
18
[ -e " $( TMPDIR) " /default_* .profraw ] || (echo " No .profraw file" ; exit 1)
Original file line number Diff line number Diff line change 16
16
COMMON_FLAGS=-Copt-level =s -Ccodegen-units=1
17
17
18
18
# LLVM doesn't support instrumenting binaries that use SEH:
19
- # https://bugs.llvm.org/show_bug.cgi?id=41279
19
+ # https://github.com/rust-lang/rust/issues/61002
20
20
#
21
21
# Things work fine with -Cpanic=abort though.
22
22
ifdef IS_MSVC
You can’t perform that action at this time.
0 commit comments