diff options
Diffstat (limited to 'src/gas_assembly_generator.c')
-rw-r--r-- | src/gas_assembly_generator.c | 70 |
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); } |