| ... | @@ -22287,7 +22287,6 @@ fn zirBuiltinExtern( | ... | @@ -22287,7 +22287,6 @@ fn zirBuiltinExtern( |
| 22287 | extended: Zir.Inst.Extended.InstData, | 22287 | extended: Zir.Inst.Extended.InstData, |
| 22288 | ) CompileError!Air.Inst.Ref { | 22288 | ) CompileError!Air.Inst.Ref { |
| 22289 | const extra = sema.code.extraData(Zir.Inst.BinNode, extended.operand).data; | 22289 | const extra = sema.code.extraData(Zir.Inst.BinNode, extended.operand).data; |
| 22290 | const src = LazySrcLoc.nodeOffset(extra.node); | | |
| 22291 | const ty_src: LazySrcLoc = .{ .node_offset_builtin_call_arg0 = extra.node }; | 22290 | const ty_src: LazySrcLoc = .{ .node_offset_builtin_call_arg0 = extra.node }; |
| 22292 | const options_src: LazySrcLoc = .{ .node_offset_builtin_call_arg1 = extra.node }; | 22291 | const options_src: LazySrcLoc = .{ .node_offset_builtin_call_arg1 = extra.node }; |
| 22293 | | 22292 | |
| ... | @@ -22315,39 +22314,41 @@ fn zirBuiltinExtern( | ... | @@ -22315,39 +22314,41 @@ fn zirBuiltinExtern( |
| 22315 | const new_decl = sema.mod.declPtr(new_decl_index); | 22314 | const new_decl = sema.mod.declPtr(new_decl_index); |
| 22316 | new_decl.name = try sema.gpa.dupeZ(u8, options.name); | 22315 | new_decl.name = try sema.gpa.dupeZ(u8, options.name); |
| 22317 | | 22316 | |
| 22318 | var new_decl_arena = std.heap.ArenaAllocator.init(sema.gpa); | 22317 | { |
| 22319 | errdefer new_decl_arena.deinit(); | 22318 | var new_decl_arena = std.heap.ArenaAllocator.init(sema.gpa); |
| 22320 | const new_decl_arena_allocator = new_decl_arena.allocator(); | 22319 | errdefer new_decl_arena.deinit(); |
| | 22320 | const new_decl_arena_allocator = new_decl_arena.allocator(); |
| 22321 | | 22321 | |
| 22322 | const new_var = try new_decl_arena_allocator.create(Module.Var); | 22322 | const new_var = try new_decl_arena_allocator.create(Module.Var); |
| 22323 | errdefer new_decl_arena_allocator.destroy(new_var); | 22323 | new_var.* = .{ |
| | 22324 | .owner_decl = sema.owner_decl_index, |
| | 22325 | .init = Value.initTag(.unreachable_value), |
| | 22326 | .is_extern = true, |
| | 22327 | .is_mutable = false, |
| | 22328 | .is_threadlocal = options.is_thread_local, |
| | 22329 | .is_weak_linkage = options.linkage == .Weak, |
| | 22330 | .lib_name = null, |
| | 22331 | }; |
| 22324 | | 22332 | |
| 22325 | new_var.* = .{ | 22333 | new_decl.src_line = sema.owner_decl.src_line; |
| 22326 | .owner_decl = sema.owner_decl_index, | 22334 | // We only access this decl through the decl_ref with the correct type created |
| 22327 | .init = Value.initTag(.unreachable_value), | 22335 | // below, so this type doesn't matter |
| 22328 | .is_extern = true, | 22336 | new_decl.ty = Type.Tag.init(.anyopaque); |
| 22329 | .is_mutable = false, | 22337 | new_decl.val = try Value.Tag.variable.create(new_decl_arena_allocator, new_var); |
| 22330 | .is_threadlocal = options.is_thread_local, | 22338 | new_decl.@"align" = 0; |
| 22331 | .is_weak_linkage = options.linkage == .Weak, | 22339 | new_decl.@"linksection" = null; |
| 22332 | .lib_name = null, | 22340 | new_decl.has_tv = true; |
| 22333 | }; | 22341 | new_decl.analysis = .complete; |
| | 22342 | new_decl.generation = sema.mod.generation; |
| 22334 | | 22343 | |
| 22335 | new_decl.src_line = sema.owner_decl.src_line; | 22344 | try new_decl.finalizeNewArena(&new_decl_arena); |
| 22336 | new_decl.ty = try ty.copy(new_decl_arena_allocator); | 22345 | } |
| 22337 | new_decl.val = try Value.Tag.variable.create(new_decl_arena_allocator, new_var); | | |
| 22338 | new_decl.@"align" = 0; | | |
| 22339 | new_decl.@"linksection" = null; | | |
| 22340 | new_decl.has_tv = true; | | |
| 22341 | new_decl.analysis = .complete; | | |
| 22342 | new_decl.generation = sema.mod.generation; | | |
| 22343 | | 22346 | |
| 22344 | const arena_state = try new_decl_arena_allocator.create(std.heap.ArenaAllocator.State); | 22347 | try sema.mod.declareDeclDependency(sema.owner_decl_index, new_decl_index); |
| 22345 | arena_state.* = new_decl_arena.state; | 22348 | try sema.ensureDeclAnalyzed(new_decl_index); |
| 22346 | new_decl.value_arena = arena_state; | | |
| 22347 | | 22349 | |
| 22348 | const ref = try sema.analyzeDeclRef(new_decl_index); | 22350 | const ref = try Value.Tag.decl_ref.create(sema.arena, new_decl_index); |
| 22349 | try sema.requireRuntimeBlock(block, src, null); | 22351 | return sema.addConstant(ty, ref); |
| 22350 | return block.addBitCast(ty, ref); | | |
| 22351 | } | 22352 | } |
| 22352 | | 22353 | |
| 22353 | fn requireRuntimeBlock(sema: *Sema, block: *Block, src: LazySrcLoc, runtime_src: ?LazySrcLoc) !void { | 22354 | fn requireRuntimeBlock(sema: *Sema, block: *Block, src: LazySrcLoc, runtime_src: ?LazySrcLoc) !void { |