aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xbootstrap/cff2bin469728 -> 473824 bytes
-rw-r--r--src/llvm.cff8
-rw-r--r--src/main.cff1
-rw-r--r--src/parse.cff13
4 files changed, 13 insertions, 9 deletions
diff --git a/bootstrap/cff2 b/bootstrap/cff2
index 62a1bef..5a54715 100755
--- a/bootstrap/cff2
+++ b/bootstrap/cff2
Binary files differ
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);
}
diff --git a/src/main.cff b/src/main.cff
index 9f9181c..32aedb2 100644
--- a/src/main.cff
+++ b/src/main.cff
@@ -89,5 +89,6 @@ extern fn main(argc int, argv **u8) int {
let decls = parse(&p);
defer free(decls.#ptr);
if p.error { return 1; }
+ return 0;
}
diff --git a/src/parse.cff b/src/parse.cff
index 45803bf..b1dca70 100644
--- a/src/parse.cff
+++ b/src/parse.cff
@@ -316,9 +316,9 @@ fn lex(P *Parser) Tok {
if ep.tepl {
arg.toks[0].loc = tok.loc;
}
- P.curexpan = memcpy(xmalloc(sizeof Expan), &Expan {
- P.curexpan, {}, arg.toks,
- }, sizeof Expan);
+ let old = P.curexpan;
+ P.curexpan = xcalloc(sizeof Expan, 1);
+ *P.curexpan = { old, {}, arg.toks };
return lex(P);
}
}
@@ -1031,7 +1031,8 @@ fn parseexpandtepl(P *Parser, tepl *Tepl) *const Type {
P.curexpan, args[0::nparam], tepl.toks, tname, tok.loc, #{tepl?} #t,
};
++P.expanno;
- P.curexpan = memcpy(xmalloc(sizeof Expan), &expan, sizeof Expan);
+ P.curexpan = xcalloc(sizeof Expan,1);
+ *P.curexpan = expan;
ty = parseagg(P, loc, tepl.kind, tname, &decl);
}
P.peektok = :None;
@@ -1415,8 +1416,8 @@ fn parseexpandmacro(P *Parser, loc Loc, mac *Macro) void {
P.peektok = :None;
expan.toks = c.body;
++P.expanno;
- P.curexpan = memcpy(xmalloc(sizeof Expan), &expan, sizeof Expan);
-
+ P.curexpan = xmalloc(sizeof Expan);
+ *P.curexpan = expan;
}
fn parseblock0(P *Parser) Block;