diff options
| author | Matthias Krüger <matthias.krueger@famsik.de> | 2023-04-20 17:59:54 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-04-20 17:59:54 +0200 |
| commit | 462461699aa78e08388fb32cf7b4ab05336a5763 (patch) | |
| tree | bb3bf43231655599e1d69f0c8acedd66ccfb57d8 | |
| parent | 7dc211f5cede0a515d7a00bf7f3f908ce97e861c (diff) | |
| parent | 2f503345b482e970df48cdb074becc75b7e507f2 (diff) | |
| download | rust-462461699aa78e08388fb32cf7b4ab05336a5763.tar.gz rust-462461699aa78e08388fb32cf7b4ab05336a5763.zip | |
Rollup merge of #110558 - spastorino:smir-call-terminator, r=oli-obk
Add Call terminator to SMIR This adds internal MIR `TerminatorKind::Call` to SMIR `Terminator::Call` conversion. r? `@oli-obk`
| -rw-r--r-- | compiler/rustc_smir/src/rustc_smir/mod.rs | 22 | ||||
| -rw-r--r-- | compiler/rustc_smir/src/stable_mir/mir/body.rs | 10 | ||||
| -rw-r--r-- | tests/ui-fulldeps/stable-mir/crate-info.rs | 10 |
3 files changed, 39 insertions, 3 deletions
diff --git a/compiler/rustc_smir/src/rustc_smir/mod.rs b/compiler/rustc_smir/src/rustc_smir/mod.rs index 4dad3c6bce7..09cb6fd22d5 100644 --- a/compiler/rustc_smir/src/rustc_smir/mod.rs +++ b/compiler/rustc_smir/src/rustc_smir/mod.rs @@ -128,6 +128,18 @@ fn rustc_place_to_place(place: &rustc_middle::mir::Place<'_>) -> stable_mir::mir stable_mir::mir::Place { local: place.local.as_usize() } } +fn rustc_unwind_to_unwind( + unwind: &rustc_middle::mir::UnwindAction, +) -> stable_mir::mir::UnwindAction { + use rustc_middle::mir::UnwindAction; + match unwind { + UnwindAction::Continue => stable_mir::mir::UnwindAction::Continue, + UnwindAction::Unreachable => stable_mir::mir::UnwindAction::Unreachable, + UnwindAction::Terminate => stable_mir::mir::UnwindAction::Terminate, + UnwindAction::Cleanup(bb) => stable_mir::mir::UnwindAction::Cleanup(bb.as_usize()), + } +} + fn rustc_terminator_to_terminator( terminator: &rustc_middle::mir::Terminator<'_>, ) -> stable_mir::mir::Terminator { @@ -151,7 +163,15 @@ fn rustc_terminator_to_terminator( Return => Terminator::Return, Unreachable => Terminator::Unreachable, Drop { .. } => todo!(), - Call { .. } => todo!(), + Call { func, args, destination, target, unwind, from_hir_call: _, fn_span: _ } => { + Terminator::Call { + func: rustc_op_to_op(func), + args: args.iter().map(|arg| rustc_op_to_op(arg)).collect(), + destination: rustc_place_to_place(destination), + target: target.map(|t| t.as_usize()), + unwind: rustc_unwind_to_unwind(unwind), + } + } Assert { .. } => todo!(), Yield { .. } => todo!(), GeneratorDrop => todo!(), diff --git a/compiler/rustc_smir/src/stable_mir/mir/body.rs b/compiler/rustc_smir/src/stable_mir/mir/body.rs index c504065c993..bd5e6b68a12 100644 --- a/compiler/rustc_smir/src/stable_mir/mir/body.rs +++ b/compiler/rustc_smir/src/stable_mir/mir/body.rs @@ -33,7 +33,7 @@ pub enum Terminator { args: Vec<Operand>, destination: Place, target: Option<usize>, - cleanup: Option<usize>, + unwind: UnwindAction, }, Assert { cond: Operand, @@ -45,6 +45,14 @@ pub enum Terminator { } #[derive(Clone, Debug)] +pub enum UnwindAction { + Continue, + Unreachable, + Terminate, + Cleanup(usize), +} + +#[derive(Clone, Debug)] pub enum Statement { Assign(Place, Operand), Nop, diff --git a/tests/ui-fulldeps/stable-mir/crate-info.rs b/tests/ui-fulldeps/stable-mir/crate-info.rs index dfde8c97ec2..95f27efa771 100644 --- a/tests/ui-fulldeps/stable-mir/crate-info.rs +++ b/tests/ui-fulldeps/stable-mir/crate-info.rs @@ -33,7 +33,6 @@ fn test_stable_mir(tcx: TyCtxt<'_>) { // Find items in the local crate. let items = stable_mir::all_local_items(); - assert!(get_item(tcx, &items, (DefKind::Fn, "foo_bar")).is_some()); assert!(get_item(tcx, &items, (DefKind::Fn, "foo::bar")).is_some()); // Find the `std` crate. @@ -52,6 +51,15 @@ fn test_stable_mir(tcx: TyCtxt<'_>) { stable_mir::mir::Terminator::Return => {} other => panic!("{other:?}"), } + + let foo_bar = get_item(tcx, &items, (DefKind::Fn, "foo_bar")).unwrap(); + let body = foo_bar.body(); + assert_eq!(body.blocks.len(), 4); + let block = &body.blocks[0]; + match &block.terminator { + stable_mir::mir::Terminator::Call { .. } => {} + other => panic!("{other:?}"), + } } // Use internal API to find a function in a crate. |
