From a582666135ad4bb1e0f5119e1b5c6bbf68044394 Mon Sep 17 00:00:00 2001 From: lemon Date: Wed, 31 Aug 2022 15:37:27 +0200 Subject: self hosting !!! with some workarounds though . --- bootstrap/cff2 | Bin 469728 -> 473824 bytes src/llvm.cff | 8 +++++--- src/main.cff | 1 + src/parse.cff | 13 +++++++------ 4 files changed, 13 insertions(+), 9 deletions(-) diff --git a/bootstrap/cff2 b/bootstrap/cff2 index 62a1bef..5a54715 100755 Binary files a/bootstrap/cff2 and b/bootstrap/cff2 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; -- cgit v1.2.3