diff options
Diffstat (limited to 'src/llvm.cff')
| -rw-r--r-- | src/llvm.cff | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/src/llvm.cff b/src/llvm.cff index b0b1027..b4ef10e 100644 --- a/src/llvm.cff +++ b/src/llvm.cff @@ -327,7 +327,7 @@ fn genref(f *Fn, ex *Expr) Ref { case AggIni ini; let tmp = gentmp(mkptrtype(ex.ty), "alloca %t", ex.ty); - gen("\tstore %t zeroinitializer, %t %v\n", ex.ty, tmp.ty, &tmp); + gen("\tcall void @llvm.memset.p0.%t(ptr %v, i8 0, %t %z, i1 false)\n", ty_usize, &tmp, ty_usize, ex.ty.size); foreach(fld, i, ini.flds) { let fex = &ini.exs[i]; let ptr = mktmp(mkptrtype(fex.ty)); @@ -347,7 +347,7 @@ fn genref(f *Fn, ex *Expr) Ref { case ArrIni ini; let ty = mkarrtype(ini.maxn, #f, ex.ty.u.Arr.child); let tmp = gentmp(mkptrtype(ty), "alloca %t", ty); - gen("\tstore %t zeroinitializer, %t %v\n", ty, tmp.ty, &tmp); + gen("\tcall void @llvm.memset.p0.%t(ptr %v, i8 0, %t %z, i1 false)\n", ty_usize, &tmp, ty_usize, ty.size); foreach(idx, i, ini.idxs) { let fex = &ini.exs[i]; let ptr = mktmp(mkptrtype(fex.ty)); @@ -976,7 +976,7 @@ fn genexpr(f *Fn, ex *Expr) Value { let t0 = mktmp(mkptrtype(ex.ty)); let vidx = ini.var - ex.ty.u.Agg.flds.#ptr; gen("\t%v = alloca %t\n", &t0, ex.ty); - gen("\tstore %t zeroinitializer, ptr %v\n", ex.ty, &t0); + gen("\tcall void @llvm.memset.p0.%t(ptr %v, i8 0, %t %z, i1 false)\n", ty_usize, &t0, ty_usize, ex.ty.size); gen("\tstore %t %d, ptr %v\n", ex.ty.u.Agg.enumty, vidx, &t0); if ini.var.ty != #null { let tini = convert(f, ini.var.ty, ini.ex); @@ -1503,6 +1503,8 @@ extern fn llvm_fini() void { gen("declare void @llvm.va_start(ptr)\n"); gen("declare void @llvm.va_copy(ptr, ptr)\n"); gen("declare void @llvm.va_end(ptr)\n"); + gen("declare void @llvm.memset.p0.i32(ptr, i8, i32, i1)\n"); + gen("declare void @llvm.memset.p0.i64(ptr, i8, i64, i1)\n"); vec_each(s, i, strs) { gen("@.str.%z = private unnamed_addr constant [%z x i8] c%S;\n", i, s.#len + 1, &s); } |