aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorlemon <lsof@mailbox.org>2022-08-27 19:00:13 +0200
committerlemon <lsof@mailbox.org>2022-08-27 19:00:13 +0200
commit57e8797417578239de57d8a62d32de403a89fb34 (patch)
tree839c3a7d23be57300b4dcd873867431fc7750f9a
parentf095e30338703c35dc930d264b02a487d7e36933 (diff)
miscellaneous
-rw-r--r--examples/libc.hff1
-rw-r--r--src/fold.cff3
-rw-r--r--src/llvm.cff29
-rw-r--r--src/parse.cff2
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;