diff options
| author | 2022-08-27 19:00:13 +0200 | |
|---|---|---|
| committer | 2022-08-27 19:00:13 +0200 | |
| commit | 57e8797417578239de57d8a62d32de403a89fb34 (patch) | |
| tree | 839c3a7d23be57300b4dcd873867431fc7750f9a | |
| parent | f095e30338703c35dc930d264b02a487d7e36933 (diff) | |
miscellaneous
| -rw-r--r-- | examples/libc.hff | 1 | ||||
| -rw-r--r-- | src/fold.cff | 3 | ||||
| -rw-r--r-- | src/llvm.cff | 29 | ||||
| -rw-r--r-- | src/parse.cff | 2 |
4 files changed, 28 insertions, 7 deletions
diff --git a/examples/libc.hff b/examples/libc.hff index 488a495..3a3ce24 100644 --- a/examples/libc.hff +++ b/examples/libc.hff @@ -11,6 +11,7 @@ extern fn fopen(path *const u8, mode *const u8) *FILE; extern fn fclose(*FILE) int; extern fn fgetc(*FILE) int; extern fn fputc(int, *FILE) int; +extern fn fread(*void, usize, usize, *FILE) usize; def EOF = -1; // stdlib.h diff --git a/src/fold.cff b/src/fold.cff index dd16f2a..acfd613 100644 --- a/src/fold.cff +++ b/src/fold.cff @@ -99,7 +99,8 @@ fn fbinary(ex *Expr) void { let ty = unconstify(ex.ty); let op = ex.u.BinOp.op; - if !fold(l) or !fold(r) { + let fl = fold(l), fr = fold(r); + if !fl or !fr { return; } if ty->is(:Bool) { diff --git a/src/llvm.cff b/src/llvm.cff index fd853f0..2b49337 100644 --- a/src/llvm.cff +++ b/src/llvm.cff @@ -142,7 +142,7 @@ fn gen(fmt *const u8, ...) void { fprintf(outfp, "%lld", as(c_llong)ap->arg(i64)); case 'f'; let f f64 = as(f32)ap->arg(f64); - fprintf(outfp, "%#.16llx", *as(*u64)&f); + fprintf(outfp, "0x%.16llx", *as(*u64)&f); case 'F'; fprintf(outfp, "%e", ap->arg(f64)); case 'z'; @@ -434,7 +434,7 @@ fn convert(f *Fn, to *const Type, ex *Expr) Value { let val = genexpr(f, ex); gen("\t%v = fptosi %t %v to %t\n", t0, from, val, ty_int); let t1 = mktmp(to); - gen("\t%v =%s %t %v to %t\n", t1, to.u.Int.sgn ? "sext" : "zext", t0.ty, t0, to); + gen("\t%v = trunc %t %v to %t\n", t1, t0.ty, t0, to); return t1; case to->is(:Int) and from->is(:Flo); @@ -580,8 +580,8 @@ fn genexpr(f *Fn, ex *Expr) Value { case '^'; return genbinop(b.lhs, b.rhs, "xor"); case '<<'; return genbinop(b.lhs, b.rhs, "shl"); case '>>'; return genbinop(b.lhs, b.rhs, ex.ty.u.Int.sgn ? "ashr" : "lshr"); - case '=='; gencmp("eq"); - case '!='; gencmp("ne"); + case '=='; gencmp(ty2->is(:Flo) ? "oeq" : "eq"); + case '!='; gencmp(ty2->is(:Flo) ? "une" : "ne"); case '<'; gencmp(ty2->is(:Flo) ? "olt" : ty2.u.Int.sgn ? "slt" : "ult"); case '<='; gencmp(ty2->is(:Flo) ? "ole" : ty2.u.Int.sgn ? "sle" : "ule"); case '>'; gencmp(ty2->is(:Flo) ? "ogt" : ty2.u.Int.sgn ? "sgt" : "ugt"); @@ -1227,6 +1227,20 @@ struct I64Traits { } fn gendata(ty *const Type, ex *Expr) void { + + fn dataaddr(ex *Expr) void { + switch ex.u { + case Symbol decl; + switch decl.u { + case Fn f; + if !decl.externp { gen("@%s.%d", decl.name, f.id); + } else { gen("@%s", decl.name); } + return; + } + } + assert(#f, "bad static addr"); + } + fold(ex); switch ex.u { case IntLit i; return gen("%I", i.i); @@ -1241,6 +1255,11 @@ fn gendata(ty *const Type, ex *Expr) void { strs->push(s); return gen("@.str.%z", strs.len - 1); } + case UnOp un; + switch un.op { + case :addrof; + return dataaddr(un.ex); + } case ArrIni ini; assert(ty->is(:Arr), "not arr arr ini"); @@ -1265,7 +1284,7 @@ fn gendata(ty *const Type, ex *Expr) void { gen(" ]"); return; } - assert(#f, "bad static"); + assert(#f, "bad static %d", ex.u.#tag); } extern fn llvm_genstatic(externp bool, name *const u8, var *Var) void { diff --git a/src/parse.cff b/src/parse.cff index ea965d6..a065739 100644 --- a/src/parse.cff +++ b/src/parse.cff @@ -695,7 +695,7 @@ fn parseenum(P *Parser, name *const u8, lax bool) *const Type { fn isdecltokt(t TokT) bool { switch t { case :kw_fn, :kw_static, :kw_def, :kw_defmacro, :kw_struct, :kw_union, :kw_enum, - :kw_extern, :kw_bitfield; + :kw_extern, :kw_bitfield, :kw_typedef; return #t; } return #f; |