Revert "remove rust-analyser support for extern "rust-intrinsic" blocks"

This reverts commit 51b51b51d7931da85280382a81c4dd80c73ca754.
This commit is contained in:
Bennet Bleßmann 2025-04-07 20:30:27 +02:00
parent b0fc137a0b
commit bb84c2860a
No known key found for this signature in database
GPG key ID: 3BE1A1A3CBC3CF99
5 changed files with 38 additions and 7 deletions

View file

@ -400,6 +400,7 @@ pub enum FnAbi {
Rust, Rust,
RustCall, RustCall,
RustCold, RustCold,
RustIntrinsic,
Stdcall, Stdcall,
StdcallUnwind, StdcallUnwind,
System, System,
@ -456,6 +457,7 @@ impl FnAbi {
s if *s == sym::riscv_dash_interrupt_dash_s => FnAbi::RiscvInterruptS, s if *s == sym::riscv_dash_interrupt_dash_s => FnAbi::RiscvInterruptS,
s if *s == sym::rust_dash_call => FnAbi::RustCall, s if *s == sym::rust_dash_call => FnAbi::RustCall,
s if *s == sym::rust_dash_cold => FnAbi::RustCold, s if *s == sym::rust_dash_cold => FnAbi::RustCold,
s if *s == sym::rust_dash_intrinsic => FnAbi::RustIntrinsic,
s if *s == sym::Rust => FnAbi::Rust, s if *s == sym::Rust => FnAbi::Rust,
s if *s == sym::stdcall_dash_unwind => FnAbi::StdcallUnwind, s if *s == sym::stdcall_dash_unwind => FnAbi::StdcallUnwind,
s if *s == sym::stdcall => FnAbi::Stdcall, s if *s == sym::stdcall => FnAbi::Stdcall,
@ -498,6 +500,7 @@ impl FnAbi {
FnAbi::Rust => "Rust", FnAbi::Rust => "Rust",
FnAbi::RustCall => "rust-call", FnAbi::RustCall => "rust-call",
FnAbi::RustCold => "rust-cold", FnAbi::RustCold => "rust-cold",
FnAbi::RustIntrinsic => "rust-intrinsic",
FnAbi::Stdcall => "stdcall", FnAbi::Stdcall => "stdcall",
FnAbi::StdcallUnwind => "stdcall-unwind", FnAbi::StdcallUnwind => "stdcall-unwind",
FnAbi::System => "system", FnAbi::System => "system",

View file

@ -59,7 +59,19 @@ impl Evaluator<'_> {
let function_data = self.db.function_data(def); let function_data = self.db.function_data(def);
let attrs = self.db.attrs(def.into()); let attrs = self.db.attrs(def.into());
let is_intrinsic = attrs.by_key(&sym::rustc_intrinsic).exists(); let is_intrinsic = attrs.by_key(&sym::rustc_intrinsic).exists()
// Keep this around for a bit until extern "rustc-intrinsic" abis are no longer used
|| (match &function_data.abi {
Some(abi) => *abi == sym::rust_dash_intrinsic,
None => match def.lookup(self.db.upcast()).container {
hir_def::ItemContainerId::ExternBlockId(block) => {
let id = block.lookup(self.db.upcast()).id;
id.item_tree(self.db.upcast())[id.value].abi.as_ref()
== Some(&sym::rust_dash_intrinsic)
}
_ => false,
},
});
if is_intrinsic { if is_intrinsic {
return self.exec_intrinsic( return self.exec_intrinsic(

View file

@ -18,6 +18,7 @@ use hir_def::{
TypeOrConstParamId, TypeOrConstParamId,
}; };
use hir_expand::name::Name; use hir_expand::name::Name;
use intern::sym;
use rustc_abi::TargetDataLayout; use rustc_abi::TargetDataLayout;
use rustc_hash::FxHashSet; use rustc_hash::FxHashSet;
use smallvec::{smallvec, SmallVec}; use smallvec::{smallvec, SmallVec};
@ -302,7 +303,19 @@ pub fn is_fn_unsafe_to_call(
let loc = func.lookup(db.upcast()); let loc = func.lookup(db.upcast());
match loc.container { match loc.container {
hir_def::ItemContainerId::ExternBlockId(_block) => { hir_def::ItemContainerId::ExternBlockId(block) => {
let id = block.lookup(db.upcast()).id;
let is_intrinsic_block =
id.item_tree(db.upcast())[id.value].abi.as_ref() == Some(&sym::rust_dash_intrinsic);
if is_intrinsic_block {
// legacy intrinsics
// extern "rust-intrinsic" intrinsics are unsafe unless they have the rustc_safe_intrinsic attribute
if db.attrs(func.into()).by_key(&sym::rustc_safe_intrinsic).exists() {
Unsafety::Safe
} else {
Unsafety::Unsafe
}
} else {
// Function in an `extern` block are always unsafe to call, except when // Function in an `extern` block are always unsafe to call, except when
// it is marked as `safe`. // it is marked as `safe`.
if data.is_safe() { if data.is_safe() {
@ -311,6 +324,7 @@ pub fn is_fn_unsafe_to_call(
Unsafety::Unsafe Unsafety::Unsafe
} }
} }
}
_ => Unsafety::Safe, _ => Unsafety::Safe,
} }
} }

View file

@ -36,6 +36,7 @@ const SUPPORTED_CALLING_CONVENTIONS: &[&str] = &[
"wasm", "wasm",
"system", "system",
"system-unwind", "system-unwind",
"rust-intrinsic",
"rust-call", "rust-call",
"unadjusted", "unadjusted",
]; ];

View file

@ -125,6 +125,7 @@ define_symbols! {
riscv_dash_interrupt_dash_s = "riscv-interrupt-s", riscv_dash_interrupt_dash_s = "riscv-interrupt-s",
rust_dash_call = "rust-call", rust_dash_call = "rust-call",
rust_dash_cold = "rust-cold", rust_dash_cold = "rust-cold",
rust_dash_intrinsic = "rust-intrinsic",
stdcall_dash_unwind = "stdcall-unwind", stdcall_dash_unwind = "stdcall-unwind",
system_dash_unwind = "system-unwind", system_dash_unwind = "system-unwind",
sysv64_dash_unwind = "sysv64-unwind", sysv64_dash_unwind = "sysv64-unwind",