aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorlemon <lsof@mailbox.org>2022-08-25 06:13:58 +0200
committerlemon <lsof@mailbox.org>2022-08-25 06:13:58 +0200
commit033e0fc64415dcaebf15ec26f743e8916fc0aa03 (patch)
treea851cfa66289e9a3f8f8b3d01a0731606763298b
parent4f479ac68028a89c8e545f72335642c42a5c4efe (diff)
iswitch
-rw-r--r--src/llvm.cff23
-rw-r--r--test/1.cff17
-rw-r--r--test/libc.hff32
-rw-r--r--vgcore.215350bin7004160 -> 0 bytes
4 files changed, 72 insertions, 0 deletions
diff --git a/src/llvm.cff b/src/llvm.cff
index e64d2e3..9ad67a2 100644
--- a/src/llvm.cff
+++ b/src/llvm.cff
@@ -883,6 +883,29 @@ fn genstmt(f *Fn, block *Block, st *Stmt) void {
let retty = f.ty.u.Fn.ret;
gen("\tret %t %v\n", retty, convert(f, retty, e));
}
+ case ISwitch *sw;
+ static swid int = {};
+ let id = swid++;
+ let test = genexpr(f, &sw.ex);
+ gen("\tswitch %t %v, label %%ISx%d [", test.ty, test);
+ foreach (c, i, sw.cs) {
+ foreach_ptr (ex, _, c.es) {
+ let t = convert(f, test.ty, ex);
+ gen(" %t %v, label %%IS%d.%d ", t.ty, t, id, i);
+ }
+ }
+ gen(" ]\n");
+ foreach (c, i, sw.cs) {
+ gen("IS%d.%d: ", id, i);
+ genblock(f, c.t);
+ gen("\tbr label %%ISe%d\n", id);
+ }
+ gen("ISx%d: ", id);
+ genblock(f, sw.f);
+ gen("\tbr label %%ISe%d\n", id);
+ gen("ISe%d: ", id);
+ nop();
+
case else
assert(#f, "stmt? %d", st.u.#tag);
}
diff --git a/test/1.cff b/test/1.cff
new file mode 100644
index 0000000..cdda6b9
--- /dev/null
+++ b/test/1.cff
@@ -0,0 +1,17 @@
+import "libc.hff";
+
+extern fn main(argc int) int {
+ switch argc - 1 {
+ case 0, 1;
+ printf("zero or one\n");
+ case -1;
+ printf("???\n");
+ case 2;
+ printf("two");
+ printf("\n");
+ case 7;
+ //empty
+ case else
+ printf("its %d\n", argc);
+ }
+}
diff --git a/test/libc.hff b/test/libc.hff
new file mode 100644
index 0000000..488a495
--- /dev/null
+++ b/test/libc.hff
@@ -0,0 +1,32 @@
+// stdio.h
+struct FILE;
+extern static stdin *FILE,
+ stdout *FILE,
+ stderr *FILE;
+extern fn printf(fmt *const u8, ...) int;
+extern fn fprintf(fp *FILE, fmt *const u8, ...) int;
+extern fn sprintf(*u8, fmt *const u8, ...) int;
+extern fn snprintf(*u8, usize, fmt *const u8, ...) int;
+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;
+def EOF = -1;
+
+// stdlib.h
+extern fn abort() void;
+extern fn exit(c int) void;
+extern fn perror(s *const u8) void;
+extern fn malloc(n usize) *void;
+extern fn calloc(n usize, m usize) *void;
+extern fn realloc(p *void, n usize) *void;
+extern fn free(p *void) void;
+
+// string.h
+extern fn strlen(s *const u8) usize;
+extern fn strcmp(a *const u8, b *const u8) int;
+extern fn memcpy(*void, *const void, usize) *void;
+extern fn strcpy(*u8, *const u8) *u8;
+
+//ctype.h
+extern fn tolower(int) int;
diff --git a/vgcore.215350 b/vgcore.215350
deleted file mode 100644
index f55e2bf..0000000
--- a/vgcore.215350
+++ /dev/null
Binary files differ