aboutsummaryrefslogtreecommitdiff
path: root/src/generator.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/generator.c')
-rw-r--r--src/generator.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/src/generator.c b/src/generator.c
index 6fcccbf..2fb89b7 100644
--- a/src/generator.c
+++ b/src/generator.c
@@ -50,13 +50,21 @@ void generate_expr_into_rax(Node *expr, FILE *out);
void generate_lvalue_into_rax(Node *node, FILE *out)
{
assert(is_lvalue(node->type));
- i64 offset = node->variable->offset;
if (node->type == AST_LOCAL_VAR) {
+ i64 offset = node->variable->offset;
fprintf(out, " mov rax, rbp\n");
fprintf(out, " sub rax, %lld\n", offset);
} else if (node->type == AST_GLOBAL_VAR) {
+ i64 offset = node->variable->offset;
fprintf(out, " mov rax, global_vars\n");
fprintf(out, " add rax, %lld\n", offset);
+ } else if (node->type == OP_MEMBER) {
+ i64 offset = node->member.offset;
+ if (node->member.is_ptr)
+ generate_expr_into_rax(node->member.expr, out);
+ else
+ generate_lvalue_into_rax(node->member.expr, out);
+ fprintf(out, " add rax, %lld\n", offset);
} else if (node->type == OP_DEREF) {
generate_expr_into_rax(node->unary_expr, out);
} else {