diff options
| author | Andrew Kelley <superjoe30@gmail.com> | 2015-12-12 02:34:09 -0700 |
|---|---|---|
| committer | Andrew Kelley <superjoe30@gmail.com> | 2015-12-12 02:34:09 -0700 |
| commit | 38f12adbda5d3b0114232fdccdbcc0b4179f9115 (patch) | |
| tree | 5016bcd2cccea018738aa30c9bb7e91b2aaa9c2b /src/codegen.cpp | |
| parent | ac630d354d51488d895bc14e26a069ae954ac5c6 (diff) | |
| download | zig-38f12adbda5d3b0114232fdccdbcc0b4179f9115.tar.gz zig-38f12adbda5d3b0114232fdccdbcc0b4179f9115.zip | |
progress on struct support
Diffstat (limited to 'src/codegen.cpp')
| -rw-r--r-- | src/codegen.cpp | 24 |
1 files changed, 19 insertions, 5 deletions
diff --git a/src/codegen.cpp b/src/codegen.cpp index c43d3f997d..7329f53d91 100644 --- a/src/codegen.cpp +++ b/src/codegen.cpp @@ -194,6 +194,7 @@ static LLVMValueRef gen_array_ptr(CodeGen *g, AstNode *node) { LLVMConstInt(LLVMInt32Type(), 0, false), subscript_value }; + add_debug_source_node(g, node); return LLVMBuildInBoundsGEP(g->builder, array_ref_value, indices, 2, ""); } @@ -206,6 +207,7 @@ static LLVMValueRef gen_field_val(CodeGen *g, AstNode *node) { FieldAccessNode *codegen_field_access = &node->codegen_node->data.field_access_node; assert(codegen_field_access->field_index >= 0); + add_debug_source_node(g, node); return LLVMBuildExtractValue(g->builder, struct_val, codegen_field_access->field_index, ""); } @@ -221,11 +223,7 @@ static LLVMValueRef gen_field_ptr(CodeGen *g, AstNode *node) { assert(codegen_field_access->field_index >= 0); - LLVMValueRef indices[] = { - LLVMConstInt(LLVMInt32Type(), 0, false), - LLVMConstInt(LLVMInt32Type(), codegen_field_access->field_index, false) - }; - return LLVMBuildStructGEP(g->builder, struct_ptr, indices, 2, ""); + return LLVMBuildStructGEP(g->builder, struct_ptr, codegen_field_access->field_index, ""); } */ @@ -233,6 +231,7 @@ static LLVMValueRef gen_array_access_expr(CodeGen *g, AstNode *node) { assert(node->type == NodeTypeArrayAccessExpr); LLVMValueRef ptr = gen_array_ptr(g, node); + add_debug_source_node(g, node); return LLVMBuildLoad(g->builder, ptr, ""); } @@ -564,6 +563,21 @@ static LLVMValueRef gen_assign_expr(CodeGen *g, AstNode *node) { LLVMValueRef value = gen_expr(g, node->data.bin_op_expr.op2); add_debug_source_node(g, node); return LLVMBuildStore(g->builder, value, ptr); + } else if (lhs_node->type == NodeTypeFieldAccessExpr) { + /* + LLVMValueRef ptr = gen_field_ptr(g, lhs_node); + LLVMValueRef value = gen_expr(g, node->data.bin_op_expr.op2); + add_debug_source_node(g, node); + return LLVMBuildStore(g->builder, value, ptr); + */ + LLVMValueRef struct_val = gen_expr(g, lhs_node->data.field_access_expr.struct_expr); + assert(struct_val); + FieldAccessNode *codegen_field_access = &lhs_node->codegen_node->data.field_access_node; + assert(codegen_field_access->field_index >= 0); + + LLVMValueRef value = gen_expr(g, node->data.bin_op_expr.op2); + add_debug_source_node(g, node); + return LLVMBuildInsertValue(g->builder, struct_val, value, codegen_field_access->field_index, ""); } else { zig_panic("bad assign target"); } |
