diff options
| author | Andrew Kelley <superjoe30@gmail.com> | 2016-10-30 02:46:16 -0400 |
|---|---|---|
| committer | Andrew Kelley <superjoe30@gmail.com> | 2016-10-30 02:46:16 -0400 |
| commit | 1a0111d4c36578b64d8532724afd9be9ca61d3d1 (patch) | |
| tree | b8a24f50ff129c1e147665645bbdf544dc075367 /src/codegen.cpp | |
| parent | 56cdaff9e71c10eb9c4dd130ee2516acacc1c13f (diff) | |
| download | zig-1a0111d4c36578b64d8532724afd9be9ca61d3d1.tar.gz zig-1a0111d4c36578b64d8532724afd9be9ca61d3d1.zip | |
*WIP*
Diffstat (limited to 'src/codegen.cpp')
| -rw-r--r-- | src/codegen.cpp | 108 |
1 files changed, 23 insertions, 85 deletions
diff --git a/src/codegen.cpp b/src/codegen.cpp index 908c1986b4..4b98153e94 100644 --- a/src/codegen.cpp +++ b/src/codegen.cpp @@ -66,6 +66,8 @@ CodeGen *codegen_create(Buf *root_source_dir, const ZigTarget *target) { g->is_test_build = false; g->want_h_file = true; + g->len_buf = buf_create_from_str("len"); + // the error.Ok value g->error_decls.append(nullptr); @@ -2940,12 +2942,29 @@ static LLVMValueRef ir_render_call(CodeGen *g, IrExecutable *executable, IrInstr } } +static LLVMValueRef ir_render_struct_field_ptr(CodeGen *g, IrExecutable *executable, + IrInstructionStructFieldPtr *instruction) +{ + LLVMValueRef struct_ptr = ir_llvm_value(g, instruction->struct_ptr); + TypeStructField *field = instruction->field; + + if (!type_has_bits(field->type_entry)) + return nullptr; + + assert(field->gen_index != SIZE_MAX); + return LLVMBuildStructGEP(g->builder, struct_ptr, field->gen_index, ""); +} + static LLVMValueRef ir_render_instruction(CodeGen *g, IrExecutable *executable, IrInstruction *instruction) { set_debug_source_node(g, instruction->source_node); switch (instruction->id) { case IrInstructionIdInvalid: case IrInstructionIdConst: + case IrInstructionIdTypeOf: + case IrInstructionIdToPtrType: + case IrInstructionIdPtrTypeChild: + case IrInstructionIdFieldPtr: zig_unreachable(); case IrInstructionIdReturn: return ir_render_return(g, executable, (IrInstructionReturn *)instruction); @@ -2973,12 +2992,14 @@ static LLVMValueRef ir_render_instruction(CodeGen *g, IrExecutable *executable, return ir_render_elem_ptr(g, executable, (IrInstructionElemPtr *)instruction); case IrInstructionIdCall: return ir_render_call(g, executable, (IrInstructionCall *)instruction); + case IrInstructionIdStructFieldPtr: + return ir_render_struct_field_ptr(g, executable, (IrInstructionStructFieldPtr *)instruction); case IrInstructionIdSwitchBr: case IrInstructionIdPhi: case IrInstructionIdBuiltinCall: case IrInstructionIdContainerInitList: case IrInstructionIdContainerInitFields: - case IrInstructionIdFieldPtr: + case IrInstructionIdReadField: zig_panic("TODO render more IR instructions to LLVM"); } zig_unreachable(); @@ -3284,89 +3305,6 @@ static LLVMValueRef gen_while_expr(CodeGen *g, AstNode *node) { return nullptr; } -static LLVMValueRef gen_for_expr(CodeGen *g, AstNode *node) { - assert(node->type == NodeTypeForExpr); - assert(node->data.for_expr.array_expr); - assert(node->data.for_expr.body); - - zig_panic("TODO IR for loop"); - //VariableTableEntry *elem_var = node->data.for_expr.elem_var; - //assert(elem_var); - - //TypeTableEntry *array_type = get_expr_type(node->data.for_expr.array_expr); - - //VariableTableEntry *index_var = node->data.for_expr.index_var; - //assert(index_var); - //LLVMValueRef index_ptr = index_var->value_ref; - //LLVMValueRef one_const = LLVMConstInt(g->builtin_types.entry_usize->type_ref, 1, false); - - //LLVMBasicBlockRef cond_block = LLVMAppendBasicBlock(g->cur_fn->fn_value, "ForCond"); - //LLVMBasicBlockRef body_block = LLVMAppendBasicBlock(g->cur_fn->fn_value, "ForBody"); - //LLVMBasicBlockRef end_block = LLVMAppendBasicBlock(g->cur_fn->fn_value, "ForEnd"); - //LLVMBasicBlockRef continue_block = LLVMAppendBasicBlock(g->cur_fn->fn_value, "ForContinue"); - - //LLVMValueRef array_val = gen_array_base_ptr(g, node->data.for_expr.array_expr); - //set_debug_source_node(g, node); - //LLVMBuildStore(g->builder, LLVMConstNull(index_var->type->type_ref), index_ptr); - - //gen_var_debug_decl(g, index_var); - - //LLVMValueRef len_val; - //TypeTableEntry *child_type; - //if (array_type->id == TypeTableEntryIdArray) { - // len_val = LLVMConstInt(g->builtin_types.entry_usize->type_ref, - // array_type->data.array.len, false); - // child_type = array_type->data.array.child_type; - //} else if (array_type->id == TypeTableEntryIdStruct) { - // assert(array_type->data.structure.is_slice); - // TypeTableEntry *child_ptr_type = array_type->data.structure.fields[0].type_entry; - // assert(child_ptr_type->id == TypeTableEntryIdPointer); - // child_type = child_ptr_type->data.pointer.child_type; - // size_t len_index = array_type->data.structure.fields[1].gen_index; - // assert(len_index != SIZE_MAX); - // LLVMValueRef len_field_ptr = LLVMBuildStructGEP(g->builder, array_val, len_index, ""); - // len_val = LLVMBuildLoad(g->builder, len_field_ptr, ""); - //} else { - // zig_unreachable(); - //} - //LLVMBuildBr(g->builder, cond_block); - - //LLVMPositionBuilderAtEnd(g->builder, cond_block); - //LLVMValueRef index_val = LLVMBuildLoad(g->builder, index_ptr, ""); - //LLVMValueRef cond = LLVMBuildICmp(g->builder, LLVMIntSLT, index_val, len_val, ""); - //LLVMBuildCondBr(g->builder, cond, body_block, end_block); - - //LLVMPositionBuilderAtEnd(g->builder, body_block); - //LLVMValueRef elem_ptr = gen_array_elem_ptr(g, node, array_val, array_type, index_val); - - //LLVMValueRef elem_val; - //if (node->data.for_expr.elem_is_ptr) { - // elem_val = elem_ptr; - //} else { - // elem_val = handle_is_ptr(child_type) ? elem_ptr : LLVMBuildLoad(g->builder, elem_ptr, ""); - //} - //gen_assign_raw(g, node, BinOpTypeAssign, elem_var->value_ref, elem_val, elem_var->type, child_type); - //gen_var_debug_decl(g, elem_var); - //g->break_block_stack.append(end_block); - //g->continue_block_stack.append(continue_block); - //gen_expr(g, node->data.for_expr.body); - //g->break_block_stack.pop(); - //g->continue_block_stack.pop(); - //if (get_expr_type(node->data.for_expr.body)->id != TypeTableEntryIdUnreachable) { - // set_debug_source_node(g, node); - // LLVMBuildBr(g->builder, continue_block); - //} - - //LLVMPositionBuilderAtEnd(g->builder, continue_block); - //set_debug_source_node(g, node); - //LLVMValueRef new_index_val = LLVMBuildNSWAdd(g->builder, index_val, one_const, ""); - //LLVMBuildStore(g->builder, new_index_val, index_ptr); - //LLVMBuildBr(g->builder, cond_block); - - //LLVMPositionBuilderAtEnd(g->builder, end_block); - //return nullptr; -} - //static LLVMValueRef gen_break(CodeGen *g, AstNode *node) { // assert(node->type == NodeTypeBreak); // LLVMBasicBlockRef dest_block = g->break_block_stack.last(); @@ -3773,7 +3711,7 @@ static LLVMValueRef gen_expr(CodeGen *g, AstNode *node) { case NodeTypeWhileExpr: return gen_while_expr(g, node); case NodeTypeForExpr: - return gen_for_expr(g, node); + zig_panic("moved to ir render"); case NodeTypeAsmExpr: return gen_asm_expr(g, node); case NodeTypeSymbol: |
