aboutsummaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/codegen_test.c44
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);