From 7518c6d40a973b625784e5e0dc10f0acad310780 Mon Sep 17 00:00:00 2001 From: "Michael D. Lowis" Date: Wed, 28 Apr 2021 11:17:52 -0400 Subject: [PATCH] reorganized folder strcuture to allow fo rmultipl backends --- cerise/backend/test/codegen.c | 87 +++++++++++++++++++++++++++ cerise/{ => backend/x86_64}/codegen.c | 4 -- cerise/build.sh | 9 ++- cerise/examples/generate.sh | 2 +- cerise/examples/operators.c | 29 +++++++++ cerise/{ => inc}/atf.h | 0 cerise/{ => inc}/cerise.h | 0 cerise/{ => src}/const_ops.c | 0 cerise/{ => src}/emalloc.c | 0 cerise/{ => src}/lex.c | 0 cerise/{ => src}/main.c | 0 cerise/{ => src}/parser.c | 0 cerise/value | 0 13 files changed, 124 insertions(+), 7 deletions(-) create mode 100644 cerise/backend/test/codegen.c rename cerise/{ => backend/x86_64}/codegen.c (98%) create mode 100644 cerise/examples/operators.c rename cerise/{ => inc}/atf.h (100%) rename cerise/{ => inc}/cerise.h (100%) rename cerise/{ => src}/const_ops.c (100%) rename cerise/{ => src}/emalloc.c (100%) rename cerise/{ => src}/lex.c (100%) rename cerise/{ => src}/main.c (100%) rename cerise/{ => src}/parser.c (100%) delete mode 100644 cerise/value diff --git a/cerise/backend/test/codegen.c b/cerise/backend/test/codegen.c new file mode 100644 index 0000000..b52c404 --- /dev/null +++ b/cerise/backend/test/codegen.c @@ -0,0 +1,87 @@ +#include "cerise.h" +#include +#include + +Type BoolType = { + .form = FORM_BOOL, + .size = sizeof(bool) +}; + +Type IntType = { + .form = FORM_INT, + .size = sizeof(long) +}; + +Type RealType = { + .form = FORM_REAL, + .size = sizeof(double) +}; + +Type StringType = { + .form = FORM_STRING, + .size = -1 +}; + +void codegen_setint(Item* item, Type* type, long long val) +{ + item->mode = ITEM_CONST; + item->type = type; + item->reg = 0; + item->imm.i = val; +} + +void codegen_setreal(Item* item, double val) +{ + item->mode = ITEM_CONST; + item->type = &RealType; + item->reg = 0; + item->imm.f = val; +} + +void codegen_setstr(Item* item, char* val) +{ + item->mode = ITEM_CONST; + item->type = &StringType; + item->reg = 0; + item->imm.s = val; +} + +void codegen_imports(Parser* p) +{ + (void)p; +} + +void codegen_global(Parser* p, char* name, Type* type) +{ + (void)p, (void)name, (void)type; +} + +void codegen_main(Parser* p) +{ + (void)p; +} + +void codegen_startproc(Parser* p, char* name, long long localsz) +{ + (void)p, (void)name, (void)localsz; +} + +void codegen_endproc(Parser* p) +{ + (void)p; +} + +void codegen_unop(Parser* p, int op, Item* a) +{ + (void)p, (void)op, (void)a; +} + +void codegen_binop(Parser* p, int op, Item* a, Item* b) +{ + (void)p, (void)op, (void)a, (void)b; +} + +void codegen_store(Parser* p, Item* a, Item* b) +{ + (void)p, (void)a, (void)b; +} diff --git a/cerise/codegen.c b/cerise/backend/x86_64/codegen.c similarity index 98% rename from cerise/codegen.c rename to cerise/backend/x86_64/codegen.c index 4997696..ee68ad4 100644 --- a/cerise/codegen.c +++ b/cerise/backend/x86_64/codegen.c @@ -198,10 +198,6 @@ static void load_var(Parser* p, Item* item) break; case ITEM_MVAR: -// puts("MVAR"); -// printf("movq %s, $%lld\n", curr_regname(p), item->imm.i); -// item_dump(item); - printf(" movq %s_%s(%%rip), %s\n", p->name, item->imm.s, diff --git a/cerise/build.sh b/cerise/build.sh index 65e385f..55e2765 100755 --- a/cerise/build.sh +++ b/cerise/build.sh @@ -1,7 +1,12 @@ #!/bin/sh + +CCCMD="cc -g -Wall -Wextra --std=c99 -Iinc/" +BACKEND=backend/x86_64 +TEST_BACKEND=backend/test + ctags -R & -cc -g -D CERISE_TESTS -Wall -Wextra --std=c99 -o cerisec-test *.c \ - && cc -g -Wall -Wextra --std=c99 -o cerisec *.c \ +$CCCMD -D CERISE_TESTS -o cerisec-test src/*.c "$TEST_BACKEND"/*.c \ + && $CCCMD -o cerisec src/*.c "$BACKEND"/*.c \ && ./cerisec-test \ && ./cerisec tests/Module.m | tee tests/Module.s \ && cc -o Module tests/Module.s diff --git a/cerise/examples/generate.sh b/cerise/examples/generate.sh index bd87e1e..48491de 100755 --- a/cerise/examples/generate.sh +++ b/cerise/examples/generate.sh @@ -1,2 +1,2 @@ #!/bin/sh -cc -c -S -o - "$@" | sed -e 's/^\s*\.globl.*$/\n\n&/' +cc -fomit-frame-pointer -c -S -o - "$@" | sed -e 's/^\s*\.globl.*$/\n\n&/' | grep -v '\.cfi' | less diff --git a/cerise/examples/operators.c b/cerise/examples/operators.c new file mode 100644 index 0000000..c9cdbf6 --- /dev/null +++ b/cerise/examples/operators.c @@ -0,0 +1,29 @@ +long A, B; + +void pos(void) { A = +A; } +void neg(void) { A = -A; } + +void inc(void) { A++; } +void dec(void) { A--; } + +void add(void) { A = A + B; } +void sub(void) { A = A - B; } +void mul(void) { A = A * B; } +void div(void) { A = A / B; } +void mod(void) { A = A % B; } + +void eq(void) { A = A == B; } +void neq(void) { A = A != B; } +void lt(void) { A = A < B; } +void lte(void) { A = A <= B; } +void gt(void) { A = A > B; } +void gte(void) { A = A >= B; } + +void shr(void) { A = A >> B; } +void shl(void) { A = A << B; } + +void band(void) { A = A & B; } +void bor(void) { A = A | B; } +void bnot(void) { A = ~A; } +void bxor(void) { A = A ^ B; } + diff --git a/cerise/atf.h b/cerise/inc/atf.h similarity index 100% rename from cerise/atf.h rename to cerise/inc/atf.h diff --git a/cerise/cerise.h b/cerise/inc/cerise.h similarity index 100% rename from cerise/cerise.h rename to cerise/inc/cerise.h diff --git a/cerise/const_ops.c b/cerise/src/const_ops.c similarity index 100% rename from cerise/const_ops.c rename to cerise/src/const_ops.c diff --git a/cerise/emalloc.c b/cerise/src/emalloc.c similarity index 100% rename from cerise/emalloc.c rename to cerise/src/emalloc.c diff --git a/cerise/lex.c b/cerise/src/lex.c similarity index 100% rename from cerise/lex.c rename to cerise/src/lex.c diff --git a/cerise/main.c b/cerise/src/main.c similarity index 100% rename from cerise/main.c rename to cerise/src/main.c diff --git a/cerise/parser.c b/cerise/src/parser.c similarity index 100% rename from cerise/parser.c rename to cerise/src/parser.c diff --git a/cerise/value b/cerise/value deleted file mode 100644 index e69de29..0000000 -- 2.49.0