Skip to content

Commit 742a795

Browse files
committed
Use FunctionBuilder::call_mem{cpy,move}
1 parent 16e936b commit 742a795

File tree

4 files changed

+26
-16
lines changed

4 files changed

+26
-16
lines changed

src/abi.rs

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -646,15 +646,16 @@ fn codegen_intrinsic_call<'a, 'tcx: 'a>(
646646
.ins()
647647
.iconst(fx.module.pointer_type(), elem_size as i64);
648648
assert_eq!(args.len(), 3);
649-
let src = args[0];
650-
let dst = args[1];
649+
let src = args[0].load_value(fx);
650+
let dst = args[1].load_value(fx);
651651
let count = args[2].load_value(fx);
652652
let byte_amount = fx.bcx.ins().imul(count, elem_size);
653-
fx.easy_call(
654-
"memmove",
655-
&[dst, src, CValue::ByVal(byte_amount, usize_layout)],
656-
nil_ty,
657-
);
653+
654+
if intrinsic.ends_with("_nonoverlapping") {
655+
fx.bcx.call_memcpy(fx.isa, dst, src, byte_amount);
656+
} else {
657+
fx.bcx.call_memmove(fx.isa, dst, src, byte_amount);
658+
}
658659
}
659660
"discriminant_value" => {
660661
assert_eq!(args.len(), 1);

src/base.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ impl<F: Fn() -> String> Drop for PrintOnPanic<F> {
1111

1212
pub fn trans_mono_item<'a, 'tcx: 'a>(
1313
tcx: TyCtxt<'a, 'tcx, 'tcx>,
14+
isa: &isa::TargetIsa,
1415
module: &mut Module<impl Backend>,
1516
caches: &mut Caches<'tcx>,
1617
ccx: &mut crate::constant::ConstantCx,
@@ -47,7 +48,7 @@ pub fn trans_mono_item<'a, 'tcx: 'a>(
4748
}
4849
});
4950

50-
trans_fn(tcx, module, ccx, caches, inst);
51+
trans_fn(tcx, isa, module, ccx, caches, inst);
5152
}
5253
MonoItem::Static(def_id) => {
5354
crate::constant::codegen_static(ccx, def_id);
@@ -60,6 +61,7 @@ pub fn trans_mono_item<'a, 'tcx: 'a>(
6061

6162
fn trans_fn<'a, 'tcx: 'a>(
6263
tcx: TyCtxt<'a, 'tcx, 'tcx>,
64+
isa: &isa::TargetIsa,
6365
module: &mut Module<impl Backend>,
6466
constants: &mut crate::constant::ConstantCx,
6567
caches: &mut Caches<'tcx>,
@@ -89,6 +91,7 @@ fn trans_fn<'a, 'tcx: 'a>(
8991
// Step 5. Make FunctionCx
9092
let mut fx = FunctionCx {
9193
tcx,
94+
isa,
9295
module,
9396
instance,
9497
mir,

src/common.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -584,6 +584,8 @@ pub fn cton_intcast<'a, 'tcx: 'a>(
584584

585585
pub struct FunctionCx<'a, 'tcx: 'a, B: Backend + 'a> {
586586
pub tcx: TyCtxt<'a, 'tcx, 'tcx>,
587+
// FIXME get isa from Module
588+
pub isa: &'a isa::TargetIsa,
587589
pub module: &'a mut Module<B>,
588590
pub instance: Instance<'tcx>,
589591
pub mir: &'tcx Mir<'tcx>,

src/lib.rs

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -178,13 +178,16 @@ impl CodegenBackend for CraneliftCodegenBackend {
178178

179179
let metadata = tcx.encode_metadata();
180180

181-
let mut flags_builder = settings::builder();
182-
flags_builder.enable("is_pic").unwrap();
183-
let flags = settings::Flags::new(flags_builder);
184-
let isa =
181+
fn build_isa(tcx: TyCtxt) -> Box<isa::TargetIsa> {
182+
let mut flags_builder = settings::builder();
183+
flags_builder.enable("is_pic").unwrap();
184+
let flags = settings::Flags::new(flags_builder);
185185
cranelift::codegen::isa::lookup(tcx.sess.target.target.llvm_target.parse().unwrap())
186186
.unwrap()
187-
.finish(flags);
187+
.finish(flags)
188+
}
189+
190+
let isa = build_isa(tcx);
188191

189192
let mono_items =
190193
collector::collect_crate_mono_items(tcx, collector::MonoItemCollectionMode::Eager).0;
@@ -197,7 +200,7 @@ impl CodegenBackend for CraneliftCodegenBackend {
197200
let mut jit_module: Module<SimpleJITBackend> = Module::new(SimpleJITBuilder::new());
198201
assert_eq!(pointer_ty(tcx), jit_module.pointer_type());
199202

200-
codegen_mono_items(tcx, &mut jit_module, &mono_items);
203+
codegen_mono_items(tcx, &*isa, &mut jit_module, &mono_items);
201204

202205
tcx.sess.abort_if_errors();
203206
println!("Compiled everything");
@@ -237,7 +240,7 @@ impl CodegenBackend for CraneliftCodegenBackend {
237240
);
238241
assert_eq!(pointer_ty(tcx), faerie_module.pointer_type());
239242

240-
codegen_mono_items(tcx, &mut faerie_module, &mono_items);
243+
codegen_mono_items(tcx, &*build_isa(tcx), &mut faerie_module, &mono_items);
241244

242245
tcx.sess.abort_if_errors();
243246

@@ -318,6 +321,7 @@ impl CodegenBackend for CraneliftCodegenBackend {
318321

319322
fn codegen_mono_items<'a, 'tcx: 'a>(
320323
tcx: TyCtxt<'a, 'tcx, 'tcx>,
324+
isa: &isa::TargetIsa,
321325
module: &mut Module<impl Backend + 'static>,
322326
mono_items: &FxHashSet<MonoItem<'tcx>>,
323327
) {
@@ -333,7 +337,7 @@ fn codegen_mono_items<'a, 'tcx: 'a>(
333337

334338
for mono_item in mono_items {
335339
let res = ::std::panic::catch_unwind(::std::panic::AssertUnwindSafe(|| {
336-
base::trans_mono_item(tcx, module, &mut caches, &mut ccx, *mono_item);
340+
base::trans_mono_item(tcx, isa, module, &mut caches, &mut ccx, *mono_item);
337341
}));
338342

339343
if let Err(err) = res {

0 commit comments

Comments
 (0)