diff --git a/src/all_types.hpp b/src/all_types.hpp index 5b062efc9..227018f5e 100644 --- a/src/all_types.hpp +++ b/src/all_types.hpp @@ -1565,7 +1565,7 @@ struct ZigFn { // in the case of async functions this is the implicit return type according to the // zig source code, not according to zig ir ZigType *src_implicit_return_type; - IrExecutable ir_executable; + IrExecutable *ir_executable; IrExecutable analyzed_executable; size_t prealloc_bbc; size_t prealloc_backward_branch_quota; @@ -2204,6 +2204,8 @@ struct ZigVar { bool src_is_const; bool gen_is_const; bool is_thread_local; + bool is_comptime_memoized; + bool is_comptime_memoized_value; }; struct ErrorTableEntry { diff --git a/src/analyze.cpp b/src/analyze.cpp index c0d2d636e..0f2df5835 100644 --- a/src/analyze.cpp +++ b/src/analyze.cpp @@ -3275,14 +3275,15 @@ static void get_fully_qualified_decl_name(CodeGen *g, Buf *buf, Tld *tld, bool i } ZigFn *create_fn_raw(CodeGen *g, FnInline inline_value) { - ZigFn *fn_entry = allocate(1); + ZigFn *fn_entry = allocate(1, "ZigFn"); + fn_entry->ir_executable = allocate(1, "IrExecutablePass1"); fn_entry->prealloc_backward_branch_quota = default_backward_branch_quota; fn_entry->analyzed_executable.backward_branch_count = &fn_entry->prealloc_bbc; fn_entry->analyzed_executable.backward_branch_quota = &fn_entry->prealloc_backward_branch_quota; fn_entry->analyzed_executable.fn_entry = fn_entry; - fn_entry->ir_executable.fn_entry = fn_entry; + fn_entry->ir_executable->fn_entry = fn_entry; fn_entry->fn_inline = inline_value; return fn_entry; @@ -4610,7 +4611,7 @@ static void analyze_fn_ir(CodeGen *g, ZigFn *fn, AstNode *return_type_node) { assert(!fn_type->data.fn.is_generic); FnTypeId *fn_type_id = &fn_type->data.fn.fn_type_id; - ZigType *block_return_type = ir_analyze(g, &fn->ir_executable, + ZigType *block_return_type = ir_analyze(g, fn->ir_executable, &fn->analyzed_executable, fn_type_id->return_type, return_type_node); fn->src_implicit_return_type = block_return_type; @@ -4706,7 +4707,7 @@ static void analyze_fn_body(CodeGen *g, ZigFn *fn_table_entry) { assert(!fn_type->data.fn.is_generic); ir_gen_fn(g, fn_table_entry); - if (fn_table_entry->ir_executable.first_err_trace_msg != nullptr) { + if (fn_table_entry->ir_executable->first_err_trace_msg != nullptr) { fn_table_entry->anal_state = FnAnalStateInvalid; return; } @@ -4714,7 +4715,7 @@ static void analyze_fn_body(CodeGen *g, ZigFn *fn_table_entry) { fprintf(stderr, "\n"); ast_render(stderr, fn_table_entry->body_node, 4); fprintf(stderr, "\nfn %s() { // (IR)\n", buf_ptr(&fn_table_entry->symbol_name)); - ir_print(g, stderr, &fn_table_entry->ir_executable, 4, IrPassSrc); + ir_print(g, stderr, fn_table_entry->ir_executable, 4, IrPassSrc); fprintf(stderr, "}\n"); } @@ -6453,20 +6454,31 @@ Error type_resolve(CodeGen *g, ZigType *ty, ResolveStatus status) { } bool ir_get_var_is_comptime(ZigVar *var) { + if (var->is_comptime_memoized) + return var->is_comptime_memoized_value; + + var->is_comptime_memoized = true; + // The is_comptime field can be left null, which means not comptime. - if (var->is_comptime == nullptr) - return false; + if (var->is_comptime == nullptr) { + var->is_comptime_memoized_value = false; + return var->is_comptime_memoized_value; + } // When the is_comptime field references an instruction that has to get analyzed, this // is the value. if (var->is_comptime->child != nullptr) { assert(var->is_comptime->child->value->type->id == ZigTypeIdBool); - return var->is_comptime->child->value->data.x_bool; + var->is_comptime_memoized_value = var->is_comptime->child->value->data.x_bool; + var->is_comptime = nullptr; + return var->is_comptime_memoized_value; } // As an optimization, is_comptime values which are constant are allowed // to be omitted from analysis. In this case, there is no child instruction // and we simply look at the unanalyzed const parent instruction. assert(var->is_comptime->value->type->id == ZigTypeIdBool); - return var->is_comptime->value->data.x_bool; + var->is_comptime_memoized_value = var->is_comptime->value->data.x_bool; + var->is_comptime = nullptr; + return var->is_comptime_memoized_value; } bool const_values_equal_ptr(ZigValue *a, ZigValue *b) { diff --git a/src/ir.cpp b/src/ir.cpp index e0ebe8468..93b16dc8d 100644 --- a/src/ir.cpp +++ b/src/ir.cpp @@ -253,6 +253,353 @@ static IrInstruction *ir_analyze_inferred_field_ptr(IrAnalyze *ira, Buf *field_n IrInstruction *source_instr, IrInstruction *container_ptr, ZigType *container_type); static ResultLoc *no_result_loc(void); +static void destroy_instruction(IrInstruction *inst) { +#ifdef ZIG_ENABLE_MEM_PROFILE + const char *name = ir_instruction_type_str(inst->id); +#else + const char *name = nullptr; +#endif + switch (inst->id) { + case IrInstructionIdInvalid: + zig_unreachable(); + case IrInstructionIdReturn: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdConst: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdBinOp: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdMergeErrSets: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdDeclVarSrc: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdCast: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdCallSrc: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdCallGen: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdUnOp: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdCondBr: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdBr: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdPhi: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdContainerInitList: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdContainerInitFields: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdUnreachable: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdElemPtr: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdVarPtr: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdReturnPtr: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdLoadPtr: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdLoadPtrGen: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdStorePtr: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdVectorStoreElem: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdTypeOf: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdFieldPtr: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdStructFieldPtr: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdUnionFieldPtr: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdSetCold: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdSetRuntimeSafety: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdSetFloatMode: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdArrayType: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdSliceType: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdAnyFrameType: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdGlobalAsm: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdAsm: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdSizeOf: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdTestNonNull: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdOptionalUnwrapPtr: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdPopCount: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdClz: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdCtz: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdBswap: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdBitReverse: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdSwitchBr: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdSwitchVar: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdSwitchElseVar: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdSwitchTarget: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdUnionTag: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdImport: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdRef: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdRefGen: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdCompileErr: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdCompileLog: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdErrName: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdCImport: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdCInclude: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdCDefine: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdCUndef: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdEmbedFile: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdCmpxchgSrc: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdCmpxchgGen: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdFence: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdTruncate: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdIntCast: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdFloatCast: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdErrSetCast: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdFromBytes: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdToBytes: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdIntToFloat: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdFloatToInt: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdBoolToInt: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdIntType: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdVectorType: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdShuffleVector: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdSplatSrc: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdSplatGen: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdBoolNot: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdMemset: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdMemcpy: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdSliceSrc: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdSliceGen: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdMemberCount: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdMemberType: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdMemberName: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdBreakpoint: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdReturnAddress: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdFrameAddress: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdFrameHandle: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdFrameType: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdFrameSizeSrc: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdFrameSizeGen: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdAlignOf: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdOverflowOp: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdTestErrSrc: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdTestErrGen: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdUnwrapErrCode: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdUnwrapErrPayload: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdOptionalWrap: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdErrWrapCode: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdErrWrapPayload: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdFnProto: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdTestComptime: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdPtrCastSrc: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdPtrCastGen: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdBitCastSrc: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdBitCastGen: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdWidenOrShorten: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdPtrToInt: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdIntToPtr: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdIntToEnum: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdIntToErr: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdErrToInt: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdCheckSwitchProngs: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdCheckStatementIsVoid: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdTypeName: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdTagName: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdPtrType: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdDeclRef: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdPanic: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdFieldParentPtr: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdByteOffsetOf: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdBitOffsetOf: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdTypeInfo: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdType: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdHasField: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdTypeId: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdSetEvalBranchQuota: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdAlignCast: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdImplicitCast: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdResolveResult: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdResetResult: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdOpaqueType: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdSetAlignStack: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdArgType: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdTagType: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdExport: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdErrorReturnTrace: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdErrorUnion: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdAtomicRmw: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdSaveErrRetAddr: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdAddImplicitReturnType: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdFloatOp: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdMulAdd: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdAtomicLoad: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdAtomicStore: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdEnumToInt: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdCheckRuntimeScope: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdDeclVarGen: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdArrayToVector: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdVectorToArray: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdPtrOfArrayToSlice: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdAssertZero: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdAssertNonNull: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdResizeSlice: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdHasDecl: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdUndeclaredIdent: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdAllocaSrc: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdAllocaGen: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdEndExpr: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdUnionInitNamedField: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdSuspendBegin: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdSuspendFinish: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdResume: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdAwaitSrc: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdAwaitGen: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdSpillBegin: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdSpillEnd: + return destroy(reinterpret_cast(inst), name); + case IrInstructionIdVectorExtractElem: + return destroy(reinterpret_cast(inst), name); + } + zig_unreachable(); +} + static void ira_ref(IrAnalyze *ira) { ira->ref_count += 1; } @@ -262,6 +609,22 @@ static void ira_deref(IrAnalyze *ira) { return; } assert(ira->ref_count != 0); + + for (size_t bb_i = 0; bb_i < ira->old_irb.exec->basic_block_list.length; bb_i += 1) { + IrBasicBlock *pass1_bb = ira->old_irb.exec->basic_block_list.items[bb_i]; + for (size_t inst_i = 0; inst_i < pass1_bb->instruction_list.length; inst_i += 1) { + IrInstruction *pass1_inst = pass1_bb->instruction_list.items[inst_i]; + destroy_instruction(pass1_inst); + } + destroy(pass1_bb, "IrBasicBlock"); + } + ira->old_irb.exec->basic_block_list.deinit(); + ira->old_irb.exec->tld_list.deinit(); + // cannot destroy here because of var->owner_exec + //destroy(ira->old_irb.exec, "IrExecutablePass1"); + ira->src_implicit_return_type_list.deinit(); + ira->resume_stack.deinit(); + ira->exec_context.mem_slot_list.deinit(); destroy(ira, "IrAnalyze"); } @@ -4202,7 +4565,7 @@ static IrInstruction *ir_gen_bool_and(IrBuilder *irb, Scope *scope, AstNode *nod IrInstruction **incoming_values = allocate(2); incoming_values[0] = val1; incoming_values[1] = val2; - IrBasicBlock **incoming_blocks = allocate(2); + IrBasicBlock **incoming_blocks = allocate(2, "IrBasicBlock *"); incoming_blocks[0] = post_val1_block; incoming_blocks[1] = post_val2_block; @@ -4292,7 +4655,7 @@ static IrInstruction *ir_gen_orelse(IrBuilder *irb, Scope *parent_scope, AstNode IrInstruction **incoming_values = allocate(2); incoming_values[0] = null_result; incoming_values[1] = unwrapped_payload; - IrBasicBlock **incoming_blocks = allocate(2); + IrBasicBlock **incoming_blocks = allocate(2, "IrBasicBlock *"); incoming_blocks[0] = after_null_block; incoming_blocks[1] = after_ok_block; IrInstruction *phi = ir_build_phi(irb, parent_scope, node, 2, incoming_blocks, incoming_values, peer_parent); @@ -6057,7 +6420,7 @@ static IrInstruction *ir_gen_if_bool_expr(IrBuilder *irb, Scope *scope, AstNode IrInstruction **incoming_values = allocate(2); incoming_values[0] = then_expr_result; incoming_values[1] = else_expr_result; - IrBasicBlock **incoming_blocks = allocate(2); + IrBasicBlock **incoming_blocks = allocate(2, "IrBasicBlock *"); incoming_blocks[0] = after_then_block; incoming_blocks[1] = after_else_block; @@ -7409,7 +7772,7 @@ static IrInstruction *ir_gen_if_optional_expr(IrBuilder *irb, Scope *scope, AstN IrInstruction **incoming_values = allocate(2); incoming_values[0] = then_expr_result; incoming_values[1] = else_expr_result; - IrBasicBlock **incoming_blocks = allocate(2); + IrBasicBlock **incoming_blocks = allocate(2, "IrBasicBlock *"); incoming_blocks[0] = after_then_block; incoming_blocks[1] = after_else_block; @@ -7506,7 +7869,7 @@ static IrInstruction *ir_gen_if_err_expr(IrBuilder *irb, Scope *scope, AstNode * IrInstruction **incoming_values = allocate(2); incoming_values[0] = then_expr_result; incoming_values[1] = else_expr_result; - IrBasicBlock **incoming_blocks = allocate(2); + IrBasicBlock **incoming_blocks = allocate(2, "IrBasicBlock *"); incoming_blocks[0] = after_then_block; incoming_blocks[1] = after_else_block; @@ -8102,7 +8465,7 @@ static IrInstruction *ir_gen_catch(IrBuilder *irb, Scope *parent_scope, AstNode IrInstruction **incoming_values = allocate(2); incoming_values[0] = err_result; incoming_values[1] = unwrapped_payload; - IrBasicBlock **incoming_blocks = allocate(2); + IrBasicBlock **incoming_blocks = allocate(2, "IrBasicBlock *"); incoming_blocks[0] = after_err_block; incoming_blocks[1] = after_ok_block; IrInstruction *phi = ir_build_phi(irb, parent_scope, node, 2, incoming_blocks, incoming_values, peer_parent); @@ -8690,7 +9053,7 @@ bool ir_gen(CodeGen *codegen, AstNode *node, Scope *scope, IrExecutable *ir_exec bool ir_gen_fn(CodeGen *codegen, ZigFn *fn_entry) { assert(fn_entry); - IrExecutable *ir_executable = &fn_entry->ir_executable; + IrExecutable *ir_executable = fn_entry->ir_executable; AstNode *body_node = fn_entry->body_node; assert(fn_entry->child_scope); @@ -11565,7 +11928,7 @@ ZigValue *ir_eval_const_value(CodeGen *codegen, Scope *scope, AstNode *node, if (expected_type != nullptr && type_is_invalid(expected_type)) return codegen->invalid_instruction->value; - IrExecutable *ir_executable = allocate(1); + IrExecutable *ir_executable = allocate(1, "IrExecutablePass1"); ir_executable->source_node = source_node; ir_executable->parent_exec = parent_exec; ir_executable->name = exec_name; @@ -11587,7 +11950,7 @@ ZigValue *ir_eval_const_value(CodeGen *codegen, Scope *scope, AstNode *node, ir_print(codegen, stderr, ir_executable, 2, IrPassSrc); fprintf(stderr, "}\n"); } - IrExecutable *analyzed_executable = allocate(1); + IrExecutable *analyzed_executable = allocate(1, "IrExecutablePass2"); analyzed_executable->source_node = source_node; analyzed_executable->parent_exec = parent_exec; analyzed_executable->source_exec = ir_executable; @@ -15752,6 +16115,7 @@ static IrInstruction *ir_analyze_instruction_decl_var(IrAnalyze *ira, assert(var->mem_slot_index < ira->exec_context.mem_slot_list.length); ZigValue *mem_slot = ira->exec_context.mem_slot_list.at(var->mem_slot_index); copy_const_val(mem_slot, init_val, !is_comptime_var || var->gen_is_const); + ira_ref(var->owner_exec->analysis); if (is_comptime_var || (var_class_requires_const && var->gen_is_const)) { return ir_const_void(ira, &decl_var_instruction->base); @@ -17522,8 +17886,8 @@ static IrInstruction *ir_analyze_fn_call(IrAnalyze *ira, IrInstructionCallSrc *c if (type_is_invalid(impl_fn->type_entry)) return ira->codegen->invalid_instruction; - impl_fn->ir_executable.source_node = call_instruction->base.source_node; - impl_fn->ir_executable.parent_exec = ira->new_irb.exec; + impl_fn->ir_executable->source_node = call_instruction->base.source_node; + impl_fn->ir_executable->parent_exec = ira->new_irb.exec; impl_fn->analyzed_executable.source_node = call_instruction->base.source_node; impl_fn->analyzed_executable.parent_exec = ira->new_irb.exec; impl_fn->analyzed_executable.backward_branch_quota = ira->new_irb.exec->backward_branch_quota; diff --git a/src/list.hpp b/src/list.hpp index 59782b46a..4b2833843 100644 --- a/src/list.hpp +++ b/src/list.hpp @@ -13,7 +13,7 @@ template struct ZigList { void deinit() { - free(items); + deallocate(items, capacity); } void append(const T& item) { ensure_capacity(length + 1);