/* * 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 . */ #ifndef GAS_ASSEMBLY_GENERATOR_H #define GAS_ASSEMBLY_GENERATOR_H #include "ast.h" #include "vector.h" #include typedef enum evaluation_result_kind_t { EVALUATION_RESULT_VOID, EVALUATION_RESULT_ON_RAX, EVALUATION_RESULT_ON_STACK, EVALUATION_RESULT_AS_LITERAL_INTEGER } evaluation_result_kind_t; typedef union evaluation_result_data_t { int64_t literal_int; int stack_offset; } evaluation_result_data_t; typedef struct evaluation_result_t { evaluation_result_kind_t kind; evaluation_result_data_t data; } evaluation_result_t; typedef struct gas_assembly_generator_t { FILE *stream; vector_t *refs; int stack_offset; uint64_t label_counter; evaluation_result_t latest_evaluation; } gas_assembly_generator_t; void gas_assembly_generator_init(gas_assembly_generator_t *gen, FILE *stream); void gas_assembly_generator_compile(gas_assembly_generator_t *gen, ast_node_t *ast); #endif /* GAS_ASSEMBLY_GENERATOR_H */