-
Notifications
You must be signed in to change notification settings - Fork 13k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
inject_panic_runtime(): Avoid double negation for 'any non rlib' #133300
Conversation
-Zbuild-std
work with -Cinstrument-coverage
r? compiler |
f9cc5ae
to
e728236
Compare
This PR modifies cc @jieyouxu |
I'm not very familiar with the injection of I did some playing around, and this might potentially be the more appropriate solution:
EDIT: Draft PR at #133369. |
Basically, I think the underlying problem is that because profiler_builtins is currently But I'm pretty sure that:
|
For reference, the error message was added in #79958. It looks like the real issue (profiler doesn't need core) wasn't noticed at that time. |
e728236
to
a0e5aea
Compare
-Zbuild-std
work with -Cinstrument-coverage
Your solution is clearly better than mine, and I have confirmed it works for me too. Thanks! I have now made this PR only fix the double-negation that bjorn3 pointed out. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks, you can r=me after PR CI is green (and probably update PR description).
@bors delegate+ rollup |
(I edited the magic |
By the way, in this sort of situation I would usually suggest creating a new PR rather than changing the scope of an old one, to avoid a confusing PR history. |
Will do so next time 👍 |
…iaskrgr Rollup of 6 pull requests Successful merges: - rust-lang#133300 (inject_panic_runtime(): Avoid double negation for 'any non rlib') - rust-lang#133301 (Add code example for `wrapping_neg` method for signed integers) - rust-lang#133371 (remove is_trivially_const_drop) - rust-lang#133389 (Stabilize `const_float_methods`) - rust-lang#133398 (rustdoc: do not call to_string, it's already impl Display) - rust-lang#133405 (tidy: Distinguish between two different meanings of "style file") r? `@ghost` `@rustbot` modify labels: rollup
Rollup merge of rust-lang#133300 - Enselic:build-std-instrument-coverage, r=jieyouxu inject_panic_runtime(): Avoid double negation for 'any non rlib' <details> <summary>This PR originally did more things .Click to expand to see.</summary> By not trying to inject a profiler runtime when only building an rlib. This logic already exists for the panic runtime. This makes RUSTFLAGS="-Cinstrument-coverage" cargo build -Zbuild-std=std,profiler_builtins work. Note that you probably also need `RUST_COMPILER_RT_FOR_PROFILER=$src/llvm-project/compiler-rt` in your environment. cc rust-lang#79401 # Demonstration Before this fix you get these errors: ```console $ rm -rf target ; RUST_COMPILER_RT_FOR_PROFILER=/home/martin/src/llvm-project/compiler-rt RUSTFLAGS="-Cinstrument-coverage" cargo +nightly build --release -Zbuild-std=std,profiler_builtins error: `profiler_builtins` crate (required by compiler options) is not compatible with crate attribute `#![no_core]` error[E0152]: found duplicate lang item `manually_drop` = note: first definition in `core` loaded from /home/martin/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libcore-d453bab70303062c.rlib = note: second definition in the local crate (`core`) ``` With the fix the build succeeds: ```console $ rm -rf target ; RUST_COMPILER_RT_FOR_PROFILER=/home/martin/src/llvm-project/compiler-rt RUSTFLAGS="-Cinstrument-coverage" cargo +stage1 build --release -Zbuild-std=std,profiler_builtins Finished `release` profile [optimized] target(s) in 45.57s ``` And we can check code coverage. My example program looks like this: ```rs fn main() { if std::env::args_os().nth(1) == Some("write-file".into()) { std::fs::write("hello.txt", "Hello, world!").unwrap(); } else { println!("Hello, world!"); } } ``` when the program prints to stdout: ``` $ LLVM_PROFILE_FILE=stdout.profraw ./target/release/hello-world Hello, world! ``` we can see that `fs::write()` is not being used (note the `0`'s): ```console $ /home/martin/src/rust/build/x86_64-unknown-linux-gnu/stage1/lib/rustlib/x86_64-unknown-linux-gnu/bin/llvm-profdata merge -sparse stdout.profraw -o stdout.profdata $ /home/martin/src/rust/build/x86_64-unknown-linux-gnu/stage1/lib/rustlib/x86_64-unknown-linux-gnu/bin/llvm-cov show target/release/hello-world --sources /home/martin/src/rust/build/x86_64-unknown-linux-gnu/stage1/lib/rustlib/src/rust/library/std/src/fs.rs --instr-profile stdout.profdata --color | grep -A 3 'pub fn write(&mut self, write: b ool) -> &mut Self {' 1357| 0| pub fn write(&mut self, write: bool) -> &mut Self { 1358| 0| self.0.write(write); 1359| 0| self 1360| 0| } ``` but when we print to a file: ```console $ LLVM_PROFILE_FILE=file.profraw ./target/release/hello-world write-file ``` the code coverage shows `fs::write()` as being used (note the `1`'s): ```console $ /home/martin/src/rust/build/x86_64-unknown-linux-gnu/stage1/lib/rustlib/x86_64-unknown-linux-gnu/bin/llvm-profdata merge -sparse file.profraw -o file.profdata $ /home/martin/src/rust/build/x86_64-unknown-linux-gnu/stage1/lib/rustlib/x86_64-unknown-linux-gnu/bin/llvm-cov show target/release/hello-world --sources /home/martin/src/rust/build/x86_64-unknown-linux-gnu/stage1/lib/rustlib/src/rust/library/std/src/fs.rs --instr-profile file.profdata --color | grep -A 3 'pub fn write(&mut self, write: bool) -> &mut Self {' 1357| 1| pub fn write(&mut self, write: bool) -> &mut Self { 1358| 1| self.0.write(write); 1359| 1| self 1360| 1| } ``` </summary>
…r=jieyouxu Allow injecting a profiler runtime into `#![no_core]` crates An alternative to rust-lang#133300, allowing `-Cinstrument-coverage` to be used with `-Zbuild-std`. The incompatibility between `profiler_builtins` and `#![no_core]` crates appears to have been caused by profiler_builtins depending on core, and therefore conflicting with core (or minicore). But that's a false dependency, because the profiler doesn't contain any actual Rust code. So we can just mark the profiler itself as `#![no_core]`, and remove the incompatibility error. --- For context, the error was originally added by rust-lang#79958.
…r=jieyouxu Allow injecting a profiler runtime into `#![no_core]` crates An alternative to rust-lang#133300, allowing `-Cinstrument-coverage` to be used with `-Zbuild-std`. The incompatibility between `profiler_builtins` and `#![no_core]` crates appears to have been caused by profiler_builtins depending on core, and therefore conflicting with core (or minicore). But that's a false dependency, because the profiler doesn't contain any actual Rust code. So we can just mark the profiler itself as `#![no_core]`, and remove the incompatibility error. --- For context, the error was originally added by rust-lang#79958.
This PR originally did more things .Click to expand to see.
By not trying to inject a profiler runtime when only building an rlib. This logic already exists for the panic runtime.
This makes
work. Note that you probably also need
RUST_COMPILER_RT_FOR_PROFILER=$src/llvm-project/compiler-rt
in your environment.cc #79401
Demonstration
Before this fix you get these errors:
With the fix the build succeeds:
And we can check code coverage. My example program looks like this:
when the program prints to stdout:
we can see that
fs::write()
is not being used (note the0
's):but when we print to a file:
$ LLVM_PROFILE_FILE=file.profraw ./target/release/hello-world write-file
the code coverage shows
fs::write()
as being used (note the1
's):