diff options
Diffstat (limited to 'tests/codegen_test.c')
| -rw-r--r-- | tests/codegen_test.c | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/tests/codegen_test.c b/tests/codegen_test.c index 24cac6d..2b5fdb7 100644 --- a/tests/codegen_test.c +++ b/tests/codegen_test.c @@ -41,6 +41,24 @@ static void generate_fasm_to_buffer(struct Program* program, char* buffer, size_ fclose(out); } +static void generate_aarch64_to_buffer(struct Program* program, char* buffer, size_t size) +{ + FILE* out = tmpfile(); + if (out == NULL) + { + buffer[0] = '\0'; + return; + } + + generate_aarch64(program, out); + fflush(out); + rewind(out); + + size_t read = fread(buffer, 1, size - 1, out); + buffer[read] = '\0'; + fclose(out); +} + static void test_generate_consts_and_data(struct TestContext* context) { struct Lexer lexer = create_lexer("const N = 5\ndata msg = \"hi\"\n"); @@ -86,6 +104,31 @@ static void test_generate_fasm(struct TestContext* context) free_program(&program); } +static void test_generate_aarch64(struct TestContext* context) +{ + // logical registers map r1 -> x0, r2 -> x1; three-operand arithmetic and svc + struct Lexer lexer = create_lexer( + "[enable: logical_registers]\nproc main\n{\nr1 = 5\nr1 = r1 + r2\n" + "while r2 > 0\nr2 = r2 - 1\nsyscall\n}\n"); + struct Program program; + check(context, parse_program(&lexer, &program)); + + char buffer[1024]; + generate_aarch64_to_buffer(&program, buffer, sizeof(buffer)); + + check(context, strstr(buffer, ".text") != NULL); + check(context, strstr(buffer, "mov x0, #5") != NULL); // r1 = 5 + check(context, strstr(buffer, "add x0, x0, x1") != NULL); // r1 = r1 + r2 + check(context, strstr(buffer, "cmp x1, #0") != NULL); // while r2 > 0 + check(context, strstr(buffer, "sub x1, x1, #1") != NULL); // r2 = r2 - 1 + check(context, strstr(buffer, "svc #0") != NULL); // syscall + // no x86 leaked in + check(context, strstr(buffer, "rax") == NULL); + check(context, strstr(buffer, "; TODO") == NULL); + + free_program(&program); +} + static void test_generate_text(struct TestContext* context) { struct Lexer lexer = create_lexer( @@ -589,6 +632,7 @@ void run_codegen_tests(struct TestContext* context) test_generate_no_entry(context); test_generate_consts_and_data(context); test_generate_fasm(context); + test_generate_aarch64(context); test_generate_text(context); test_generate_if(context); test_generate_if_else(context); |
