aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMustafa Quraish <[email protected]>2022-01-31 02:53:35 -0500
committerMustafa Quraish <[email protected]>2022-01-31 02:53:35 -0500
commitbdf0641c5c012ff91058632f697b4d49238628ca (patch)
treea2c5ab69d8c2e558ad8d3ce75dffc3dfa3fcdcde /src
parentFix offset for local variables (diff)
downloadcup-bdf0641c5c012ff91058632f697b4d49238628ca.tar.xz
cup-bdf0641c5c012ff91058632f697b4d49238628ca.zip
Minor fixes to code generation
(1) Prefix function names with `func_` now, to avoid clasing with possible NASM keywords (such as `abs`). (2) Label numbers are now properly handed for conditional expressions.
Diffstat (limited to 'src')
-rw-r--r--src/generator.c22
1 files changed, 11 insertions, 11 deletions
diff --git a/src/generator.c b/src/generator.c
index 5b1f630..b141dce 100644
--- a/src/generator.c
+++ b/src/generator.c
@@ -35,7 +35,7 @@ void generate_func_call(Node *node, FILE *out)
// TODO: Also make sure of padding and stuff?
total_size += 8;
}
- fprintf(out, " call %s\n", node->call.func->func.name);
+ fprintf(out, " call func_%s\n", node->call.func->func.name);
fprintf(out, " add rsp, %lld\n", total_size);
}
@@ -203,18 +203,18 @@ void generate_expr_into_rax(Node *expr, FILE *out)
label_counter++;
} else if (expr->type == AST_CONDITIONAL) {
+ int cur_label = label_counter++;
generate_expr_into_rax(expr->conditional.cond, out);
// If left is false, we can short-circuit
fprintf(out, " cmp rax, 0\n");
- fprintf(out, " je .cond_else_%d\n", label_counter);
+ fprintf(out, " je .cond_else_%d\n", cur_label);
generate_expr_into_rax(expr->conditional.do_then, out);
- fprintf(out, " jmp .cond_end_%d\n", label_counter);
- fprintf(out, ".cond_else_%d:\n", label_counter);
+ fprintf(out, " jmp .cond_end_%d\n", cur_label);
+ fprintf(out, ".cond_else_%d:\n", cur_label);
generate_expr_into_rax(expr->binary.right, out);
// Booleanize the result
generate_expr_into_rax(expr->conditional.do_else, out);
- fprintf(out, ".cond_end_%d:\n", label_counter);
- label_counter++;
+ fprintf(out, ".cond_end_%d:\n", cur_label);
} else {
fprintf(stderr, "Unsupported expression type in generate_expr: `%s`\n", node_type_to_str(expr->type));
@@ -312,8 +312,8 @@ void generate_block(Node *block, FILE *out)
void generate_function_header(Node *func, FILE *out)
{
assert(func->type == AST_FUNC);
- fprintf(out, "global %s\n", func->func.name);
- fprintf(out, "%s:\n", func->func.name);
+ fprintf(out, "global func_%s\n", func->func.name);
+ fprintf(out, "func_%s:\n", func->func.name);
// TODO: Only do this if we have local variables
fprintf(out, " push rbp\n");
fprintf(out, " mov rbp, rsp\n");
@@ -358,7 +358,7 @@ void generate_asm(Node *root, FILE *out)
fprintf(out, "global _start\n");
fprintf(out, "_start:\n");
#endif
- fprintf(out, " call main\n");
+ fprintf(out, " call func_main\n");
fprintf(out, " mov rdi, rax\n");
make_syscall(SYS_exit, out);
@@ -372,7 +372,7 @@ void generate_builtins(FILE *out)
// Stolen shamelessly from tsoding/porth:
// https://gitlab.com/tsoding/porth
fprintf(out,
- "print:\n"
+ "func_print:\n"
" mov rdi, [rsp+8]\n"
" mov r9, -3689348814741910323\n"
" sub rsp, 40\n"
@@ -433,7 +433,7 @@ void generate_builtins(FILE *out)
// Print out a single character
fprintf(out,
- "putc:\n"
+ "func_putc:\n"
" mov rdi, 1\n" // stdout
" mov rsi, rsp\n"
" add rsi, 8\n"