From d92ae20f459c3ac491a0f5ef8aa42e8ac37634c8 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Mon, 9 May 2016 15:07:38 -0700 Subject: add hashmap to standard library closes #22 --- src/codegen.cpp | 67 ++++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 42 insertions(+), 25 deletions(-) (limited to 'src/codegen.cpp') diff --git a/src/codegen.cpp b/src/codegen.cpp index 13f0c9eee0..3b38387b0a 100644 --- a/src/codegen.cpp +++ b/src/codegen.cpp @@ -2501,6 +2501,33 @@ static void gen_var_debug_decl(CodeGen *g, VariableTableEntry *var) { LLVMGetInsertBlock(g->builder)); } +static LLVMValueRef gen_if_var_then_block(CodeGen *g, AstNode *node, VariableTableEntry *variable, bool maybe_is_ptr, + LLVMValueRef init_val, TypeTableEntry *child_type, AstNode *then_node) +{ + if (node->data.if_var_expr.var_is_ptr) { + LLVMValueRef payload_ptr; + if (maybe_is_ptr) { + zig_panic("TODO"); + } else { + payload_ptr = LLVMBuildStructGEP(g->builder, init_val, 0, ""); + } + LLVMBuildStore(g->builder, payload_ptr, variable->value_ref); + } else { + LLVMValueRef payload_val; + if (maybe_is_ptr) { + payload_val = init_val; + } else { + LLVMValueRef payload_ptr = LLVMBuildStructGEP(g->builder, init_val, 0, ""); + payload_val = get_handle_value(g, node, payload_ptr, child_type); + } + gen_assign_raw(g, node, BinOpTypeAssign, variable->value_ref, payload_val, + variable->type, child_type); + } + gen_var_debug_decl(g, variable); + + return gen_expr(g, then_node); +} + static LLVMValueRef gen_if_var_expr(CodeGen *g, AstNode *node) { assert(node->type == NodeTypeIfVarExpr); assert(node->data.if_var_expr.var_decl.expr); @@ -2514,8 +2541,21 @@ static LLVMValueRef gen_if_var_expr(CodeGen *g, AstNode *node) { LLVMValueRef init_val = gen_expr(g, var_decl->expr); - LLVMValueRef cond_value; + + AstNode *then_node = node->data.if_var_expr.then_block; + AstNode *else_node = node->data.if_var_expr.else_node; bool maybe_is_ptr = child_type->id == TypeTableEntryIdPointer || child_type->id == TypeTableEntryIdFn; + + ConstExprValue *const_val = &get_resolved_expr(var_decl->expr)->const_val; + if (const_val->ok) { + if (const_val->data.x_maybe) { + return gen_if_var_then_block(g, node, variable, maybe_is_ptr, init_val, child_type, then_node); + } else { + return gen_expr(g, else_node); + } + } + + LLVMValueRef cond_value; if (maybe_is_ptr) { set_debug_source_node(g, node); cond_value = LLVMBuildICmp(g->builder, LLVMIntNE, init_val, LLVMConstNull(child_type->type_ref), ""); @@ -2525,9 +2565,6 @@ static LLVMValueRef gen_if_var_expr(CodeGen *g, AstNode *node) { cond_value = LLVMBuildLoad(g->builder, maybe_field_ptr, ""); } - AstNode *then_node = node->data.if_var_expr.then_block; - AstNode *else_node = node->data.if_var_expr.else_node; - TypeTableEntry *then_type = get_expr_type(then_node); TypeTableEntry *else_type = get_expr_type(else_node); @@ -2548,28 +2585,8 @@ static LLVMValueRef gen_if_var_expr(CodeGen *g, AstNode *node) { LLVMBuildCondBr(g->builder, cond_value, then_block, else_block); LLVMPositionBuilderAtEnd(g->builder, then_block); - if (node->data.if_var_expr.var_is_ptr) { - LLVMValueRef payload_ptr; - if (maybe_is_ptr) { - zig_panic("TODO"); - } else { - payload_ptr = LLVMBuildStructGEP(g->builder, init_val, 0, ""); - } - LLVMBuildStore(g->builder, payload_ptr, variable->value_ref); - } else { - LLVMValueRef payload_val; - if (maybe_is_ptr) { - payload_val = init_val; - } else { - LLVMValueRef payload_ptr = LLVMBuildStructGEP(g->builder, init_val, 0, ""); - payload_val = get_handle_value(g, node, payload_ptr, child_type); - } - gen_assign_raw(g, node, BinOpTypeAssign, variable->value_ref, payload_val, - variable->type, child_type); - } - gen_var_debug_decl(g, variable); + LLVMValueRef then_expr_result = gen_if_var_then_block(g, node, variable, maybe_is_ptr, init_val, child_type, then_node); - LLVMValueRef then_expr_result = gen_expr(g, then_node); if (then_endif_reachable) { LLVMBuildBr(g->builder, endif_block); } -- cgit v1.2.3