diff options
| author | Andrew Kelley <superjoe30@gmail.com> | 2015-12-08 14:47:17 -0700 |
|---|---|---|
| committer | Andrew Kelley <superjoe30@gmail.com> | 2015-12-08 14:47:17 -0700 |
| commit | 6e0c3dc173507b92fc04515659454044f918efbb (patch) | |
| tree | a1e12b910b101293f2e6b6ee0213cd201f82fe29 /src/codegen.cpp | |
| parent | 75efc313299af89c69c5f2b4a7c2758753ed36c3 (diff) | |
| download | zig-6e0c3dc173507b92fc04515659454044f918efbb.tar.gz zig-6e0c3dc173507b92fc04515659454044f918efbb.zip | |
array access support
Diffstat (limited to 'src/codegen.cpp')
| -rw-r--r-- | src/codegen.cpp | 21 |
1 files changed, 18 insertions, 3 deletions
diff --git a/src/codegen.cpp b/src/codegen.cpp index 6c7a84774d..366873c721 100644 --- a/src/codegen.cpp +++ b/src/codegen.cpp @@ -170,7 +170,18 @@ static LLVMValueRef gen_fn_call_expr(CodeGen *g, AstNode *node) { static LLVMValueRef gen_array_access_expr(CodeGen *g, AstNode *node) { assert(node->type == NodeTypeArrayAccessExpr); - zig_panic("TODO gen arary access"); + LLVMValueRef array_ref_value = gen_expr(g, node->data.array_access_expr.array_ref_expr); + LLVMValueRef subscript_value = gen_expr(g, node->data.array_access_expr.subscript); + + assert(array_ref_value); + assert(subscript_value); + + LLVMValueRef indices[] = { + LLVMConstInt(LLVMInt32Type(), 0, false), + subscript_value + }; + LLVMValueRef result_ptr = LLVMBuildInBoundsGEP(g->builder, array_ref_value, indices, 2, ""); + return LLVMBuildLoad(g->builder, result_ptr, ""); } static LLVMValueRef gen_prefix_op_expr(CodeGen *g, AstNode *node) { @@ -651,8 +662,12 @@ static LLVMValueRef gen_expr(CodeGen *g, AstNode *node) { if (variable->type == g->builtin_types.entry_void) { return nullptr; } else if (variable->is_ptr) { - add_debug_source_node(g, node); - return LLVMBuildLoad(g->builder, variable->value_ref, ""); + if (variable->type->id == TypeTableEntryIdArray) { + return variable->value_ref; + } else { + add_debug_source_node(g, node); + return LLVMBuildLoad(g->builder, variable->value_ref, ""); + } } else { return variable->value_ref; } |
