Skip to content

Commit 7319287

Browse files
committed
Move mem{cpy,move,set} to MemoryBuilderMethods
1 parent 13d5c03 commit 7319287

File tree

4 files changed

+89
-87
lines changed

4 files changed

+89
-87
lines changed

src/librustc_codegen_llvm/builder.rs

Lines changed: 57 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -354,6 +354,63 @@ impl MemoryBuilderMethods<'tcx> for Builder<'a, 'll, 'tcx> {
354354
llvm::LLVMBuildStructGEP(self.llbuilder, ptr, idx as c_uint, noname())
355355
}
356356
}
357+
358+
fn memcpy(&mut self, dst: &'ll Value, dst_align: Align,
359+
src: &'ll Value, src_align: Align,
360+
size: &'ll Value, flags: MemFlags) {
361+
if flags.contains(MemFlags::NONTEMPORAL) {
362+
// HACK(nox): This is inefficient but there is no nontemporal memcpy.
363+
let val = self.load(src, src_align);
364+
let ptr = self.pointercast(dst, self.type_ptr_to(self.val_ty(val)));
365+
self.store_with_flags(val, ptr, dst_align, flags);
366+
return;
367+
}
368+
let size = self.intcast(size, self.type_isize(), false);
369+
let is_volatile = flags.contains(MemFlags::VOLATILE);
370+
let dst = self.pointercast(dst, self.type_i8p());
371+
let src = self.pointercast(src, self.type_i8p());
372+
unsafe {
373+
llvm::LLVMRustBuildMemCpy(self.llbuilder, dst, dst_align.bytes() as c_uint,
374+
src, src_align.bytes() as c_uint, size, is_volatile);
375+
}
376+
}
377+
378+
fn memmove(&mut self, dst: &'ll Value, dst_align: Align,
379+
src: &'ll Value, src_align: Align,
380+
size: &'ll Value, flags: MemFlags) {
381+
if flags.contains(MemFlags::NONTEMPORAL) {
382+
// HACK(nox): This is inefficient but there is no nontemporal memmove.
383+
let val = self.load(src, src_align);
384+
let ptr = self.pointercast(dst, self.type_ptr_to(self.val_ty(val)));
385+
self.store_with_flags(val, ptr, dst_align, flags);
386+
return;
387+
}
388+
let size = self.intcast(size, self.type_isize(), false);
389+
let is_volatile = flags.contains(MemFlags::VOLATILE);
390+
let dst = self.pointercast(dst, self.type_i8p());
391+
let src = self.pointercast(src, self.type_i8p());
392+
unsafe {
393+
llvm::LLVMRustBuildMemMove(self.llbuilder, dst, dst_align.bytes() as c_uint,
394+
src, src_align.bytes() as c_uint, size, is_volatile);
395+
}
396+
}
397+
398+
fn memset(
399+
&mut self,
400+
ptr: &'ll Value,
401+
fill_byte: &'ll Value,
402+
size: &'ll Value,
403+
align: Align,
404+
flags: MemFlags,
405+
) {
406+
let ptr_width = &self.sess().target.target.target_pointer_width;
407+
let intrinsic_key = format!("llvm.memset.p0i8.i{}", ptr_width);
408+
let llintrinsicfn = self.get_intrinsic(&intrinsic_key);
409+
let ptr = self.pointercast(ptr, self.type_i8p());
410+
let align = self.const_u32(align.bytes() as u32);
411+
let volatile = self.const_bool(flags.contains(MemFlags::VOLATILE));
412+
self.call(llintrinsicfn, &[ptr, fill_byte, size, align, volatile], None);
413+
}
357414
}
358415

359416
impl BuilderMethods<'a, 'tcx> for Builder<'a, 'll, 'tcx> {
@@ -928,63 +985,6 @@ impl BuilderMethods<'a, 'tcx> for Builder<'a, 'll, 'tcx> {
928985
}
929986
}
930987

931-
fn memcpy(&mut self, dst: &'ll Value, dst_align: Align,
932-
src: &'ll Value, src_align: Align,
933-
size: &'ll Value, flags: MemFlags) {
934-
if flags.contains(MemFlags::NONTEMPORAL) {
935-
// HACK(nox): This is inefficient but there is no nontemporal memcpy.
936-
let val = self.load(src, src_align);
937-
let ptr = self.pointercast(dst, self.type_ptr_to(self.val_ty(val)));
938-
self.store_with_flags(val, ptr, dst_align, flags);
939-
return;
940-
}
941-
let size = self.intcast(size, self.type_isize(), false);
942-
let is_volatile = flags.contains(MemFlags::VOLATILE);
943-
let dst = self.pointercast(dst, self.type_i8p());
944-
let src = self.pointercast(src, self.type_i8p());
945-
unsafe {
946-
llvm::LLVMRustBuildMemCpy(self.llbuilder, dst, dst_align.bytes() as c_uint,
947-
src, src_align.bytes() as c_uint, size, is_volatile);
948-
}
949-
}
950-
951-
fn memmove(&mut self, dst: &'ll Value, dst_align: Align,
952-
src: &'ll Value, src_align: Align,
953-
size: &'ll Value, flags: MemFlags) {
954-
if flags.contains(MemFlags::NONTEMPORAL) {
955-
// HACK(nox): This is inefficient but there is no nontemporal memmove.
956-
let val = self.load(src, src_align);
957-
let ptr = self.pointercast(dst, self.type_ptr_to(self.val_ty(val)));
958-
self.store_with_flags(val, ptr, dst_align, flags);
959-
return;
960-
}
961-
let size = self.intcast(size, self.type_isize(), false);
962-
let is_volatile = flags.contains(MemFlags::VOLATILE);
963-
let dst = self.pointercast(dst, self.type_i8p());
964-
let src = self.pointercast(src, self.type_i8p());
965-
unsafe {
966-
llvm::LLVMRustBuildMemMove(self.llbuilder, dst, dst_align.bytes() as c_uint,
967-
src, src_align.bytes() as c_uint, size, is_volatile);
968-
}
969-
}
970-
971-
fn memset(
972-
&mut self,
973-
ptr: &'ll Value,
974-
fill_byte: &'ll Value,
975-
size: &'ll Value,
976-
align: Align,
977-
flags: MemFlags,
978-
) {
979-
let ptr_width = &self.sess().target.target.target_pointer_width;
980-
let intrinsic_key = format!("llvm.memset.p0i8.i{}", ptr_width);
981-
let llintrinsicfn = self.get_intrinsic(&intrinsic_key);
982-
let ptr = self.pointercast(ptr, self.type_i8p());
983-
let align = self.const_u32(align.bytes() as u32);
984-
let volatile = self.const_bool(flags.contains(MemFlags::VOLATILE));
985-
self.call(llintrinsicfn, &[ptr, fill_byte, size, align, volatile], None);
986-
}
987-
988988
fn select(
989989
&mut self, cond: &'ll Value,
990990
then_val: &'ll Value,

src/librustc_codegen_ssa/mir/operand.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,10 +54,12 @@ impl<V: CodegenObject> fmt::Debug for OperandRef<'tcx, V> {
5454
}
5555

5656
impl<'a, 'tcx: 'a, V: CodegenObject> OperandRef<'tcx, V> {
57-
pub fn new_zst<Bx: BuilderMethods<'a, 'tcx, Value = V>>(
57+
pub fn new_zst<Bx: HasCodegen<'tcx, Value = V>>(
5858
bx: &mut Bx,
5959
layout: TyLayout<'tcx>
60-
) -> OperandRef<'tcx, V> {
60+
) -> OperandRef<'tcx, V>
61+
where Bx::CodegenCx: ConstMethods<'tcx>
62+
{
6163
assert!(layout.is_zst());
6264
OperandRef {
6365
val: OperandValue::Immediate(bx.const_undef(bx.immediate_backend_type(layout))),

src/librustc_codegen_ssa/traits/builder.rs

Lines changed: 27 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,33 @@ pub trait MemoryBuilderMethods<'tcx>: HasCodegen<'tcx> {
6262
fn gep(&mut self, ptr: Self::Value, indices: &[Self::Value]) -> Self::Value;
6363
fn inbounds_gep(&mut self, ptr: Self::Value, indices: &[Self::Value]) -> Self::Value;
6464
fn struct_gep(&mut self, ptr: Self::Value, idx: u64) -> Self::Value;
65+
66+
fn memcpy(
67+
&mut self,
68+
dst: Self::Value,
69+
dst_align: Align,
70+
src: Self::Value,
71+
src_align: Align,
72+
size: Self::Value,
73+
flags: MemFlags,
74+
);
75+
fn memmove(
76+
&mut self,
77+
dst: Self::Value,
78+
dst_align: Align,
79+
src: Self::Value,
80+
src_align: Align,
81+
size: Self::Value,
82+
flags: MemFlags,
83+
);
84+
fn memset(
85+
&mut self,
86+
ptr: Self::Value,
87+
fill_byte: Self::Value,
88+
size: Self::Value,
89+
align: Align,
90+
flags: MemFlags,
91+
);
6592
}
6693

6794
pub trait BuilderMethods<'a, 'tcx: 'a>:
@@ -176,33 +203,6 @@ pub trait BuilderMethods<'a, 'tcx: 'a>:
176203
dia: AsmDialect,
177204
) -> Option<Self::Value>;
178205

179-
fn memcpy(
180-
&mut self,
181-
dst: Self::Value,
182-
dst_align: Align,
183-
src: Self::Value,
184-
src_align: Align,
185-
size: Self::Value,
186-
flags: MemFlags,
187-
);
188-
fn memmove(
189-
&mut self,
190-
dst: Self::Value,
191-
dst_align: Align,
192-
src: Self::Value,
193-
src_align: Align,
194-
size: Self::Value,
195-
flags: MemFlags,
196-
);
197-
fn memset(
198-
&mut self,
199-
ptr: Self::Value,
200-
fill_byte: Self::Value,
201-
size: Self::Value,
202-
align: Align,
203-
flags: MemFlags,
204-
);
205-
206206
fn select(
207207
&mut self,
208208
cond: Self::Value,

src/librustc_codegen_ssa/traits/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ mod write;
3030
pub use self::abi::{AbiBuilderMethods, AbiMethods};
3131
pub use self::asm::{AsmBuilderMethods, AsmMethods};
3232
pub use self::backend::{Backend, BackendTypes, ExtraBackendMethods};
33-
pub use self::builder::{BuilderMethods, MemoryBuilderMethods, OverflowOp};
33+
pub use self::builder::*;
3434
pub use self::consts::ConstMethods;
3535
pub use self::debuginfo::{DebugInfoBuilderMethods, DebugInfoMethods};
3636
pub use self::declare::{DeclareMethods, PreDefineMethods};

0 commit comments

Comments
 (0)