From ef031c854da6432c86ac14c438ab96c7e349d85f Mon Sep 17 00:00:00 2001 From: Michael Goulet Date: Sun, 23 Feb 2025 23:01:04 +0000 Subject: [PATCH] Exclude global_asm from mir_keys --- compiler/rustc_mir_transform/src/lib.rs | 4 +++ .../asm/global-asm-isnt-really-a-mir-body.rs | 26 +++++++++++++++++++ tests/ui/asm/global-asm-with-error.stderr | 2 +- 3 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 tests/ui/asm/global-asm-isnt-really-a-mir-body.rs diff --git a/compiler/rustc_mir_transform/src/lib.rs b/compiler/rustc_mir_transform/src/lib.rs index 5df12ac4d8bc..8aa14d15644b 100644 --- a/compiler/rustc_mir_transform/src/lib.rs +++ b/compiler/rustc_mir_transform/src/lib.rs @@ -316,6 +316,10 @@ fn mir_keys(tcx: TyCtxt<'_>, (): ()) -> FxIndexSet { // All body-owners have MIR associated with them. let mut set: FxIndexSet<_> = tcx.hir_body_owners().collect(); + // Remove the fake bodies for `global_asm!`, since they're not useful + // to be emitted (`--emit=mir`) or encoded (in metadata). + set.retain(|&def_id| !matches!(tcx.def_kind(def_id), DefKind::GlobalAsm)); + // Coroutine-closures (e.g. async closures) have an additional by-move MIR // body that isn't in the HIR. for body_owner in tcx.hir_body_owners() { diff --git a/tests/ui/asm/global-asm-isnt-really-a-mir-body.rs b/tests/ui/asm/global-asm-isnt-really-a-mir-body.rs new file mode 100644 index 000000000000..b7636d116ec6 --- /dev/null +++ b/tests/ui/asm/global-asm-isnt-really-a-mir-body.rs @@ -0,0 +1,26 @@ +//@ revisions: emit_mir instrument cfi + +// Make sure we don't try to emit MIR for it. +//@[emit_mir] compile-flags: --emit=mir + +// Make sure we don't try to instrument it. +//@[instrument] compile-flags: -Cinstrument-coverage -Zno-profiler-runtime +//@[instrument] only-linux + +// Make sure we don't try to CFI encode it. +//@[cfi] compile-flags: -Zsanitizer=cfi -Ccodegen-units=1 -Clto -Ctarget-feature=-crt-static -Clink-dead-code=true +//@[cfi] needs-sanitizer-cfi +//@[cfi] no-prefer-dynamic +// FIXME(#122848) Remove only-linux once OSX CFI binaries work +//@[cfi] only-linux + +//@ build-pass +//@ needs-asm-support + +use std::arch::global_asm; + +fn foo() {} + +global_asm!("/* {} */", sym foo); + +fn main() {} diff --git a/tests/ui/asm/global-asm-with-error.stderr b/tests/ui/asm/global-asm-with-error.stderr index 6c07a9f020da..3b76bfd19485 100644 --- a/tests/ui/asm/global-asm-with-error.stderr +++ b/tests/ui/asm/global-asm-with-error.stderr @@ -1,5 +1,5 @@ error[E0425]: cannot find value `a` in this scope - --> $DIR/global-asm-with-error.rs:6:29 + --> $DIR/global-asm-with-error.rs:8:29 | LL | global_asm!("/* {} */", sym a); | ^ not found in this scope