summaryrefslogtreecommitdiff
path: root/src/gas_assembly_generator.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/gas_assembly_generator.c')
-rw-r--r--src/gas_assembly_generator.c70
1 files changed, 36 insertions, 34 deletions
diff --git a/src/gas_assembly_generator.c b/src/gas_assembly_generator.c
index 5572cb7..00897fd 100644
--- a/src/gas_assembly_generator.c
+++ b/src/gas_assembly_generator.c
@@ -1,40 +1,42 @@
/*
-* Copyright (C) 2023 Johnny Richard
-*
-* This program is free software: you can redistribute it and/or modify
-* it under the terms of the GNU General Public License as published by
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program. If not, see <https://www.gnu.org/licenses/>.
-*/
+ * Copyright (C) 2023 Johnny Richard
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
#include "gas_assembly_generator.h"
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
-static void gas_assembly_generator_visit_function(ast_visitor_t *visitor, ast_function_declaration_t *func);
-static void gas_assembly_generator_visit_return_stmt(ast_visitor_t *visitor, ast_return_stmt_t *return_stmt);
-static void gas_assembly_generator_visit_literal(ast_visitor_t *visitor, ast_literal_t *literal);
-static void gas_assembly_generator_binary_operation(ast_visitor_t *visitor, ast_binary_operation_t *binary_operation);
+static void
+gas_assembly_generator_visit_function(ast_visitor_t *visitor, ast_function_declaration_t *func);
+static void
+gas_assembly_generator_visit_return_stmt(ast_visitor_t *visitor, ast_return_stmt_t *return_stmt);
+static void
+gas_assembly_generator_visit_literal(ast_visitor_t *visitor, ast_literal_t *literal);
+static void
+gas_assembly_generator_binary_operation(ast_visitor_t *visitor, ast_binary_operation_t *binary_operation);
void
gas_assembly_generator_init(gas_assembly_generator_t *gen, FILE *out)
{
assert(gen && out);
- gen->super = (ast_visitor_t) {
- .visit_function = &gas_assembly_generator_visit_function,
- .visit_literal = &gas_assembly_generator_visit_literal,
- .visit_return_stmt = &gas_assembly_generator_visit_return_stmt,
- .visit_binary_operation = &gas_assembly_generator_binary_operation
- };
+ gen->super = (ast_visitor_t){ .visit_function = &gas_assembly_generator_visit_function,
+ .visit_literal = &gas_assembly_generator_visit_literal,
+ .visit_return_stmt = &gas_assembly_generator_visit_return_stmt,
+ .visit_binary_operation = &gas_assembly_generator_binary_operation };
gen->out = out;
}
@@ -48,13 +50,13 @@ gas_assembly_generator_visit_function(ast_visitor_t *visitor, ast_function_decla
exit(EXIT_FAILURE);
}
- gas_assembly_generator_t *gen = (gas_assembly_generator_t *) visitor;
+ gas_assembly_generator_t *gen = (gas_assembly_generator_t *)visitor;
- fprintf(gen->out,".global _start\n");
- fprintf(gen->out,".text\n");
- fprintf(gen->out,"_start:\n");
+ fprintf(gen->out, ".global _start\n");
+ fprintf(gen->out, ".text\n");
+ fprintf(gen->out, "_start:\n");
- for (size_t i=0; i < func->body->size; i++) {
+ for (size_t i = 0; i < func->body->size; i++) {
ast_visitor_visit(visitor, vector_at(func->body, i));
}
}
@@ -63,7 +65,7 @@ static void
gas_assembly_generator_visit_return_stmt(ast_visitor_t *visitor, ast_return_stmt_t *return_stmt)
{
assert(visitor && return_stmt);
- gas_assembly_generator_t *gen = (gas_assembly_generator_t *) visitor;
+ gas_assembly_generator_t *gen = (gas_assembly_generator_t *)visitor;
ast_visitor_visit(visitor, return_stmt->argument);
@@ -75,7 +77,7 @@ gas_assembly_generator_visit_return_stmt(ast_visitor_t *visitor, ast_return_stmt
static void
gas_assembly_generator_visit_literal(ast_visitor_t *visitor, ast_literal_t *literal)
{
- gas_assembly_generator_t *gen = (gas_assembly_generator_t *) visitor;
+ gas_assembly_generator_t *gen = (gas_assembly_generator_t *)visitor;
switch (literal->kind) {
case AST_LITERAL_INTEGER:
fprintf(gen->out, " mov $%d, %%rax\n", literal->value.integer);
@@ -88,7 +90,7 @@ gas_assembly_generator_visit_literal(ast_visitor_t *visitor, ast_literal_t *lite
static void
gas_assembly_generator_binary_operation(ast_visitor_t *visitor, ast_binary_operation_t *binary_operation)
{
- gas_assembly_generator_t *gen = (gas_assembly_generator_t *) visitor;
+ gas_assembly_generator_t *gen = (gas_assembly_generator_t *)visitor;
ast_visitor_visit(visitor, binary_operation->right);
@@ -119,6 +121,6 @@ gas_assembly_generator_binary_operation(ast_visitor_t *visitor, ast_binary_opera
return;
}
- fprintf(stderr, "no strategy defined for: "SVFMT"\n", SVARG(&binary_operation->op));
+ fprintf(stderr, "no strategy defined for: " SVFMT "\n", SVARG(&binary_operation->op));
assert(false);
}