Skip to content

Commit 79dce6a

Browse files
committed
Pass FnAbi to find_mir_or_eval_fn
1 parent 9c707a8 commit 79dce6a

36 files changed

+542
-432
lines changed

Diff for: compiler/rustc_const_eval/src/const_eval/dummy_machine.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
use rustc_middle::mir::interpret::{AllocId, ConstAllocation, InterpResult};
22
use rustc_middle::mir::*;
33
use rustc_middle::query::TyCtxtAt;
4+
use rustc_middle::ty::Ty;
45
use rustc_middle::ty::layout::TyAndLayout;
56
use rustc_middle::{bug, span_bug, ty};
67
use rustc_span::def_id::DefId;
8+
use rustc_target::callconv::FnAbi;
79

810
use crate::interpret::{
911
self, HasStaticRootDefId, ImmTy, Immediate, InterpCx, PointerArithmetic, interp_ok,
@@ -86,7 +88,7 @@ impl<'tcx> interpret::Machine<'tcx> for DummyMachine {
8688
fn find_mir_or_eval_fn(
8789
_ecx: &mut InterpCx<'tcx, Self>,
8890
_instance: ty::Instance<'tcx>,
89-
_abi: rustc_abi::ExternAbi,
91+
_abi: &FnAbi<'tcx, Ty<'tcx>>,
9092
_args: &[interpret::FnArg<'tcx, Self::Provenance>],
9193
_destination: &interpret::MPlaceTy<'tcx, Self::Provenance>,
9294
_target: Option<BasicBlock>,

Diff for: compiler/rustc_const_eval/src/const_eval/machine.rs

+3-2
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use std::borrow::{Borrow, Cow};
22
use std::fmt;
33
use std::hash::Hash;
44

5-
use rustc_abi::{Align, ExternAbi, Size};
5+
use rustc_abi::{Align, Size};
66
use rustc_ast::Mutability;
77
use rustc_data_structures::fx::{FxHashMap, FxIndexMap, IndexEntry};
88
use rustc_hir::def_id::{DefId, LocalDefId};
@@ -14,6 +14,7 @@ use rustc_middle::ty::{self, Ty, TyCtxt};
1414
use rustc_middle::{bug, mir};
1515
use rustc_span::Span;
1616
use rustc_span::symbol::{Symbol, sym};
17+
use rustc_target::callconv::FnAbi;
1718
use tracing::debug;
1819

1920
use super::error::*;
@@ -340,7 +341,7 @@ impl<'tcx> interpret::Machine<'tcx> for CompileTimeMachine<'tcx> {
340341
fn find_mir_or_eval_fn(
341342
ecx: &mut InterpCx<'tcx, Self>,
342343
orig_instance: ty::Instance<'tcx>,
343-
_abi: ExternAbi,
344+
_abi: &FnAbi<'tcx, Ty<'tcx>>,
344345
args: &[FnArg<'tcx>],
345346
dest: &MPlaceTy<'tcx>,
346347
ret: Option<mir::BasicBlock>,

Diff for: compiler/rustc_const_eval/src/interpret/call.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -519,7 +519,7 @@ impl<'tcx, M: Machine<'tcx>> InterpCx<'tcx, M> {
519519
return M::call_extra_fn(
520520
self,
521521
extra,
522-
caller_abi,
522+
caller_fn_abi,
523523
args,
524524
destination,
525525
target,
@@ -570,7 +570,7 @@ impl<'tcx, M: Machine<'tcx>> InterpCx<'tcx, M> {
570570
let Some((body, instance)) = M::find_mir_or_eval_fn(
571571
self,
572572
instance,
573-
caller_abi,
573+
caller_fn_abi,
574574
args,
575575
destination,
576576
target,

Diff for: compiler/rustc_const_eval/src/interpret/machine.rs

+5-4
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use std::borrow::{Borrow, Cow};
66
use std::fmt::Debug;
77
use std::hash::Hash;
88

9-
use rustc_abi::{Align, ExternAbi, Size};
9+
use rustc_abi::{Align, Size};
1010
use rustc_apfloat::{Float, FloatConvert};
1111
use rustc_ast::{InlineAsmOptions, InlineAsmTemplatePiece};
1212
use rustc_middle::query::TyCtxtAt;
@@ -15,6 +15,7 @@ use rustc_middle::ty::layout::TyAndLayout;
1515
use rustc_middle::{mir, ty};
1616
use rustc_span::Span;
1717
use rustc_span::def_id::DefId;
18+
use rustc_target::callconv::FnAbi;
1819

1920
use super::{
2021
AllocBytes, AllocId, AllocKind, AllocRange, Allocation, CTFE_ALLOC_SALT, ConstAllocation,
@@ -201,7 +202,7 @@ pub trait Machine<'tcx>: Sized {
201202
fn find_mir_or_eval_fn(
202203
ecx: &mut InterpCx<'tcx, Self>,
203204
instance: ty::Instance<'tcx>,
204-
abi: ExternAbi,
205+
abi: &FnAbi<'tcx, Ty<'tcx>>,
205206
args: &[FnArg<'tcx, Self::Provenance>],
206207
destination: &MPlaceTy<'tcx, Self::Provenance>,
207208
target: Option<mir::BasicBlock>,
@@ -213,7 +214,7 @@ pub trait Machine<'tcx>: Sized {
213214
fn call_extra_fn(
214215
ecx: &mut InterpCx<'tcx, Self>,
215216
fn_val: Self::ExtraFnVal,
216-
abi: ExternAbi,
217+
abi: &FnAbi<'tcx, Ty<'tcx>>,
217218
args: &[FnArg<'tcx, Self::Provenance>],
218219
destination: &MPlaceTy<'tcx, Self::Provenance>,
219220
target: Option<mir::BasicBlock>,
@@ -652,7 +653,7 @@ pub macro compile_time_machine(<$tcx: lifetime>) {
652653
fn call_extra_fn(
653654
_ecx: &mut InterpCx<$tcx, Self>,
654655
fn_val: !,
655-
_abi: ExternAbi,
656+
_abi: &FnAbi<$tcx, Ty<$tcx>>,
656657
_args: &[FnArg<$tcx>],
657658
_destination: &MPlaceTy<$tcx, Self::Provenance>,
658659
_target: Option<mir::BasicBlock>,

Diff for: src/tools/miri/src/concurrency/thread.rs

+1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ use rustc_middle::mir::Mutability;
1515
use rustc_middle::ty::layout::TyAndLayout;
1616
use rustc_span::Span;
1717

18+
1819
use crate::concurrency::data_race;
1920
use crate::shims::tls;
2021
use crate::*;

Diff for: src/tools/miri/src/eval.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,14 @@ use std::path::PathBuf;
66
use std::task::Poll;
77
use std::{iter, thread};
88

9-
use rustc_abi::ExternAbi;
9+
1010
use rustc_data_structures::fx::{FxHashMap, FxHashSet};
1111
use rustc_hir::def::Namespace;
1212
use rustc_hir::def_id::DefId;
1313
use rustc_middle::ty::layout::{LayoutCx, LayoutOf};
1414
use rustc_middle::ty::{self, Ty, TyCtxt};
1515
use rustc_session::config::EntryFnType;
16+
use rustc_abi::ExternAbi;
1617

1718
use crate::concurrency::thread::TlsAllocAction;
1819
use crate::diagnostics::report_leaks;

Diff for: src/tools/miri/src/helpers.rs

+25-8
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,10 @@ use rustc_middle::ty::layout::{FnAbiOf, LayoutOf, MaybeResult, TyAndLayout};
1919
use rustc_middle::ty::{self, FloatTy, IntTy, Ty, TyCtxt, UintTy};
2020
use rustc_session::config::CrateType;
2121
use rustc_span::{Span, Symbol};
22+
use rustc_target::callconv::FnAbi;
23+
use rustc_target::callconv::Conv;
24+
25+
2226

2327
use crate::*;
2428

@@ -915,12 +919,25 @@ pub trait EvalContextExt<'tcx>: crate::MiriInterpCxExt<'tcx> {
915919
}
916920

917921
/// Check that the ABI is what we expect.
918-
fn check_abi<'a>(&self, abi: ExternAbi, exp_abi: ExternAbi) -> InterpResult<'a, ()> {
919-
if abi != exp_abi {
922+
fn check_abi<'a>(&self, fn_abi: &FnAbi<'tcx, Ty<'tcx>>, exp_abi: Conv) -> InterpResult<'a, ()> {
923+
let caller_abi_name = match fn_abi.conv {
924+
Conv::C => "C",
925+
Conv::Rust => "Rust",
926+
Conv::X86Stdcall => "X86Stdcall",
927+
_ => { panic!("Unsupported caller ABI");}
928+
};
929+
let callee_abi_name = match exp_abi {
930+
Conv::C => "C",
931+
Conv::Rust => "Rust",
932+
Conv::X86Stdcall => "X86Stdcall",
933+
_ => { panic!("Unsupported callee ABI");}
934+
};
935+
936+
if fn_abi.conv != exp_abi {
920937
throw_ub_format!(
921938
"calling a function with ABI {} using caller ABI {}",
922-
exp_abi.name(),
923-
abi.name()
939+
callee_abi_name,
940+
caller_abi_name
924941
)
925942
}
926943
interp_ok(())
@@ -951,8 +968,8 @@ pub trait EvalContextExt<'tcx>: crate::MiriInterpCxExt<'tcx> {
951968

952969
fn check_abi_and_shim_symbol_clash(
953970
&mut self,
954-
abi: ExternAbi,
955-
exp_abi: ExternAbi,
971+
abi: &FnAbi<'tcx, Ty<'tcx>>,
972+
exp_abi: Conv,
956973
link_name: Symbol,
957974
) -> InterpResult<'tcx, ()> {
958975
self.check_abi(abi, exp_abi)?;
@@ -976,8 +993,8 @@ pub trait EvalContextExt<'tcx>: crate::MiriInterpCxExt<'tcx> {
976993

977994
fn check_shim<'a, const N: usize>(
978995
&mut self,
979-
abi: ExternAbi,
980-
exp_abi: ExternAbi,
996+
abi: &FnAbi<'tcx, Ty<'tcx>>,
997+
exp_abi: Conv,
981998
link_name: Symbol,
982999
args: &'a [OpTy<'tcx>],
9831000
) -> InterpResult<'tcx, &'a [OpTy<'tcx>; N]>

Diff for: src/tools/miri/src/machine.rs

+6-3
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ use std::{fmt, process};
1010

1111
use rand::rngs::StdRng;
1212
use rand::{Rng, SeedableRng};
13-
use rustc_abi::{Align, ExternAbi, Size};
13+
use rustc_abi::{Align, Size};
14+
use rustc_target::callconv::FnAbi;
1415
use rustc_attr::InlineAttr;
1516
use rustc_data_structures::fx::{FxHashMap, FxHashSet};
1617
#[allow(unused)]
@@ -24,6 +25,8 @@ use rustc_middle::ty::{self, Instance, Ty, TyCtxt};
2425
use rustc_session::config::InliningThreshold;
2526
use rustc_span::def_id::{CrateNum, DefId};
2627
use rustc_span::{Span, SpanData, Symbol};
28+
use rustc_abi::ExternAbi;
29+
2730

2831
use crate::concurrency::cpu_affinity::{self, CpuAffinityMask};
2932
use crate::concurrency::data_race::{self, NaReadType, NaWriteType};
@@ -1010,7 +1013,7 @@ impl<'tcx> Machine<'tcx> for MiriMachine<'tcx> {
10101013
fn find_mir_or_eval_fn(
10111014
ecx: &mut MiriInterpCx<'tcx>,
10121015
instance: ty::Instance<'tcx>,
1013-
abi: ExternAbi,
1016+
abi: &FnAbi<'tcx, Ty<'tcx>>,
10141017
args: &[FnArg<'tcx, Provenance>],
10151018
dest: &MPlaceTy<'tcx>,
10161019
ret: Option<mir::BasicBlock>,
@@ -1037,7 +1040,7 @@ impl<'tcx> Machine<'tcx> for MiriMachine<'tcx> {
10371040
fn call_extra_fn(
10381041
ecx: &mut MiriInterpCx<'tcx>,
10391042
fn_val: DynSym,
1040-
abi: ExternAbi,
1043+
abi: &FnAbi<'tcx, Ty<'tcx>>,
10411044
args: &[FnArg<'tcx, Provenance>],
10421045
dest: &MPlaceTy<'tcx>,
10431046
ret: Option<mir::BasicBlock>,

Diff for: src/tools/miri/src/shims/backtrace.rs

+12-10
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
1-
use rustc_abi::{ExternAbi, Size};
1+
use rustc_abi::Size;
22
use rustc_ast::ast::Mutability;
33
use rustc_middle::ty::layout::LayoutOf as _;
44
use rustc_middle::ty::{self, Instance, Ty};
55
use rustc_span::{BytePos, Loc, Symbol, hygiene};
6+
use rustc_target::callconv::FnAbi;
7+
use rustc_target::callconv::Conv;
68

79
use crate::helpers::check_min_arg_count;
810
use crate::*;
@@ -11,13 +13,13 @@ impl<'tcx> EvalContextExt<'tcx> for crate::MiriInterpCx<'tcx> {}
1113
pub trait EvalContextExt<'tcx>: crate::MiriInterpCxExt<'tcx> {
1214
fn handle_miri_backtrace_size(
1315
&mut self,
14-
abi: ExternAbi,
16+
abi: &FnAbi<'tcx, Ty<'tcx>>,
1517
link_name: Symbol,
1618
args: &[OpTy<'tcx>],
1719
dest: &MPlaceTy<'tcx>,
1820
) -> InterpResult<'tcx> {
1921
let this = self.eval_context_mut();
20-
let [flags] = this.check_shim(abi, ExternAbi::Rust, link_name, args)?;
22+
let [flags] = this.check_shim(abi, Conv::Rust, link_name, args)?;
2123

2224
let flags = this.read_scalar(flags)?.to_u64()?;
2325
if flags != 0 {
@@ -31,7 +33,7 @@ pub trait EvalContextExt<'tcx>: crate::MiriInterpCxExt<'tcx> {
3133

3234
fn handle_miri_get_backtrace(
3335
&mut self,
34-
abi: ExternAbi,
36+
abi: &FnAbi<'tcx, Ty<'tcx>>,
3537
link_name: Symbol,
3638
args: &[OpTy<'tcx>],
3739
dest: &MPlaceTy<'tcx>,
@@ -72,7 +74,7 @@ pub trait EvalContextExt<'tcx>: crate::MiriInterpCxExt<'tcx> {
7274
// storage for pointers is allocated by miri
7375
// deallocating the slice is undefined behavior with a custom global allocator
7476
0 => {
75-
let [_flags] = this.check_shim(abi, ExternAbi::Rust, link_name, args)?;
77+
let [_flags] = this.check_shim(abi, Conv::Rust, link_name, args)?;
7678

7779
let alloc = this.allocate(array_layout, MiriMemoryKind::Rust.into())?;
7880

@@ -87,7 +89,7 @@ pub trait EvalContextExt<'tcx>: crate::MiriInterpCxExt<'tcx> {
8789
}
8890
// storage for pointers is allocated by the caller
8991
1 => {
90-
let [_flags, buf] = this.check_shim(abi, ExternAbi::Rust, link_name, args)?;
92+
let [_flags, buf] = this.check_shim(abi, Conv::Rust, link_name, args)?;
9193

9294
let buf_place = this.deref_pointer(buf)?;
9395

@@ -137,13 +139,13 @@ pub trait EvalContextExt<'tcx>: crate::MiriInterpCxExt<'tcx> {
137139

138140
fn handle_miri_resolve_frame(
139141
&mut self,
140-
abi: ExternAbi,
142+
abi: &FnAbi<'tcx, Ty<'tcx>>,
141143
link_name: Symbol,
142144
args: &[OpTy<'tcx>],
143145
dest: &MPlaceTy<'tcx>,
144146
) -> InterpResult<'tcx> {
145147
let this = self.eval_context_mut();
146-
let [ptr, flags] = this.check_shim(abi, ExternAbi::Rust, link_name, args)?;
148+
let [ptr, flags] = this.check_shim(abi, Conv::Rust, link_name, args)?;
147149

148150
let flags = this.read_scalar(flags)?.to_u64()?;
149151

@@ -215,14 +217,14 @@ pub trait EvalContextExt<'tcx>: crate::MiriInterpCxExt<'tcx> {
215217

216218
fn handle_miri_resolve_frame_names(
217219
&mut self,
218-
abi: ExternAbi,
220+
abi: &FnAbi<'tcx, Ty<'tcx>>,
219221
link_name: Symbol,
220222
args: &[OpTy<'tcx>],
221223
) -> InterpResult<'tcx> {
222224
let this = self.eval_context_mut();
223225

224226
let [ptr, flags, name_ptr, filename_ptr] =
225-
this.check_shim(abi, ExternAbi::Rust, link_name, args)?;
227+
this.check_shim(abi, Conv::Rust, link_name, args)?;
226228

227229
let flags = this.read_scalar(flags)?.to_u64()?;
228230
if flags != 0 {

0 commit comments

Comments
 (0)