aboutsummaryrefslogtreecommitdiffstats
path: root/src/compiler.h
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2021-11-10 17:13:56 +0100
committerBad Diode <bd@badd10de.dev>2021-11-10 17:13:56 +0100
commit09406d74711fd241a16f4e0d4cc76bfa11e42a60 (patch)
treeca71813665031687c9c6d2bc1bb090a901d51dea /src/compiler.h
parent69f6b03296f96a60dd7fc103ff89d187f1a29aec (diff)
downloadbdl-09406d74711fd241a16f4e0d4cc76bfa11e42a60.tar.gz
bdl-09406d74711fd241a16f4e0d4cc76bfa11e42a60.zip
Add initial local definition/access
Diffstat (limited to 'src/compiler.h')
-rw-r--r--src/compiler.h39
1 files changed, 35 insertions, 4 deletions
diff --git a/src/compiler.h b/src/compiler.h
index fe36ecf..023a039 100644
--- a/src/compiler.h
+++ b/src/compiler.h
@@ -23,6 +23,7 @@ do { \
23 array_insert(current_context, buf, n_chars); \ 23 array_insert(current_context, buf, n_chars); \
24} while(false); 24} while(false);
25 25
26static Environment *current_env = NULL;
26 27
27// TODO: Separate c/h files 28// TODO: Separate c/h files
28// TODO: Create a "driver.c" file with the (display) function for external 29// TODO: Create a "driver.c" file with the (display) function for external
@@ -51,7 +52,7 @@ do { \
51void compile_object(Object *obj); 52void compile_object(Object *obj);
52void compile_fixnum(Object *obj); 53void compile_fixnum(Object *obj);
53void compile_proc_call(Object *obj); 54void compile_proc_call(Object *obj);
54void compile(Root *roots); 55void compile(Program program);
55 56
56char * 57char *
57generate_label(char *prefix) { 58generate_label(char *prefix) {
@@ -506,6 +507,25 @@ compile_lambda(Object *obj) {
506} 507}
507 508
508void 509void
510compile_def(Object *obj) {
511 context_printf(" ;; --> compile_def\n");
512 compile_object(obj->var_expr);
513 ssize_t idx = find_local_index(current_env->locals, obj->var_name);
514 context_printf(" pop rax\n");
515 context_printf(" mov [rbp + %ld], rax\n", 8 * (idx + 1));
516 context_printf(" ;; <-- compile_def\n");
517}
518
519void
520compile_symbol(Object *obj) {
521 context_printf(" ;; --> compile_symbol\n");
522 ssize_t idx = find_local_index(current_env->locals, obj);
523 context_printf(" mov rax, [rbp + %ld]\n", 8 * (idx + 1));
524 context_printf(" push rax\n");
525 context_printf(" ;; <-- compile_symbol\n");
526}
527
528void
509compile_object(Object *obj) { 529compile_object(Object *obj) {
510 switch (obj->type) { 530 switch (obj->type) {
511 case OBJ_TYPE_NIL: { compile_nil(); } break; 531 case OBJ_TYPE_NIL: { compile_nil(); } break;
@@ -516,6 +536,8 @@ compile_object(Object *obj) {
516 case OBJ_TYPE_STRING: { compile_string(obj); } break; 536 case OBJ_TYPE_STRING: { compile_string(obj); } break;
517 case OBJ_TYPE_IF: { compile_if(obj); } break; 537 case OBJ_TYPE_IF: { compile_if(obj); } break;
518 case OBJ_TYPE_LAMBDA: { compile_lambda(obj); } break; 538 case OBJ_TYPE_LAMBDA: { compile_lambda(obj); } break;
539 case OBJ_TYPE_DEF: { compile_def(obj); } break;
540 case OBJ_TYPE_SYMBOL: { compile_symbol(obj); } break;
519 default: break; 541 default: break;
520 } 542 }
521} 543}
@@ -555,16 +577,17 @@ emit_data_section(void) {
555} 577}
556 578
557void 579void
558compile(Root *roots) { 580compile(Program program) {
559 // Prepare compilation variables. 581 // Prepare compilation variables.
560 array_init(constants, 0); 582 array_init(constants, 0);
561 array_init(labels, 0); 583 array_init(labels, 0);
562 array_init(procedures, 0); 584 array_init(procedures, 0);
563 array_init(current_context, 0); 585 array_init(current_context, 0);
586 current_env = program.env;
564 587
565 // Compile program. 588 // Compile program.
566 for (size_t i = 0; i < array_size(roots); i++) { 589 for (size_t i = 0; i < array_size(program.roots); i++) {
567 Object *root = roots[i]; 590 Object *root = program.roots[i];
568 compile_object(root); 591 compile_object(root);
569 } 592 }
570 593
@@ -604,7 +627,15 @@ compile(Root *roots) {
604 printf("alignb 8\n"); 627 printf("alignb 8\n");
605 printf("global _start\n"); 628 printf("global _start\n");
606 printf("_start:\n"); 629 printf("_start:\n");
630
631 // Initialize heap pointer.
607 printf(" mov r15, bdl_heap\n"); 632 printf(" mov r15, bdl_heap\n");
633
634 // Initialize main locals.
635 printf(" sub rsp, %zu\n", 8 * array_size(program.env->locals));
636 printf(" mov rbp, rsp\n");
637
638 // Keep the bottom stack value set as NIL_VAL for a default return value.
608 printf(" push NIL_VAL\n"); 639 printf(" push NIL_VAL\n");
609 for (size_t i = 0; i < array_size(current_context); i++) { 640 for (size_t i = 0; i < array_size(current_context); i++) {
610 putchar(current_context[i]); 641 putchar(current_context[i]);