#include "codegen_x86.h" #include "ir.h" #include "jit_x86.h" #include "parse.h" #include #include #include #include static char* read_file(const char* filename) { FILE* file = fopen(filename, "rb"); if (!file) { perror("fopen"); return NULL; } if (fseek(file, 0, SEEK_END) != 0) { perror("fseek"); fclose(file); return NULL; } long size = ftell(file); if (size < 0) { perror("ftell"); fclose(file); return NULL; } rewind(file); char* buffer = malloc((size_t)size + 1); if (!buffer) { fprintf(stderr, "Out of memory\n"); fclose(file); return NULL; } size_t bytes_read = fread(buffer, 1, (size_t)size, file); if (bytes_read != (size_t)size) { perror("fread"); free(buffer); fclose(file); return NULL; } buffer[size] = '\0'; fclose(file); return buffer; } int main(int argc, char** argv) { if (argc > 1 && strcmp(argv[1], "--test") == 0) { test_parse(); test_ast_lower(); test_codegen_x86(); return 0; } assert(argc > 1); char* text = read_file(argv[1]); printf("--- text ---\n"); puts(text); Expr* expr = parse(text); free(text); printf("--- ast ---\n"); expr_print(expr); IrBlock ir_block; ir_block_init(&ir_block); ir_lower_expr(&ir_block, expr); expr_free(expr); printf("\n--- ir ---\n"); ir_block_print(&ir_block); CgBlock cg_block; cg_block_init(&cg_block); ir_block_isel_x86(&cg_block, &ir_block); ir_block_free(&ir_block); printf("--- isel ---\n"); cg_block_print_vreg(&cg_block); printf("--- regalloc ---\n"); cg_block_regalloc_x86(&cg_block); cg_block_print_phys(&cg_block); JitFn fn = cg_block_emit_x86_machine_code(&cg_block); cg_block_free(&cg_block); printf("--- result ---\n"); uint64_t result = fn(); printf("%lu\n", result); return 0; }