Skip to content

Commit b044aaa

Browse files
committed
Change InlineAsm to allow multiple targets instead
1 parent 7152993 commit b044aaa

File tree

23 files changed

+125
-96
lines changed

23 files changed

+125
-96
lines changed

compiler/rustc_borrowck/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -723,7 +723,7 @@ impl<'cx, 'tcx, R> rustc_mir_dataflow::ResultsVisitor<'cx, 'tcx, R> for MirBorro
723723
operands,
724724
options: _,
725725
line_spans: _,
726-
destination: _,
726+
targets: _,
727727
unwind: _,
728728
} => {
729729
for op in operands {

compiler/rustc_borrowck/src/polonius/loan_invalidations.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@ impl<'cx, 'tcx> Visitor<'tcx> for LoanInvalidationsGenerator<'cx, 'tcx> {
161161
operands,
162162
options: _,
163163
line_spans: _,
164-
destination: _,
164+
targets: _,
165165
unwind: _,
166166
} => {
167167
for op in operands {

compiler/rustc_borrowck/src/type_check/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1771,8 +1771,8 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> {
17711771
self.assert_iscleanup(body, block_data, real_target, is_cleanup);
17721772
self.assert_iscleanup_unwind(body, block_data, unwind, is_cleanup);
17731773
}
1774-
TerminatorKind::InlineAsm { destination, unwind, .. } => {
1775-
if let Some(target) = destination {
1774+
TerminatorKind::InlineAsm { ref targets, unwind, .. } => {
1775+
for &target in targets {
17761776
self.assert_iscleanup(body, block_data, target, is_cleanup);
17771777
}
17781778
self.assert_iscleanup_unwind(body, block_data, unwind, is_cleanup);

compiler/rustc_codegen_cranelift/src/base.rs

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -445,7 +445,7 @@ fn codegen_fn_body(fx: &mut FunctionCx<'_, '_, '_>, start_block: Block) {
445445
template,
446446
operands,
447447
options,
448-
destination,
448+
targets,
449449
line_spans: _,
450450
unwind: _,
451451
} => {
@@ -456,13 +456,25 @@ fn codegen_fn_body(fx: &mut FunctionCx<'_, '_, '_>, start_block: Block) {
456456
);
457457
}
458458

459+
let have_labels = if options.contains(InlineAsmOptions::NORETURN) {
460+
!targets.is_empty()
461+
} else {
462+
targets.len() > 1
463+
};
464+
if have_labels {
465+
fx.tcx.dcx().span_fatal(
466+
source_info.span,
467+
"cranelift doesn't support labels in inline assembly.",
468+
);
469+
}
470+
459471
crate::inline_asm::codegen_inline_asm_terminator(
460472
fx,
461473
source_info.span,
462474
template,
463475
operands,
464476
*options,
465-
*destination,
477+
targets.get(0).copied(),
466478
);
467479
}
468480
TerminatorKind::UnwindTerminate(reason) => {

compiler/rustc_codegen_ssa/src/mir/block.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1285,7 +1285,7 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
12851285
ref operands,
12861286
options,
12871287
line_spans,
1288-
destination,
1288+
ref targets,
12891289
unwind,
12901290
} => self.codegen_asm_terminator(
12911291
helper,
@@ -1295,7 +1295,7 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
12951295
operands,
12961296
options,
12971297
line_spans,
1298-
destination,
1298+
targets.get(0).copied(),
12991299
unwind,
13001300
self.instance,
13011301
mergeable_succ(),

compiler/rustc_const_eval/messages.ftl

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -232,9 +232,6 @@ const_eval_non_const_fn_call =
232232
const_eval_non_const_impl =
233233
impl defined here, but it is not `const`
234234
235-
const_eval_noreturn_asm_returned =
236-
returned from noreturn inline assembly
237-
238235
const_eval_not_enough_caller_args =
239236
calling a function with fewer arguments than it requires
240237

compiler/rustc_const_eval/src/interpret/machine.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -374,11 +374,17 @@ pub trait Machine<'mir, 'tcx: 'mir>: Sized {
374374
kind: Option<MemoryKind<Self::MemoryKind>>,
375375
) -> InterpResult<'tcx, Cow<'b, Allocation<Self::Provenance, Self::AllocExtra, Self::Bytes>>>;
376376

377+
/// Evaluate the inline assembly.
378+
///
379+
/// This should take care of jumping to the next block (one of `targets`) when asm goto
380+
/// is triggered, `targets[0]` when the assembly falls through, or diverge in case of
381+
/// `InlineAsmOptions::NORETURN` being set.
377382
fn eval_inline_asm(
378383
_ecx: &mut InterpCx<'mir, 'tcx, Self>,
379384
_template: &'tcx [InlineAsmTemplatePiece],
380385
_operands: &[mir::InlineAsmOperand<'tcx>],
381386
_options: InlineAsmOptions,
387+
_targets: &[mir::BasicBlock],
382388
) -> InterpResult<'tcx> {
383389
throw_unsup_format!("inline assembly is not supported")
384390
}

compiler/rustc_const_eval/src/interpret/terminator.rs

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
use std::borrow::Cow;
22

3-
use rustc_ast::ast::InlineAsmOptions;
43
use rustc_middle::{
54
mir,
65
ty::{
@@ -224,15 +223,8 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
224223
terminator.kind
225224
),
226225

227-
InlineAsm { template, ref operands, options, destination, .. } => {
228-
M::eval_inline_asm(self, template, operands, options)?;
229-
if options.contains(InlineAsmOptions::NORETURN) {
230-
throw_ub_custom!(fluent::const_eval_noreturn_asm_returned);
231-
}
232-
self.go_to_block(
233-
destination
234-
.expect("InlineAsm terminators without noreturn must have a destination"),
235-
)
226+
InlineAsm { template, ref operands, options, ref targets, .. } => {
227+
M::eval_inline_asm(self, template, operands, options, targets)?;
236228
}
237229
}
238230

compiler/rustc_const_eval/src/transform/validate.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -471,9 +471,9 @@ impl<'a, 'tcx> Visitor<'tcx> for CfgChecker<'a, 'tcx> {
471471
self.check_edge(location, *real_target, EdgeKind::Normal);
472472
self.check_unwind_edge(location, *unwind);
473473
}
474-
TerminatorKind::InlineAsm { destination, unwind, .. } => {
475-
if let Some(destination) = destination {
476-
self.check_edge(location, *destination, EdgeKind::Normal);
474+
TerminatorKind::InlineAsm { targets, unwind, .. } => {
475+
for &target in targets {
476+
self.check_edge(location, target, EdgeKind::Normal);
477477
}
478478
self.check_unwind_edge(location, *unwind);
479479
}

compiler/rustc_middle/src/mir/mod.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1718,13 +1718,13 @@ mod size_asserts {
17181718
use super::*;
17191719
use rustc_data_structures::static_assert_size;
17201720
// tidy-alphabetical-start
1721-
static_assert_size!(BasicBlockData<'_>, 136);
1721+
static_assert_size!(BasicBlockData<'_>, 144);
17221722
static_assert_size!(LocalDecl<'_>, 40);
17231723
static_assert_size!(SourceScopeData<'_>, 72);
17241724
static_assert_size!(Statement<'_>, 32);
17251725
static_assert_size!(StatementKind<'_>, 16);
1726-
static_assert_size!(Terminator<'_>, 104);
1727-
static_assert_size!(TerminatorKind<'_>, 88);
1726+
static_assert_size!(Terminator<'_>, 112);
1727+
static_assert_size!(TerminatorKind<'_>, 96);
17281728
static_assert_size!(VarDebugInfo<'_>, 88);
17291729
// tidy-alphabetical-end
17301730
}

0 commit comments

Comments
 (0)