diff options
| author | 2022-08-25 06:13:58 +0200 | |
|---|---|---|
| committer | 2022-08-25 06:13:58 +0200 | |
| commit | 033e0fc64415dcaebf15ec26f743e8916fc0aa03 (patch) | |
| tree | a851cfa66289e9a3f8f8b3d01a0731606763298b | |
| parent | 4f479ac68028a89c8e545f72335642c42a5c4efe (diff) | |
iswitch
| -rw-r--r-- | src/llvm.cff | 23 | ||||
| -rw-r--r-- | test/1.cff | 17 | ||||
| -rw-r--r-- | test/libc.hff | 32 | ||||
| -rw-r--r-- | vgcore.215350 | bin | 7004160 -> 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 Binary files differdeleted file mode 100644 index f55e2bf..0000000 --- a/vgcore.215350 +++ /dev/null |