106 lines
2.0 KiB
C
106 lines
2.0 KiB
C
#include "codegen_x86.h"
|
|
#include "ir.h"
|
|
#include "jit_x86.h"
|
|
#include "parse.h"
|
|
#include <assert.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
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;
|
|
}
|