mirror of
https://github.com/rust-lang/rust.git
synced 2025-05-14 02:49:40 +00:00
Auto merge of #133369 - Zalathar:profiler-builtins-no-core, r=jieyouxu
Allow injecting a profiler runtime into `#![no_core]` crates An alternative to #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 #79958.
This commit is contained in:
commit
39cb3386dd
@ -233,9 +233,6 @@ metadata_prev_alloc_error_handler =
|
||||
metadata_prev_global_alloc =
|
||||
previous global allocator defined here
|
||||
|
||||
metadata_profiler_builtins_needs_core =
|
||||
`profiler_builtins` crate (required by compiler options) is not compatible with crate attribute `#![no_core]`
|
||||
|
||||
metadata_raw_dylib_no_nul =
|
||||
link name must not contain NUL characters if link kind is `raw-dylib`
|
||||
|
||||
|
@ -799,20 +799,16 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
|
||||
self.inject_dependency_if(cnum, "a panic runtime", &|data| data.needs_panic_runtime());
|
||||
}
|
||||
|
||||
fn inject_profiler_runtime(&mut self, krate: &ast::Crate) {
|
||||
if self.sess.opts.unstable_opts.no_profiler_runtime
|
||||
|| !(self.sess.instrument_coverage() || self.sess.opts.cg.profile_generate.enabled())
|
||||
{
|
||||
fn inject_profiler_runtime(&mut self) {
|
||||
let needs_profiler_runtime =
|
||||
self.sess.instrument_coverage() || self.sess.opts.cg.profile_generate.enabled();
|
||||
if !needs_profiler_runtime || self.sess.opts.unstable_opts.no_profiler_runtime {
|
||||
return;
|
||||
}
|
||||
|
||||
info!("loading profiler");
|
||||
|
||||
let name = Symbol::intern(&self.sess.opts.unstable_opts.profiler_runtime);
|
||||
if name == sym::profiler_builtins && attr::contains_name(&krate.attrs, sym::no_core) {
|
||||
self.dcx().emit_err(errors::ProfilerBuiltinsNeedsCore);
|
||||
}
|
||||
|
||||
let Some(cnum) = self.resolve_crate(name, DUMMY_SP, CrateDepKind::Implicit) else {
|
||||
return;
|
||||
};
|
||||
@ -1046,7 +1042,7 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
|
||||
|
||||
pub fn postprocess(&mut self, krate: &ast::Crate) {
|
||||
self.inject_forced_externs();
|
||||
self.inject_profiler_runtime(krate);
|
||||
self.inject_profiler_runtime();
|
||||
self.inject_allocator_crate(krate);
|
||||
self.inject_panic_runtime(krate);
|
||||
|
||||
|
@ -339,10 +339,6 @@ pub struct NoPanicStrategy {
|
||||
pub strategy: PanicStrategy,
|
||||
}
|
||||
|
||||
#[derive(Diagnostic)]
|
||||
#[diag(metadata_profiler_builtins_needs_core)]
|
||||
pub struct ProfilerBuiltinsNeedsCore;
|
||||
|
||||
#[derive(Diagnostic)]
|
||||
#[diag(metadata_not_profiler_runtime)]
|
||||
pub struct NotProfilerRuntime {
|
||||
|
@ -235,8 +235,6 @@ name = "profiler_builtins"
|
||||
version = "0.0.0"
|
||||
dependencies = [
|
||||
"cc",
|
||||
"compiler_builtins",
|
||||
"core",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
@ -9,8 +9,6 @@ bench = false
|
||||
doc = false
|
||||
|
||||
[dependencies]
|
||||
core = { path = "../core" }
|
||||
compiler_builtins = { version = "0.1.0", features = ['rustc-dep-of-std'] }
|
||||
|
||||
[build-dependencies]
|
||||
cc = "1.2"
|
||||
|
@ -1,11 +1,15 @@
|
||||
#![no_std]
|
||||
// tidy-alphabetical-start
|
||||
#![allow(internal_features)]
|
||||
#![feature(no_core)]
|
||||
#![feature(profiler_runtime)]
|
||||
#![feature(staged_api)]
|
||||
// tidy-alphabetical-end
|
||||
|
||||
// Other attributes:
|
||||
#![no_core]
|
||||
#![profiler_runtime]
|
||||
#![unstable(
|
||||
feature = "profiler_runtime_lib",
|
||||
reason = "internal implementation detail of rustc right now",
|
||||
issue = "none"
|
||||
)]
|
||||
#![allow(unused_features)]
|
||||
#![allow(internal_features)]
|
||||
#![feature(staged_api)]
|
||||
|
9
tests/coverage/no-core.cov-map
Normal file
9
tests/coverage/no-core.cov-map
Normal file
@ -0,0 +1,9 @@
|
||||
Function name: no_core::main
|
||||
Raw bytes (9): 0x[01, 01, 00, 01, 01, 0c, 01, 00, 0d]
|
||||
Number of files: 1
|
||||
- file 0 => global file 1
|
||||
Number of expressions: 0
|
||||
Number of file 0 mappings: 1
|
||||
- Code(Counter(0)) at (prev + 12, 1) to (start + 0, 13)
|
||||
Highest counter ID seen: c0
|
||||
|
13
tests/coverage/no-core.coverage
Normal file
13
tests/coverage/no-core.coverage
Normal file
@ -0,0 +1,13 @@
|
||||
LL| |#![feature(no_core)]
|
||||
LL| |#![no_core]
|
||||
LL| |//@ edition: 2021
|
||||
LL| |
|
||||
LL| |// Test that coverage instrumentation works for `#![no_core]` crates.
|
||||
LL| |
|
||||
LL| |// For this test, we pull in std anyway, to avoid having to set up our own
|
||||
LL| |// no-core or no-std environment. What's important is that the compiler allows
|
||||
LL| |// coverage for a crate with the `#![no_core]` annotation.
|
||||
LL| |extern crate std;
|
||||
LL| |
|
||||
LL| 1|fn main() {}
|
||||
|
12
tests/coverage/no-core.rs
Normal file
12
tests/coverage/no-core.rs
Normal file
@ -0,0 +1,12 @@
|
||||
#![feature(no_core)]
|
||||
#![no_core]
|
||||
//@ edition: 2021
|
||||
|
||||
// Test that coverage instrumentation works for `#![no_core]` crates.
|
||||
|
||||
// For this test, we pull in std anyway, to avoid having to set up our own
|
||||
// no-core or no-std environment. What's important is that the compiler allows
|
||||
// coverage for a crate with the `#![no_core]` annotation.
|
||||
extern crate std;
|
||||
|
||||
fn main() {}
|
Loading…
Reference in New Issue
Block a user