Use IRBuilder to create memset
To avoid creating memsets with outdated signature. For some reason SROA chokes on this when using NewPM.
This commit is contained in:
parent
cd5441faf4
commit
03a73fa2cf
4 changed files with 27 additions and 10 deletions
|
@ -781,13 +781,18 @@ impl BuilderMethods<'a, 'tcx> for Builder<'a, 'll, 'tcx> {
|
||||||
align: Align,
|
align: Align,
|
||||||
flags: MemFlags,
|
flags: MemFlags,
|
||||||
) {
|
) {
|
||||||
let ptr_width = &self.sess().target.target.target_pointer_width;
|
let is_volatile = flags.contains(MemFlags::VOLATILE);
|
||||||
let intrinsic_key = format!("llvm.memset.p0i8.i{}", ptr_width);
|
|
||||||
let llintrinsicfn = self.get_intrinsic(&intrinsic_key);
|
|
||||||
let ptr = self.pointercast(ptr, self.type_i8p());
|
let ptr = self.pointercast(ptr, self.type_i8p());
|
||||||
let align = self.const_u32(align.bytes() as u32);
|
unsafe {
|
||||||
let volatile = self.const_bool(flags.contains(MemFlags::VOLATILE));
|
llvm::LLVMRustBuildMemSet(
|
||||||
self.call(llintrinsicfn, &[ptr, fill_byte, size, align, volatile], None);
|
self.llbuilder,
|
||||||
|
ptr,
|
||||||
|
align.bytes() as c_uint,
|
||||||
|
fill_byte,
|
||||||
|
size,
|
||||||
|
is_volatile,
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn select(
|
fn select(
|
||||||
|
|
|
@ -562,10 +562,6 @@ impl CodegenCx<'b, 'tcx> {
|
||||||
t_v8f64: t_f64, 8;
|
t_v8f64: t_f64, 8;
|
||||||
}
|
}
|
||||||
|
|
||||||
ifn!("llvm.memset.p0i8.i16", fn(i8p, t_i8, t_i16, t_i32, i1) -> void);
|
|
||||||
ifn!("llvm.memset.p0i8.i32", fn(i8p, t_i8, t_i32, t_i32, i1) -> void);
|
|
||||||
ifn!("llvm.memset.p0i8.i64", fn(i8p, t_i8, t_i64, t_i32, i1) -> void);
|
|
||||||
|
|
||||||
ifn!("llvm.trap", fn() -> void);
|
ifn!("llvm.trap", fn() -> void);
|
||||||
ifn!("llvm.debugtrap", fn() -> void);
|
ifn!("llvm.debugtrap", fn() -> void);
|
||||||
ifn!("llvm.frameaddress", fn(t_i32) -> i8p);
|
ifn!("llvm.frameaddress", fn(t_i32) -> i8p);
|
||||||
|
|
|
@ -1315,6 +1315,14 @@ extern "C" {
|
||||||
Size: &'a Value,
|
Size: &'a Value,
|
||||||
IsVolatile: bool,
|
IsVolatile: bool,
|
||||||
) -> &'a Value;
|
) -> &'a Value;
|
||||||
|
pub fn LLVMRustBuildMemSet(
|
||||||
|
B: &Builder<'a>,
|
||||||
|
Dst: &'a Value,
|
||||||
|
DstAlign: c_uint,
|
||||||
|
Val: &'a Value,
|
||||||
|
Size: &'a Value,
|
||||||
|
IsVolatile: bool,
|
||||||
|
) -> &'a Value;
|
||||||
pub fn LLVMBuildSelect(
|
pub fn LLVMBuildSelect(
|
||||||
B: &Builder<'a>,
|
B: &Builder<'a>,
|
||||||
If: &'a Value,
|
If: &'a Value,
|
||||||
|
|
|
@ -1296,6 +1296,14 @@ extern "C" LLVMValueRef LLVMRustBuildMemMove(LLVMBuilderRef B,
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extern "C" LLVMValueRef LLVMRustBuildMemSet(LLVMBuilderRef B,
|
||||||
|
LLVMValueRef Dst, unsigned DstAlign,
|
||||||
|
LLVMValueRef Val,
|
||||||
|
LLVMValueRef Size, bool IsVolatile) {
|
||||||
|
return wrap(unwrap(B)->CreateMemSet(
|
||||||
|
unwrap(Dst), unwrap(Val), unwrap(Size), DstAlign, IsVolatile));
|
||||||
|
}
|
||||||
|
|
||||||
extern "C" LLVMValueRef
|
extern "C" LLVMValueRef
|
||||||
LLVMRustBuildInvoke(LLVMBuilderRef B, LLVMValueRef Fn, LLVMValueRef *Args,
|
LLVMRustBuildInvoke(LLVMBuilderRef B, LLVMValueRef Fn, LLVMValueRef *Args,
|
||||||
unsigned NumArgs, LLVMBasicBlockRef Then,
|
unsigned NumArgs, LLVMBasicBlockRef Then,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue