| ... | ... | @@ -3135,6 +3135,11 @@ fn varDecl( |
| 3135 | 3135 | return astgen.failTok(tree.nodeMainToken(section_node), "cannot set section of local variable '{s}'", .{ident_name_raw}); |
| 3136 | 3136 | } |
| 3137 | 3137 | |
| 3138 | const type_inst: Zir.Inst.Ref = if (var_decl.ast.type_node.unwrap()) |type_node| |
| 3139 | try typeExpr(gz, scope, type_node) |
| 3140 | else |
| 3141 | .none; |
| 3142 | |
| 3138 | 3143 | const align_inst: Zir.Inst.Ref = if (var_decl.ast.align_node.unwrap()) |align_node| |
| 3139 | 3144 | try comptimeExpr(gz, scope, coerced_align_ri, align_node, .@"align") |
| 3140 | 3145 | else |
| ... | ... | @@ -3155,8 +3160,8 @@ fn varDecl( |
| 3155 | 3160 | if (align_inst == .none and |
| 3156 | 3161 | !astgen.nodes_need_rl.contains(node)) |
| 3157 | 3162 | { |
| 3158 | | const result_info: ResultInfo = if (var_decl.ast.type_node.unwrap()) |type_node| .{ |
| 3159 | | .rl = .{ .ty = try typeExpr(gz, scope, type_node) }, |
| 3163 | const result_info: ResultInfo = if (type_inst != .none) .{ |
| 3164 | .rl = .{ .ty = type_inst }, |
| 3160 | 3165 | .ctx = .const_init, |
| 3161 | 3166 | } else .{ .rl = .none, .ctx = .const_init }; |
| 3162 | 3167 | const init_inst: Zir.Inst.Ref = try nameStratExpr(gz, scope, result_info, init_node, .dbg_var) orelse |
| ... | ... | @@ -3185,8 +3190,7 @@ fn varDecl( |
| 3185 | 3190 | const is_comptime = gz.is_comptime or |
| 3186 | 3191 | tree.nodeTag(init_node) == .@"comptime"; |
| 3187 | 3192 | |
| 3188 | | const init_rl: ResultInfo.Loc = if (var_decl.ast.type_node.unwrap()) |type_node| init_rl: { |
| 3189 | | const type_inst = try typeExpr(gz, scope, type_node); |
| 3193 | const init_rl: ResultInfo.Loc = if (type_inst != .none) init_rl: { |
| 3190 | 3194 | if (align_inst == .none) { |
| 3191 | 3195 | break :init_rl .{ .ptr = .{ .inst = try gz.addUnNode(.alloc, type_inst, node) } }; |
| 3192 | 3196 | } else { |
| ... | ... | @@ -3254,8 +3258,7 @@ fn varDecl( |
| 3254 | 3258 | if (var_decl.comptime_token != null and gz.is_comptime) |
| 3255 | 3259 | return astgen.failTok(var_decl.comptime_token.?, "'comptime var' is redundant in comptime scope", .{}); |
| 3256 | 3260 | const is_comptime = var_decl.comptime_token != null or gz.is_comptime; |
| 3257 | | const alloc: Zir.Inst.Ref, const resolve_inferred: bool, const result_info: ResultInfo = if (var_decl.ast.type_node.unwrap()) |type_node| a: { |
| 3258 | | const type_inst = try typeExpr(gz, scope, type_node); |
| 3261 | const alloc: Zir.Inst.Ref, const resolve_inferred: bool, const result_info: ResultInfo = if (type_inst != .none) a: { |
| 3259 | 3262 | const alloc = alloc: { |
| 3260 | 3263 | if (align_inst == .none) { |
| 3261 | 3264 | const tag: Zir.Inst.Tag = if (is_comptime) |
| ... | ... | @@ -3482,14 +3485,18 @@ fn assignDestructureMaybeDecls( |
| 3482 | 3485 | // We also mark `const`s as comptime if the RHS is definitely comptime-known. |
| 3483 | 3486 | const this_variable_comptime = is_comptime or (is_const and value_is_comptime); |
| 3484 | 3487 | |
| 3488 | const type_inst = if (full_var_decl.ast.type_node.unwrap()) |type_node| |
| 3489 | try typeExpr(gz, scope, type_node) |
| 3490 | else |
| 3491 | .none; |
| 3492 | |
| 3485 | 3493 | const align_inst: Zir.Inst.Ref = if (full_var_decl.ast.align_node.unwrap()) |align_node| |
| 3486 | 3494 | try comptimeExpr(gz, scope, coerced_align_ri, align_node, .@"align") |
| 3487 | 3495 | else |
| 3488 | 3496 | .none; |
| 3489 | 3497 | |
| 3490 | | if (full_var_decl.ast.type_node.unwrap()) |type_node| { |
| 3498 | if (type_inst != .none) { |
| 3491 | 3499 | // Typed alloc |
| 3492 | | const type_inst = try typeExpr(gz, scope, type_node); |
| 3493 | 3500 | const ptr = if (align_inst == .none) ptr: { |
| 3494 | 3501 | const tag: Zir.Inst.Tag = if (this_variable_comptime) |
| 3495 | 3502 | .alloc_comptime_mut |
| ... | ... | @@ -4061,43 +4068,41 @@ fn fnDecl( |
| 4061 | 4068 | // We include a function *type*, not a value. |
| 4062 | 4069 | const type_inst = try fnProtoExprInner(&type_gz, &type_gz.base, .{ .rl = .none }, decl_node, fn_proto, true); |
| 4063 | 4070 | _ = try type_gz.addBreakWithSrcNode(.break_inline, decl_inst, type_inst, decl_node); |
| 4071 | astgen.restoreSourceCursor(saved_cursor); |
| 4064 | 4072 | } |
| 4065 | 4073 | |
| 4066 | 4074 | var align_gz = type_gz.makeSubBlock(scope); |
| 4067 | 4075 | defer align_gz.unstack(); |
| 4068 | 4076 | |
| 4069 | 4077 | if (fn_proto.ast.align_expr.unwrap()) |align_expr| { |
| 4070 | | astgen.restoreSourceCursor(saved_cursor); |
| 4071 | 4078 | const inst = try expr(&align_gz, &align_gz.base, coerced_align_ri, align_expr); |
| 4072 | 4079 | _ = try align_gz.addBreakWithSrcNode(.break_inline, decl_inst, inst, decl_node); |
| 4073 | 4080 | } |
| 4074 | 4081 | |
| 4075 | | var linksection_gz = align_gz.makeSubBlock(scope); |
| 4076 | | defer linksection_gz.unstack(); |
| 4077 | | |
| 4078 | | if (fn_proto.ast.section_expr.unwrap()) |section_expr| { |
| 4079 | | astgen.restoreSourceCursor(saved_cursor); |
| 4080 | | const inst = try expr(&linksection_gz, &linksection_gz.base, coerced_linksection_ri, section_expr); |
| 4081 | | _ = try linksection_gz.addBreakWithSrcNode(.break_inline, decl_inst, inst, decl_node); |
| 4082 | | } |
| 4083 | | |
| 4084 | | var addrspace_gz = linksection_gz.makeSubBlock(scope); |
| 4082 | var addrspace_gz = align_gz.makeSubBlock(scope); |
| 4085 | 4083 | defer addrspace_gz.unstack(); |
| 4086 | 4084 | |
| 4087 | 4085 | if (fn_proto.ast.addrspace_expr.unwrap()) |addrspace_expr| { |
| 4088 | | astgen.restoreSourceCursor(saved_cursor); |
| 4089 | 4086 | const addrspace_ty = try addrspace_gz.addStdLangValue(addrspace_expr, .address_space); |
| 4090 | 4087 | const inst = try expr(&addrspace_gz, &addrspace_gz.base, .{ .rl = .{ .coerced_ty = addrspace_ty } }, addrspace_expr); |
| 4091 | 4088 | _ = try addrspace_gz.addBreakWithSrcNode(.break_inline, decl_inst, inst, decl_node); |
| 4092 | 4089 | } |
| 4093 | 4090 | |
| 4094 | | var value_gz = addrspace_gz.makeSubBlock(scope); |
| 4091 | var linksection_gz = addrspace_gz.makeSubBlock(scope); |
| 4092 | defer linksection_gz.unstack(); |
| 4093 | |
| 4094 | if (fn_proto.ast.section_expr.unwrap()) |section_expr| { |
| 4095 | const inst = try expr(&linksection_gz, &linksection_gz.base, coerced_linksection_ri, section_expr); |
| 4096 | _ = try linksection_gz.addBreakWithSrcNode(.break_inline, decl_inst, inst, decl_node); |
| 4097 | } |
| 4098 | |
| 4099 | var value_gz = linksection_gz.makeSubBlock(scope); |
| 4095 | 4100 | defer value_gz.unstack(); |
| 4096 | 4101 | |
| 4097 | 4102 | if (!is_extern) { |
| 4098 | 4103 | // We include a function *value*, not a type. |
| 4099 | 4104 | astgen.restoreSourceCursor(saved_cursor); |
| 4100 | | try astgen.fnDeclInner(&value_gz, &value_gz.base, saved_cursor, decl_inst, decl_node, body_node.unwrap().?, fn_proto); |
| 4105 | try astgen.fnDeclInner(&value_gz, &value_gz.base, decl_inst, decl_node, body_node.unwrap().?, fn_proto); |
| 4101 | 4106 | } |
| 4102 | 4107 | |
| 4103 | 4108 | // *Now* we can incorporate the full source code into the hasher. |
| ... | ... | @@ -4119,8 +4124,8 @@ fn fnDecl( |
| 4119 | 4124 | |
| 4120 | 4125 | .type_gz = &type_gz, |
| 4121 | 4126 | .align_gz = &align_gz, |
| 4122 | | .linksection_gz = &linksection_gz, |
| 4123 | 4127 | .addrspace_gz = &addrspace_gz, |
| 4128 | .linksection_gz = &linksection_gz, |
| 4124 | 4129 | .value_gz = &value_gz, |
| 4125 | 4130 | }); |
| 4126 | 4131 | } |
| ... | ... | @@ -4129,7 +4134,6 @@ fn fnDeclInner( |
| 4129 | 4134 | astgen: *AstGen, |
| 4130 | 4135 | decl_gz: *GenZir, |
| 4131 | 4136 | scope: *Scope, |
| 4132 | | saved_cursor: SourceCursor, |
| 4133 | 4137 | decl_inst: Zir.Inst.Index, |
| 4134 | 4138 | decl_node: Ast.Node.Index, |
| 4135 | 4139 | body_node: Ast.Node.Index, |
| ... | ... | @@ -4266,27 +4270,6 @@ fn fnDeclInner( |
| 4266 | 4270 | // instructions inside the expression blocks for cc and ret_ty to use the function |
| 4267 | 4271 | // instruction as the body to break from. |
| 4268 | 4272 | |
| 4269 | | var ret_gz = decl_gz.makeSubBlock(params_scope); |
| 4270 | | defer ret_gz.unstack(); |
| 4271 | | any_param_used = false; // we will check this later |
| 4272 | | const ret_ref: Zir.Inst.Ref = inst: { |
| 4273 | | // Parameters are in scope for the return type, so we use `params_scope` here. |
| 4274 | | // The calling convention will not have parameters in scope, so we'll just use `scope`. |
| 4275 | | // See #22263 for a proposal to solve the inconsistency here. |
| 4276 | | const inst = try fullBodyExpr(&ret_gz, params_scope, coerced_type_ri, fn_proto.ast.return_type.unwrap().?, .normal); |
| 4277 | | if (ret_gz.instructionsSlice().len == 0) { |
| 4278 | | // In this case we will send a len=0 body which can be encoded more efficiently. |
| 4279 | | break :inst inst; |
| 4280 | | } |
| 4281 | | _ = try ret_gz.addBreak(.break_inline, @fromBackingInt(@intCast(0)), inst); |
| 4282 | | break :inst inst; |
| 4283 | | }; |
| 4284 | | const ret_body_param_refs = try astgen.fetchRemoveRefEntries(param_insts.items); |
| 4285 | | const ret_ty_is_generic = any_param_used; |
| 4286 | | |
| 4287 | | // We're jumping back in source, so restore the cursor. |
| 4288 | | astgen.restoreSourceCursor(saved_cursor); |
| 4289 | | |
| 4290 | 4273 | var cc_gz = decl_gz.makeSubBlock(scope); |
| 4291 | 4274 | defer cc_gz.unstack(); |
| 4292 | 4275 | const cc_ref: Zir.Inst.Ref = blk: { |
| ... | ... | @@ -4312,6 +4295,24 @@ fn fnDeclInner( |
| 4312 | 4295 | } |
| 4313 | 4296 | }; |
| 4314 | 4297 | |
| 4298 | var ret_gz = decl_gz.makeSubBlock(params_scope); |
| 4299 | defer ret_gz.unstack(); |
| 4300 | any_param_used = false; // we will check this later |
| 4301 | const ret_ref: Zir.Inst.Ref = inst: { |
| 4302 | // Parameters are in scope for the return type, so we use `params_scope` here. |
| 4303 | // The calling convention will not have parameters in scope, so we'll just use `scope`. |
| 4304 | // See #22263 for a proposal to solve the inconsistency here. |
| 4305 | const inst = try fullBodyExpr(&ret_gz, params_scope, coerced_type_ri, fn_proto.ast.return_type.unwrap().?, .normal); |
| 4306 | if (ret_gz.instructionsSlice().len == 0) { |
| 4307 | // In this case we will send a len=0 body which can be encoded more efficiently. |
| 4308 | break :inst inst; |
| 4309 | } |
| 4310 | _ = try ret_gz.addBreak(.break_inline, @fromBackingInt(@intCast(0)), inst); |
| 4311 | break :inst inst; |
| 4312 | }; |
| 4313 | const ret_body_param_refs = try astgen.fetchRemoveRefEntries(param_insts.items); |
| 4314 | const ret_ty_is_generic = any_param_used; |
| 4315 | |
| 4315 | 4316 | var body_gz: GenZir = .{ |
| 4316 | 4317 | .is_comptime = false, |
| 4317 | 4318 | .src_baseline = fn_proto.ast.proto_node, |
| ... | ... | @@ -4490,14 +4491,6 @@ fn globalVarDecl( |
| 4490 | 4491 | _ = try align_gz.addBreakWithSrcNode(.break_inline, decl_inst, align_inst, node); |
| 4491 | 4492 | } |
| 4492 | 4493 | |
| 4493 | | var linksection_gz = type_gz.makeSubBlock(scope); |
| 4494 | | defer linksection_gz.unstack(); |
| 4495 | | |
| 4496 | | if (var_decl.ast.section_node.unwrap()) |section_node| { |
| 4497 | | const linksection_inst = try expr(&linksection_gz, &linksection_gz.base, coerced_linksection_ri, section_node); |
| 4498 | | _ = try linksection_gz.addBreakWithSrcNode(.break_inline, decl_inst, linksection_inst, node); |
| 4499 | | } |
| 4500 | | |
| 4501 | 4494 | var addrspace_gz = type_gz.makeSubBlock(scope); |
| 4502 | 4495 | defer addrspace_gz.unstack(); |
| 4503 | 4496 | |
| ... | ... | @@ -4507,6 +4500,14 @@ fn globalVarDecl( |
| 4507 | 4500 | _ = try addrspace_gz.addBreakWithSrcNode(.break_inline, decl_inst, addrspace_inst, node); |
| 4508 | 4501 | } |
| 4509 | 4502 | |
| 4503 | var linksection_gz = type_gz.makeSubBlock(scope); |
| 4504 | defer linksection_gz.unstack(); |
| 4505 | |
| 4506 | if (var_decl.ast.section_node.unwrap()) |section_node| { |
| 4507 | const linksection_inst = try expr(&linksection_gz, &linksection_gz.base, coerced_linksection_ri, section_node); |
| 4508 | _ = try linksection_gz.addBreakWithSrcNode(.break_inline, decl_inst, linksection_inst, node); |
| 4509 | } |
| 4510 | |
| 4510 | 4511 | var init_gz = type_gz.makeSubBlock(scope); |
| 4511 | 4512 | defer init_gz.unstack(); |
| 4512 | 4513 | |
| ... | ... | @@ -4536,8 +4537,8 @@ fn globalVarDecl( |
| 4536 | 4537 | |
| 4537 | 4538 | .type_gz = &type_gz, |
| 4538 | 4539 | .align_gz = &align_gz, |
| 4539 | | .linksection_gz = &linksection_gz, |
| 4540 | 4540 | .addrspace_gz = &addrspace_gz, |
| 4541 | .linksection_gz = &linksection_gz, |
| 4541 | 4542 | .value_gz = &init_gz, |
| 4542 | 4543 | }); |
| 4543 | 4544 | } |
| ... | ... | @@ -4599,8 +4600,8 @@ fn comptimeDecl( |
| 4599 | 4600 | .linkage = .normal, |
| 4600 | 4601 | .type_gz = &dummy_gz, |
| 4601 | 4602 | .align_gz = &dummy_gz, |
| 4602 | | .linksection_gz = &dummy_gz, |
| 4603 | 4603 | .addrspace_gz = &dummy_gz, |
| 4604 | .linksection_gz = &dummy_gz, |
| 4604 | 4605 | .value_gz = &comptime_gz, |
| 4605 | 4606 | }); |
| 4606 | 4607 | } |
| ... | ... | @@ -11527,8 +11528,8 @@ const GenZir = struct { |
| 11527 | 11528 | |
| 11528 | 11529 | /// Must be called with the following stack set up: |
| 11529 | 11530 | /// * gz (bottom) |
| 11530 | | /// * ret_gz |
| 11531 | 11531 | /// * cc_gz |
| 11532 | /// * ret_gz |
| 11532 | 11533 | /// * body_gz (top) |
| 11533 | 11534 | /// Unstacks all of those except for `gz`. |
| 11534 | 11535 | fn addFunc( |
| ... | ... | @@ -11575,16 +11576,16 @@ const GenZir = struct { |
| 11575 | 11576 | stacked_gz = body_gz; |
| 11576 | 11577 | break :body body; |
| 11577 | 11578 | } else &.{}; |
| 11578 | | const cc_body: []const Zir.Inst.Index = if (args.cc_gz) |cc_gz| body: { |
| 11579 | | const cc_body = cc_gz.instructionsSliceUptoOpt(stacked_gz); |
| 11580 | | stacked_gz = cc_gz; |
| 11581 | | break :body cc_body; |
| 11582 | | } else &.{}; |
| 11583 | 11579 | const ret_body: []const Zir.Inst.Index = if (args.ret_gz) |ret_gz| body: { |
| 11584 | 11580 | const ret_body = ret_gz.instructionsSliceUptoOpt(stacked_gz); |
| 11585 | 11581 | stacked_gz = ret_gz; |
| 11586 | 11582 | break :body ret_body; |
| 11587 | 11583 | } else &.{}; |
| 11584 | const cc_body: []const Zir.Inst.Index = if (args.cc_gz) |cc_gz| body: { |
| 11585 | const cc_body = cc_gz.instructionsSliceUptoOpt(stacked_gz); |
| 11586 | stacked_gz = cc_gz; |
| 11587 | break :body cc_body; |
| 11588 | } else &.{}; |
| 11588 | 11589 | break :bodies .{ body, cc_body, ret_body }; |
| 11589 | 11590 | }; |
| 11590 | 11591 | |
| ... | ... | @@ -11725,8 +11726,8 @@ const GenZir = struct { |
| 11725 | 11726 | |
| 11726 | 11727 | // Order is important when unstacking. |
| 11727 | 11728 | if (args.body_gz) |body_gz| body_gz.unstack(); |
| 11728 | | if (args.cc_gz) |cc_gz| cc_gz.unstack(); |
| 11729 | 11729 | if (args.ret_gz) |ret_gz| ret_gz.unstack(); |
| 11730 | if (args.cc_gz) |cc_gz| cc_gz.unstack(); |
| 11730 | 11731 | |
| 11731 | 11732 | astgen.instructions.appendAssumeCapacity(.{ |
| 11732 | 11733 | .tag = tag, |
| ... | ... | @@ -13502,10 +13503,10 @@ fn setDeclaration( |
| 13502 | 13503 | /// Must be stacked on `type_gz`. |
| 13503 | 13504 | align_gz: *GenZir, |
| 13504 | 13505 | /// Must be stacked on `align_gz`. |
| 13505 | | linksection_gz: *GenZir, |
| 13506 | | /// Must be stacked on `linksection_gz`. |
| 13507 | 13506 | addrspace_gz: *GenZir, |
| 13508 | | /// Must be stacked on `addrspace_gz` and have nothing stacked on top of it. |
| 13507 | /// Must be stacked on `addrspace_gz`. |
| 13508 | linksection_gz: *GenZir, |
| 13509 | /// Must be stacked on `linksection_gz` and have nothing stacked on top of it. |
| 13509 | 13510 | value_gz: *GenZir, |
| 13510 | 13511 | }, |
| 13511 | 13512 | ) !void { |
| ... | ... | @@ -13513,9 +13514,9 @@ fn setDeclaration( |
| 13513 | 13514 | const gpa = astgen.gpa; |
| 13514 | 13515 | |
| 13515 | 13516 | const type_body = args.type_gz.instructionsSliceUpto(args.align_gz); |
| 13516 | | const align_body = args.align_gz.instructionsSliceUpto(args.linksection_gz); |
| 13517 | | const linksection_body = args.linksection_gz.instructionsSliceUpto(args.addrspace_gz); |
| 13518 | | const addrspace_body = args.addrspace_gz.instructionsSliceUpto(args.value_gz); |
| 13517 | const align_body = args.align_gz.instructionsSliceUpto(args.addrspace_gz); |
| 13518 | const addrspace_body = args.addrspace_gz.instructionsSliceUpto(args.linksection_gz); |
| 13519 | const linksection_body = args.linksection_gz.instructionsSliceUpto(args.value_gz); |
| 13519 | 13520 | const value_body = args.value_gz.instructionsSlice(); |
| 13520 | 13521 | |
| 13521 | 13522 | const has_name = args.name != .empty; |