crate::trap::trap_unreachable(&mut fx, "function has uninhabited argument");
} else {
tcx.sess.time("codegen clif ir", || {
- tcx.sess.time("codegen prelude", || crate::abi::codegen_fn_prelude(&mut fx, start_block, true));
+ tcx.sess.time("codegen prelude", || crate::abi::codegen_fn_prelude(&mut fx, start_block));
codegen_fn_content(&mut fx);
});
}
let local_map = fx.local_map;
let cold_blocks = fx.cold_blocks;
- crate::pretty_clif::write_clif_file(cx.tcx, "unopt", instance, &context.func, &clif_comments, None);
+ crate::pretty_clif::write_clif_file(
+ cx.tcx,
+ "unopt",
+ None,
+ instance,
+ &context,
+ &clif_comments,
+ );
// Verify function
verify_func(tcx, &clif_comments, &context.func);
);
// Write optimized function to file for debugging
- {
- let value_ranges = context
- .build_value_labels_ranges(cx.module.isa())
- .expect("value location ranges");
-
- crate::pretty_clif::write_clif_file(
- cx.tcx,
- "opt",
- instance,
- &context.func,
- &clif_comments,
- Some(&value_ranges),
- );
- }
+ crate::pretty_clif::write_clif_file(
+ cx.tcx,
+ "opt",
+ Some(cx.module.isa()),
+ instance,
+ &context,
+ &clif_comments,
+ );
// Define debuginfo for function
let isa = cx.module.isa();
pub(crate) fn verify_func(tcx: TyCtxt<'_>, writer: &crate::pretty_clif::CommentWriter, func: &Function) {
tcx.sess.time("verify clif ir", || {
- let flags = settings::Flags::new(settings::builder());
- match ::cranelift_codegen::verify_function(&func, &flags) {
+ let flags = cranelift_codegen::settings::Flags::new(cranelift_codegen::settings::builder());
+ match cranelift_codegen::verify_function(&func, &flags) {
Ok(_) => {}
Err(err) => {
tcx.sess.err(&format!("{:?}", err));
- let pretty_error = ::cranelift_codegen::print_errors::pretty_verifier_error(
+ let pretty_error = cranelift_codegen::print_errors::pretty_verifier_error(
&func,
None,
Some(Box::new(writer)),
cleanup: _,
} => {
if !fx.tcx.sess.overflow_checks() {
- if let mir::AssertKind::OverflowNeg = *msg {
+ if let mir::AssertKind::OverflowNeg(_) = *msg {
let target = fx.get_block(*target);
fx.bcx.ins().jump(target, &[]);
continue;
// Black box
}
- _ => unimpl_fatal!(fx.tcx, bb_data.terminator().source_info.span, "Inline assembly is not supported"),
+ _ => fx.tcx.sess.span_fatal(bb_data.terminator().source_info.span, "Inline assembly is not supported"),
}
}
TerminatorKind::Resume | TerminatorKind::Abort => {
bug!("shouldn't exist at trans {:?}", bb_data.terminator());
}
TerminatorKind::Drop {
- location,
+ place,
target,
unwind: _,
} => {
- let drop_place = trans_place(fx, *location);
+ let drop_place = trans_place(fx, *place);
crate::abi::codegen_drop(fx, bb_data.terminator().source_info.span, drop_place);
let target_block = fx.get_block(*target);
cur_block: Block,
stmt: &Statement<'tcx>,
) {
- let _print_guard = PrintOnPanic(|| format!("stmt {:?}", stmt));
+ let _print_guard = crate::PrintOnPanic(|| format!("stmt {:?}", stmt));
fx.set_debug_loc(stmt.source_info);
crate::trap::trap_unimplemented(fx, "_xgetbv arch intrinsic is not supported");
}
- _ => unimpl_fatal!(fx.tcx, stmt.source_info.span, "Inline assembly is not supported"),
+ // ___chkstk, ___chkstk_ms and __alloca are only used on Windows
+ _ if fx.tcx.symbol_name(fx.instance).name.as_str().starts_with("___chkstk") => {
+ crate::trap::trap_unimplemented(fx, "Stack probes are not supported");
+ }
+ _ if fx.tcx.symbol_name(fx.instance).name.as_str() == "__alloca" => {
+ crate::trap::trap_unimplemented(fx, "Alloca is not supported");
+ }
+ // Used in sys::windows::abort_internal
+ "int $$0x29" => {
+ crate::trap::trap_unimplemented(fx, "Windows abort");
+ }
+ _ => fx.tcx.sess.span_fatal(stmt.source_info.span, "Inline assembly is not supported"),
}
}
}