From bac57b3d15b84b1e4d5365acde3a78d98f439de3 Mon Sep 17 00:00:00 2001 From: Jacob Young Date: Wed, 2 Sep 2026 07:38:17 -0400 Subject: [PATCH] dev: fix some missing checks --- src/Compilation.zig | 1 + src/Zcu.zig | 161 +++++++++++++++++----------- src/Zcu/PerThread.zig | 3 +- src/codegen.zig | 2 - src/codegen/c.zig | 3 +- src/codegen/llvm.zig | 4 +- src/crash_report.zig | 1 - src/dev.zig | 1 - src/link.zig | 6 +- src/link/Coff.zig | 2 +- src/link/ConstPool.zig | 29 ++++- src/link/Dwarf.zig | 40 ++++--- src/link/Dwarf2.zig | 133 ++++++++++++----------- src/link/Elf.zig | 1 - src/link/Elf/Atom.zig | 28 +++-- src/link/Elf/Thunk.zig | 2 + src/link/Elf/ZigObject.zig | 2 + src/link/Elf/eh_frame.zig | 4 + src/link/Elf/synthetic_sections.zig | 5 + src/link/Elf2.zig | 3 +- src/link/MachO.zig | 1 - src/link/MachO/Atom.zig | 4 +- src/link/MachO/Object.zig | 5 + src/link/MachO/ZigObject.zig | 2 + src/link/Spork8.zig | 2 - src/link/Wasm.zig | 3 - src/main.zig | 2 +- src/target.zig | 6 +- 28 files changed, 269 insertions(+), 187 deletions(-) diff --git a/src/Compilation.zig b/src/Compilation.zig index bd0996efb4ec3ab2fb874ec07da0d136f1d1ff6b..711b434c57d85cd9f6ae6df784f4b73a529b4b1e 100644 --- a/src/Compilation.zig +++ b/src/Compilation.zig @@ -2384,6 +2384,7 @@ pub fn create(gpa: Allocator, arena: Allocator, io: Io, diag: *CreateDiagnostic, comp.verbose_llvm_bc != null)) { if (opt_zcu) |zcu| { + dev.check(.llvm_backend); zcu.llvm_object = try LlvmObject.create(arena, zcu); } } diff --git a/src/Zcu.zig b/src/Zcu.zig index 22badf6b81fcec09e1a85551e2d58d124927460d..0e812d3faa42a1f0bb189f86f856e61149d5484d 100644 --- a/src/Zcu.zig +++ b/src/Zcu.zig @@ -4572,13 +4572,17 @@ pub fn callconvSupported(zcu: *Zcu, cc: std.lang.CallingConvention) union(enum) if (allowed_arch == target.cpu.arch) break; } else return .{ .bad_arch = cc.archs() }, } - const backend_ok = switch (backend) { + const backend_ok = ok: switch (backend) { .stage1 => unreachable, .other => unreachable, _ => unreachable, - .stage2_llvm => @import("codegen/llvm.zig").toLlvmCallConv(cc, target) != null, - .stage2_c => ok: { + .stage2_llvm => { + dev.check(.llvm_backend); + break :ok @import("codegen/llvm.zig").toLlvmCallConv(cc, target) != null; + }, + .stage2_c => { + dev.check(.c_backend); if (target.cCallingConvention()) |default_c| { if (cc.eql(default_c)) { break :ok true; @@ -4636,74 +4640,107 @@ pub fn callconvSupported(zcu: *Zcu, cc: std.lang.CallingConvention) union(enum) else => false, }; }, - .stage2_wasm => switch (cc) { - .wasm_mvp => |opts| opts.incoming_stack_alignment == null, - else => false, - }, - .stage2_arm => switch (cc) { - .arm_aapcs => |opts| opts.incoming_stack_alignment == null, - .naked => true, - else => false, - }, - .stage2_x86_64 => switch (cc) { - .x86_64_sysv, .x86_64_win, .naked => true, // incoming stack alignment supported - else => false, + .stage2_wasm => { + dev.check(.wasm_backend); + break :ok switch (cc) { + .wasm_mvp => |opts| opts.incoming_stack_alignment == null, + else => false, + }; }, - .stage2_aarch64 => switch (cc) { - .aarch64_aapcs, .aarch64_aapcs_darwin, .naked => true, - else => false, + .stage2_arm => { + dev.check(.arm_backend); + break :ok switch (cc) { + .arm_aapcs => |opts| opts.incoming_stack_alignment == null, + .naked => true, + else => false, + }; }, - .stage2_x86 => switch (cc) { - .x86_sysv, - .x86_win, - .x86_mingw, - => |opts| opts.incoming_stack_alignment == null and opts.register_params == 0, - .naked => true, - else => false, + .stage2_x86_64 => { + dev.check(.x86_64_backend); + break :ok switch (cc) { + .x86_64_sysv, .x86_64_win, .naked => true, // incoming stack alignment supported + else => false, + }; }, - .stage2_powerpc => switch (target.cpu.arch) { - .powerpc, .powerpcle => switch (cc) { - .powerpc_sysv, - .powerpc_sysv_altivec, - .powerpc_aix, - .powerpc_aix_altivec, - .naked, - => true, + .stage2_aarch64 => { + dev.check(.aarch64_backend); + break :ok switch (cc) { + .aarch64_aapcs, .aarch64_aapcs_darwin, .naked => true, else => false, - }, - .powerpc64, .powerpc64le => switch (cc) { - .powerpc64_elf, - .powerpc64_elf_altivec, - .powerpc64_elf_v2, - .naked, - => true, + }; + }, + .stage2_x86 => { + dev.check(.x86_backend); + break :ok switch (cc) { + .x86_sysv, + .x86_win, + .x86_mingw, + => |opts| opts.incoming_stack_alignment == null and opts.register_params == 0, + .naked => true, else => false, - }, - else => unreachable, + }; }, - .stage2_riscv64 => switch (cc) { - .riscv64_lp64 => |opts| opts.incoming_stack_alignment == null, - .naked => true, - else => false, + .stage2_powerpc => { + dev.check(.powerpc_backend); + break :ok switch (target.cpu.arch) { + .powerpc, .powerpcle => switch (cc) { + .powerpc_sysv, + .powerpc_sysv_altivec, + .powerpc_aix, + .powerpc_aix_altivec, + .naked, + => true, + else => false, + }, + .powerpc64, .powerpc64le => switch (cc) { + .powerpc64_elf, + .powerpc64_elf_altivec, + .powerpc64_elf_v2, + .naked, + => true, + else => false, + }, + else => unreachable, + }; }, - .stage2_sparc64 => switch (cc) { - .sparc64_sysv => |opts| opts.incoming_stack_alignment == null, - .naked => true, - else => false, + .stage2_riscv64 => { + dev.check(.riscv64_backend); + break :ok switch (cc) { + .riscv64_lp64 => |opts| opts.incoming_stack_alignment == null, + .naked => true, + else => false, + }; + }, + .stage2_sparc64 => { + dev.check(.sparc64_backend); + break :ok switch (cc) { + .sparc64_sysv => |opts| opts.incoming_stack_alignment == null, + .naked => true, + else => false, + }; }, - .stage2_spirv => switch (cc) { - .spirv_device, .spirv_kernel => true, - .spirv_fragment, .spirv_vertex => target.os.tag == .vulkan or target.os.tag == .opengl, - .spirv_task, .spirv_mesh => target.os.tag == .vulkan, - else => false, + .stage2_spirv => { + dev.check(.spirv_backend); + break :ok switch (cc) { + .spirv_device, .spirv_kernel => true, + .spirv_fragment, .spirv_vertex => target.os.tag == .vulkan or target.os.tag == .opengl, + .spirv_task, .spirv_mesh => target.os.tag == .vulkan, + else => false, + }; }, - .stage2_loongarch => switch (cc) { - .loongarch64_lp64, .loongarch32_ilp32, .naked => true, - else => false, + .stage2_loongarch => { + dev.check(.loongarch_backend); + break :ok switch (cc) { + .loongarch64_lp64, .loongarch32_ilp32, .naked => true, + else => false, + }; }, - .zsf_spork8 => switch (cc) { - .spork8, .naked => true, - else => false, + .zsf_spork8 => { + dev.check(.spork8_backend); + break :ok switch (cc) { + .spork8, .naked => true, + else => false, + }; }, }; if (!backend_ok) return .{ .bad_backend = backend }; @@ -5243,7 +5280,7 @@ pub const CodegenTaskPool = struct { /// memory on AIR/MIR, we see a limit of around 10 MiB of AIR in-flight. const max_air_bytes_in_flight = 10 * 1024 * 1024; - const max_funcs_in_flight = @import("link.zig").Queue.buffer_size; + const max_funcs_in_flight = link.Queue.buffer_size; available_air_bytes: u32, diff --git a/src/Zcu/PerThread.zig b/src/Zcu/PerThread.zig index f361ca74894a19148afa0e23ff403765f56a9819..06bbdf9d3ddae622fe4aeffe118b06c8c03b942e 100644 --- a/src/Zcu/PerThread.zig +++ b/src/Zcu/PerThread.zig @@ -4461,8 +4461,7 @@ pub fn runCodegen(pt: Zcu.PerThread, func_index: InternPool.Index, air: *Air) Ru comp.config.use_llvm, )) { else => unreachable, // assertion failure - .stage2_llvm, - => {}, + .stage2_llvm => {}, }, error.Canceled => |e| return e, } diff --git a/src/codegen.zig b/src/codegen.zig index e921a76dd462139db5bd2eee743dcb0c5357a45b..f1ddcab5750d0d311bcfbbefcf6cad82125b996a 100644 --- a/src/codegen.zig +++ b/src/codegen.zig @@ -744,7 +744,6 @@ fn lowerUavRef( .c => unreachable, .spirv => unreachable, .wasm => { - dev.check(link.File.Tag.wasm.devFeature()); const wasm = lf.cast(.wasm).?; assert(reloc_parent == .none); try wasm.addUavReloc(w.end, uav.val, uav.orig_ty, @intCast(offset)); @@ -797,7 +796,6 @@ fn lowerNavRef( .c => unreachable, .spirv => unreachable, .wasm => { - dev.check(link.File.Tag.wasm.devFeature()); const wasm = lf.cast(.wasm).?; assert(reloc_parent == .none); try wasm.addNavReloc(w.end, nav_index, nav_ty, @intCast(offset)); diff --git a/src/codegen/c.zig b/src/codegen/c.zig index ea5688855c6c1149af7676b1f1072241e539c121..5b1b451d6ff1feeb8d5a4addd6e615cf6f240b99 100644 --- a/src/codegen/c.zig +++ b/src/codegen/c.zig @@ -7,7 +7,6 @@ const Allocator = mem.Allocator; const Writer = std.Io.Writer; const codegen = @import("../codegen.zig"); -const dev = @import("../dev.zig"); const link = @import("../link.zig"); const Zcu = @import("../Zcu.zig"); const Module = @import("../Module.zig"); @@ -25,7 +24,7 @@ const BigIntLimb = std.math.big.Limb; const BigInt = std.math.big.int; pub fn legalizeFeatures(_: *const std.Target) ?*const Air.Legalize.Features { - return comptime switch (dev.env.supports(.legalize)) { + return comptime switch (@import("../dev.zig").env.supports(.legalize)) { inline false, true => |supports_legalize| &.init(.{ // we don't currently ask zig1 to use safe optimization modes .expand_bit_cast_safe = supports_legalize, diff --git a/src/codegen/llvm.zig b/src/codegen/llvm.zig index e818984ee00df74005032e49e7ca5178d52d5968..186dab61293ae7ccd8d00fa17d328959c8b62cc6 100644 --- a/src/codegen/llvm.zig +++ b/src/codegen/llvm.zig @@ -10,7 +10,6 @@ const build_options = @import("build_options"); const Air = @import("../Air.zig"); const codegen = @import("../codegen.zig"); const Compilation = @import("../Compilation.zig"); -const dev = @import("../dev.zig"); const InternPool = @import("../InternPool.zig"); const link = @import("../link.zig"); const Module = @import("../Module.zig"); @@ -155,12 +154,11 @@ pub const Object = struct { /// Values for `@llvm.used`. used: std.ArrayList(Builder.Constant), - pub const Ptr = if (dev.env.supports(.llvm_backend)) *Object else noreturn; + pub const Ptr = if (@import("../dev.zig").env.supports(.llvm_backend)) *Object else noreturn; const TypeMap = std.AutoHashMapUnmanaged(InternPool.Index, Builder.Type); pub fn create(arena: Allocator, zcu: *Zcu) !Ptr { - dev.check(.llvm_backend); const comp = zcu.comp; const gpa = comp.gpa; const target = zcu.getTarget(); diff --git a/src/crash_report.zig b/src/crash_report.zig index 63370d0557d6799fe584794a84026963077b7a71..8ca3c2f836a5dbd25c81645f18f5bb88e88340ab 100644 --- a/src/crash_report.zig +++ b/src/crash_report.zig @@ -215,7 +215,6 @@ const Sema = @import("Sema.zig"); const Zcu = @import("Zcu.zig"); const link = @import("link.zig"); const InternPool = @import("InternPool.zig"); -const dev = @import("dev.zig"); const print_zir = @import("print_zir.zig"); const build_options = @import("build_options"); diff --git a/src/dev.zig b/src/dev.zig index 318a689f6db7fa0708105e252195ef6bcb0d61b7..e8b62bd420f5d6e9472252cd021db4f122971f1d 100644 --- a/src/dev.zig +++ b/src/dev.zig @@ -227,7 +227,6 @@ pub const Env = enum { else => Env.sema.supports(feature), }, .@"x86_64-windows" => switch (feature) { - .build_command, .stdio_listen, .incremental, .legalize, diff --git a/src/link.zig b/src/link.zig index 45e9c105b09ec5d713475485c6b51abb681f28af..056251dcd9431a90d35720769f71ff08f9db21ec 100644 --- a/src/link.zig +++ b/src/link.zig @@ -97,7 +97,6 @@ pub const Diags = struct { return switch (msg.source_location) { .none => try bundle.addString(msg.msg), .wasm => |sl| { - dev.check(.wasm_linker); const wasm = base.?.cast(.wasm).?; return sl.string(msg.msg, bundle, wasm); }, @@ -396,8 +395,6 @@ pub const Diags = struct { } }; -pub const producer_string = if (builtin.is_test) "zig test" else "zig " ++ build_options.version; - pub const File = struct { tag: Tag, @@ -655,7 +652,6 @@ pub const File = struct { base.file = try emit.root_dir.handle.openFile(io, emit.sub_path, .{ .mode = .read_write }); }, .elf2, .coff2 => if (base.file == null) { - dev.checkAny(&.{ .elf2_linker, .coff2_linker }); const mf = if (base.cast(.elf2)) |elf| &elf.mf else if (base.cast(.coff2)) |coff| @@ -1347,7 +1343,7 @@ pub const File = struct { }; } - pub fn devFeature(tag: Tag) dev.Feature { + fn devFeature(tag: Tag) dev.Feature { return @field(dev.Feature, @tagName(tag) ++ "_linker"); } }; diff --git a/src/link/Coff.zig b/src/link/Coff.zig index 682fd8c5e1baca2085cd47cb566a0e645e334b35..4bc312b3ccb674f697b6d74c1b026c321a51300c 100644 --- a/src/link/Coff.zig +++ b/src/link/Coff.zig @@ -13,7 +13,7 @@ const codegen = @import("../codegen.zig"); const Compilation = @import("../Compilation.zig"); const InternPool = @import("../InternPool.zig"); const link = @import("../link.zig"); -const MappedFile = @import("MappedFile.zig"); +const MappedFile = link.MappedFile; const target_util = @import("../target.zig"); const Type = @import("../Type.zig"); const Value = @import("../Value.zig"); diff --git a/src/link/ConstPool.zig b/src/link/ConstPool.zig index 67dc6a13304a158821400cb05e9b75811db91d19..ab90bb9df52132f29dde6610da5e1fb65ac50abf 100644 --- a/src/link/ConstPool.zig +++ b/src/link/ConstPool.zig @@ -45,11 +45,22 @@ pub const Index = enum(u32) { }; pub const User = union(enum) { - dwarf: *@import("Dwarf.zig"), + elf: *@import("Dwarf.zig"), elf2: *@import("Elf2.zig"), + macho: *@import("Dwarf.zig"), c: *@import("C.zig"), llvm: @import("../codegen/llvm.zig").Object.Ptr, + fn devFeature(tag: @typeInfo(User).@"union".tag_type.?) dev.Feature { + return switch (tag) { + .elf => .elf_linker, + .elf2 => .elf2_linker, + .macho => .macho_linker, + .c => .c_linker, + .llvm => .llvm_backend, + }; + } + /// Inform the debug info implementation that the new constant `val` was added to the pool at /// the given index (which equals the current pool length) due to a `get` call. It is guaranteed /// that there will eventually be a call to either `updateConst` or `updateConstIncomplete` @@ -61,7 +72,10 @@ pub const User = union(enum) { val: InternPool.Index, ) link.Error!void { switch (user) { - inline else => |impl| return impl.addConst(pt, index, val), + inline else => |impl, tag| { + dev.check(devFeature(tag)); + return impl.addConst(pt, index, val); + }, } } @@ -76,7 +90,10 @@ pub const User = union(enum) { val: InternPool.Index, ) link.Error!void { switch (user) { - inline else => |impl| return impl.updateConst(pt, index, val), + inline else => |impl, tag| { + dev.check(devFeature(tag)); + return impl.updateConst(pt, index, val); + }, } } @@ -92,7 +109,10 @@ pub const User = union(enum) { val: InternPool.Index, ) link.Error!void { switch (user) { - inline else => |impl| return impl.updateConstIncomplete(pt, index, val), + inline else => |impl, tag| { + dev.check(devFeature(tag)); + return impl.updateConstIncomplete(pt, index, val); + }, } } }; @@ -289,6 +309,7 @@ fn registerTypeDeps(pool: *ConstPool, root: Index, ty: Type, zcu: *const Zcu) Al const std = @import("std"); const Allocator = std.mem.Allocator; +const dev = @import("../dev.zig"); const InternPool = @import("../InternPool.zig"); const link = @import("../link.zig"); const Type = @import("../Type.zig"); diff --git a/src/link/Dwarf.zig b/src/link/Dwarf.zig index bd8f63297044d9dd36b6f5e6bd453ec8ec33401c..8c4d2b669998e4a83d876185279822c1fcb8c862 100644 --- a/src/link/Dwarf.zig +++ b/src/link/Dwarf.zig @@ -122,7 +122,7 @@ const DebugFrame = struct { uleb128Bytes(1) + 1, } + switch (target.cpu.arch) { .x86_64 => len: { - dev.check(.x86_64_backend); + dev.checkAny(&.{ .llvm_backend, .x86_64_backend }); const Register = @import("../codegen/x86_64/bits.zig").Register; break :len uleb128Bytes(1) + sleb128Bytes(-8) + uleb128Bytes(Register.rip.dwarfNum()) + 1 + uleb128Bytes(Register.rsp.dwarfNum()) + sleb128Bytes(-1) + @@ -2092,7 +2092,7 @@ pub const WipNav = struct { assert(value.typeOf(wip_nav.pt.zcu).comptimeOnly(wip_nav.pt.zcu)); } const dwarf = wip_nav.dwarf; - const index = try dwarf.const_pool.get(wip_nav.pt, .{ .dwarf = dwarf }, value.toIntern()); + const index = try dwarf.const_pool.get(wip_nav.pt, dwarf.constPoolUser(), value.toIntern()); return dwarf.values.items[@backingInt(index)]; } @@ -3005,7 +3005,7 @@ fn finishWipNavWriterError( try dwarf.debug_line.section.replaceEntry(wip_nav.unit, wip_nav.entry, dwarf, wip_nav.debug_line.written()); try dwarf.debug_loclists.section.replaceEntry(wip_nav.unit, wip_nav.entry, dwarf, wip_nav.debug_loclists.written()); - try dwarf.const_pool.flushPending(pt, .{ .dwarf = dwarf }); + try dwarf.const_pool.flushPending(pt, dwarf.constPoolUser()); } pub fn updateComptimeNav(dwarf: *Dwarf, pt: Zcu.PerThread, nav_index: InternPool.Nav.Index) link.Error!void { @@ -3067,8 +3067,8 @@ fn updateComptimeNavInner(dwarf: *Dwarf, pt: Zcu.PerThread, nav_index: InternPoo const loaded_struct = ip.loadStructType(nav_val.toIntern()); if (nav_index.toOptional() == loaded_struct.name_nav) { // This Nav's entry is populated by the type, not the actual Nav. - _ = try dwarf.const_pool.get(pt, .{ .dwarf = dwarf }, nav_val.toIntern()); - try dwarf.const_pool.flushPending(pt, .{ .dwarf = dwarf }); + _ = try dwarf.const_pool.get(pt, dwarf.constPoolUser(), nav_val.toIntern()); + try dwarf.const_pool.flushPending(pt, dwarf.constPoolUser()); return; } break :tag .alias; @@ -3077,8 +3077,8 @@ fn updateComptimeNavInner(dwarf: *Dwarf, pt: Zcu.PerThread, nav_index: InternPoo const loaded_enum = ip.loadEnumType(nav_val.toIntern()); if (nav_index.toOptional() == loaded_enum.name_nav) { // This Nav's entry is populated by the type, not the actual Nav. - _ = try dwarf.const_pool.get(pt, .{ .dwarf = dwarf }, nav_val.toIntern()); - try dwarf.const_pool.flushPending(pt, .{ .dwarf = dwarf }); + _ = try dwarf.const_pool.get(pt, dwarf.constPoolUser(), nav_val.toIntern()); + try dwarf.const_pool.flushPending(pt, dwarf.constPoolUser()); return; } break :tag .alias; @@ -3087,8 +3087,8 @@ fn updateComptimeNavInner(dwarf: *Dwarf, pt: Zcu.PerThread, nav_index: InternPoo const loaded_union = ip.loadUnionType(nav_val.toIntern()); if (nav_index.toOptional() == loaded_union.name_nav) { // This Nav's entry is populated by the type, not the actual Nav. - _ = try dwarf.const_pool.get(pt, .{ .dwarf = dwarf }, nav_val.toIntern()); - try dwarf.const_pool.flushPending(pt, .{ .dwarf = dwarf }); + _ = try dwarf.const_pool.get(pt, dwarf.constPoolUser(), nav_val.toIntern()); + try dwarf.const_pool.flushPending(pt, dwarf.constPoolUser()); return; } break :tag .alias; @@ -3097,8 +3097,8 @@ fn updateComptimeNavInner(dwarf: *Dwarf, pt: Zcu.PerThread, nav_index: InternPoo const loaded_opaque = ip.loadOpaqueType(nav_val.toIntern()); if (nav_index.toOptional() == loaded_opaque.name_nav) { // This Nav's entry is populated by the type, not the actual Nav. - _ = try dwarf.const_pool.get(pt, .{ .dwarf = dwarf }, nav_val.toIntern()); - try dwarf.const_pool.flushPending(pt, .{ .dwarf = dwarf }); + _ = try dwarf.const_pool.get(pt, dwarf.constPoolUser(), nav_val.toIntern()); + try dwarf.const_pool.flushPending(pt, dwarf.constPoolUser()); return; } break :tag .alias; @@ -3274,7 +3274,7 @@ fn updateComptimeNavInner(dwarf: *Dwarf, pt: Zcu.PerThread, nav_index: InternPoo }, } try dwarf.debug_info.section.replaceEntry(unit, wip_nav.entry, dwarf, wip_nav.debug_info.written()); - try dwarf.const_pool.flushPending(pt, .{ .dwarf = dwarf }); + try dwarf.const_pool.flushPending(pt, dwarf.constPoolUser()); } pub fn updateContainerType( @@ -3283,7 +3283,7 @@ pub fn updateContainerType( ty: InternPool.Index, success: bool, ) !void { - try dwarf.const_pool.updateContainerType(pt, .{ .dwarf = dwarf }, ty, success); + try dwarf.const_pool.updateContainerType(pt, dwarf.constPoolUser(), ty, success); } /// Should only be called by the `link.ConstPool` implementation. pub fn addConst(dwarf: *Dwarf, pt: Zcu.PerThread, index: link.ConstPool.Index, val: InternPool.Index) Allocator.Error!void { @@ -4702,7 +4702,7 @@ fn flushWriterError(dwarf: *Dwarf, pt: Zcu.PerThread) (UpdateError || Writer.Err // Update `anyerror` based on the finished global error set. { - const index = try dwarf.const_pool.get(pt, .{ .dwarf = dwarf }, .anyerror_type); + const index = try dwarf.const_pool.get(pt, dwarf.constPoolUser(), .anyerror_type); const unit, const entry = dwarf.values.items[@backingInt(index)]; var wip_nav: WipNav = .{ .dwarf = dwarf, @@ -4737,7 +4737,7 @@ fn flushWriterError(dwarf: *Dwarf, pt: Zcu.PerThread) (UpdateError || Writer.Err } if (global_error_set_names.len > 0) try diw.writeUleb128(@backingInt(AbbrevCode.null)); try dwarf.debug_info.section.replaceEntry(wip_nav.unit, wip_nav.entry, dwarf, wip_nav.debug_info.written()); - try dwarf.const_pool.flushPending(pt, .{ .dwarf = dwarf }); + try dwarf.const_pool.flushPending(pt, dwarf.constPoolUser()); } for (dwarf.mods.keys(), dwarf.mods.values()) |mod, *mod_info| { @@ -4789,7 +4789,7 @@ fn flushWriterError(dwarf: *Dwarf, pt: Zcu.PerThread) (UpdateError || Writer.Err .debug_frame => unreachable, .eh_frame => switch (target.cpu.arch) { .x86_64 => { - dev.check(.x86_64_backend); + dev.checkAny(&.{ .llvm_backend, .x86_64_backend }); const Register = @import("../codegen/x86_64/bits.zig").Register; for (dwarf.debug_frame.section.units.items) |*unit| { header_aw.clearRetainingCapacity(); @@ -6307,6 +6307,14 @@ fn getFile(dwarf: *Dwarf) ?Io.File { return dwarf.bin_file.file; } +fn constPoolUser(dwarf: *Dwarf) link.ConstPool.User { + return switch (dwarf.bin_file.tag) { + else => unreachable, + .elf => .{ .elf = dwarf }, + .macho => .{ .macho = dwarf }, + }; +} + fn addCommonEntry(dwarf: *Dwarf, unit: Unit.Index) UpdateError!Entry.Index { const entry = try dwarf.debug_aranges.section.getUnit(unit).addEntry(dwarf.gpa); assert(try dwarf.debug_frame.section.getUnit(unit).addEntry(dwarf.gpa) == entry); diff --git a/src/link/Dwarf2.zig b/src/link/Dwarf2.zig index 7824e1812386ecd936cc92bd1c56e5f3e51ce9a0..aa8077389db21de102939ea332ce3b4ca8b32e00 100644 --- a/src/link/Dwarf2.zig +++ b/src/link/Dwarf2.zig @@ -27,15 +27,15 @@ pub const Unit = struct { alive: bool, dirs: std.array_hash_map.Auto(Unit.Index, void), files: std.array_hash_map.Auto(Zcu.File.Index, void), - frame_ni: MappedFile.Node.Index.Optional, - cie_ni: MappedFile.Node.Index.Optional, - debug_info_ni: MappedFile.Node.Index.Optional, - debug_info_header_ni: MappedFile.Node.Index.Optional, - debug_info_footer_ni: MappedFile.Node.Index.Optional, - debug_line_ni: MappedFile.Node.Index.Optional, - debug_line_header_ni: MappedFile.Node.Index.Optional, + frame_ni: link.MappedFile.Node.Index.Optional, + cie_ni: link.MappedFile.Node.Index.Optional, + debug_info_ni: link.MappedFile.Node.Index.Optional, + debug_info_header_ni: link.MappedFile.Node.Index.Optional, + debug_info_footer_ni: link.MappedFile.Node.Index.Optional, + debug_line_ni: link.MappedFile.Node.Index.Optional, + debug_line_header_ni: link.MappedFile.Node.Index.Optional, debug_line_header_changed: bool, - debug_rnglists_ni: MappedFile.Node.Index.Optional, + debug_rnglists_ni: link.MappedFile.Node.Index.Optional, debug_rnglists_offsets_table_offset: usize, debug_rnglists_end: usize, @@ -96,7 +96,7 @@ pub const Unit = struct { }; pub const Const = struct { - debug_info_ni: MappedFile.Node.Index.Optional, + debug_info_ni: link.MappedFile.Node.Index.Optional, pub fn get(cpi: link.ConstPool.Index, dwarf: *Dwarf) *Const { return &dwarf.consts.items[@backingInt(cpi)]; @@ -104,7 +104,7 @@ pub const Const = struct { }; pub const Global = struct { - debug_info_ni: MappedFile.Node.Index.Optional, + debug_info_ni: link.MappedFile.Node.Index.Optional, pub const Index = enum(u32) { _, @@ -121,9 +121,9 @@ pub const Global = struct { pub const Func = struct { state: State, - fde_ni: MappedFile.Node.Index.Optional, - debug_info_ni: MappedFile.Node.Index.Optional, - debug_line_ni: MappedFile.Node.Index.Optional, + fde_ni: link.MappedFile.Node.Index.Optional, + debug_info_ni: link.MappedFile.Node.Index.Optional, + debug_line_ni: link.MappedFile.Node.Index.Optional, pub const State = enum { unresolved, resolved }; @@ -141,7 +141,7 @@ pub const Func = struct { }; pub const Decl = struct { - debug_info_ni: MappedFile.Node.Index.Optional, + debug_info_ni: link.MappedFile.Node.Index.Optional, pub const Index = enum(u32) { _, @@ -170,7 +170,7 @@ pub const Frame = struct { }; pub const Abbrev = struct { - ni: MappedFile.Node.Index.Optional, + ni: link.MappedFile.Node.Index.Optional, end: usize, set: std.enums.EnumSet(AbbrevCode), }; @@ -191,16 +191,16 @@ pub const Line = struct { }; pub const Str = struct { - ni: MappedFile.Node.Index.Optional, + ni: link.MappedFile.Node.Index.Optional, offset: usize, map: std.HashMapUnmanaged(usize, void, Context, std.hash_map.default_max_load_percentage), fn get( s: *Str, gpa: std.mem.Allocator, - mf: *MappedFile, + mf: *link.MappedFile, str: []const u8, - ) MappedFile.Error!usize { + ) link.MappedFile.Error!usize { const ni = s.ni.unwrap().?; const slice = ni.sliceConst(mf); const gop = try s.map.getOrPutContextAdapted( @@ -250,7 +250,7 @@ pub const Rnglists = struct { }; pub const StrOffsets = struct { - ni: MappedFile.Node.Index.Optional, + ni: link.MappedFile.Node.Index.Optional, offset: usize, }; @@ -268,13 +268,13 @@ pub const Loc = union(enum) { push_object_address, call: struct { args: []const Loc = &.{}, - node: MappedFile.Node.Index, + node: link.MappedFile.Node.Index, }, form_tls_address: *const Loc, implicit_value: []const u8, stack_value: *const Loc, implicit_pointer: struct { - node: MappedFile.Node.Index, + node: link.MappedFile.Node.Index, offset: i65 = 0, }, wasm_ext: union(enum) { @@ -311,7 +311,7 @@ pub const Loc = union(enum) { fn write(loc: Loc, writer: union(enum) { io: *std.Io.Writer, - mf: *MappedFile.Node.Writer, + mf: *link.MappedFile.Node.Writer, }, dwarf: *Dwarf) link.EmitError!void { const w = switch (writer) { .io => |w| w, @@ -631,7 +631,7 @@ pub const WipNav = struct { cfa: Cfa.RegOff, }, frame_format: Frame.Format, - fde_writer: MappedFile.Node.Writer, + fde_writer: link.MappedFile.Node.Writer, frame_func_length: struct { offset: usize, size: AddressSize }, pub const Debug = struct { @@ -643,9 +643,9 @@ pub const WipNav = struct { low_pc_off: usize, high_pc: u32, }), - info_writer: MappedFile.Node.Writer, + info_writer: link.MappedFile.Node.Writer, info_func_length_offset: usize, - line_writer: MappedFile.Node.Writer, + line_writer: link.MappedFile.Node.Writer, pub fn deinit(debug: *Debug) void { const gpa = debug.pt.zcu.gpa; @@ -1268,7 +1268,7 @@ pub fn init(lf: *link.File, format: DW.Format) Dwarf { }, .frame = .{ .header = if (target.cpu.arch == .x86_64 and target.ofmt == .elf) header: { - dev.check(.x86_64_backend); + dev.checkAny(&.{ .llvm_backend, .x86_64_backend }); const Register = @import("../codegen/x86_64/bits.zig").Register; break :header comptime .{ .code_alignment_factor = 1, @@ -1385,7 +1385,7 @@ pub fn getUnit(dwarf: *Dwarf, mod: *Module) Unit.Index { pub fn getConst(dwarf: *Dwarf, pt: Zcu.PerThread, val: Value) link.Error!link.ConstPool.Index { assert(val.typeOf(pt.zcu).comptimeOnly(pt.zcu)); - return dwarf.const_pool.get(pt, .{ .elf2 = dwarf.lf.cast(.elf2).? }, val.toIntern()); + return dwarf.const_pool.get(pt, dwarf.constPoolUser(), val.toIntern()); } pub fn getGlobal(dwarf: *Dwarf, nav: InternPool.Nav.Index) link.Error!Global.Index { @@ -1514,7 +1514,7 @@ pub fn getDecl( dwarf: *Dwarf, pt: Zcu.PerThread, instance_val: InternPool.Index, -) link.Error!MappedFile.Node.Index { +) link.Error!link.MappedFile.Node.Index { assert(dwarf.pending_decl.instance_val == .none); const comp = dwarf.lf.comp; const gpa = comp.gpa; @@ -1634,7 +1634,7 @@ pub fn genDebugFrameCie( switch (arch orelse return) { else => unreachable, .x86_64 => { - dev.check(.x86_64_backend); + dev.checkAny(&.{ .llvm_backend, .x86_64_backend }); const Register = @import("../codegen/x86_64/bits.zig").Register; switch (format) { .eh_frame => try df_w.writeAll("zR\x00"), @@ -1682,7 +1682,7 @@ pub fn genDebugInfoHeader( zcu: *Zcu, mod: *Module, unit: *Unit, - dih_nw: *MappedFile.Node.Writer, + dih_nw: *link.MappedFile.Node.Writer, ) link.EmitError!void { const comp = zcu.comp; const dih_w = &dih_nw.interface; @@ -1728,7 +1728,7 @@ pub fn genDebugInfoHeader( fn genModuleDependency( dwarf: *Dwarf, - di_nw: *MappedFile.Node.Writer, + di_nw: *link.MappedFile.Node.Writer, name: []const u8, dep: *Module, module_offset: usize, @@ -1773,7 +1773,7 @@ pub fn genDebugInfoPadding(dwarf: *Dwarf, di_w: *std.Io.Writer, size: u64) std.I pub fn genDebugLineHeader( dwarf: *Dwarf, unit: *Unit, - dlh_nw: *MappedFile.Node.Writer, + dlh_nw: *link.MappedFile.Node.Writer, zcu: *Zcu, ) link.EmitError!void { const comp = zcu.comp; @@ -1911,7 +1911,7 @@ pub fn genDebugLinePadding(dl_w: *std.Io.Writer, size: u64) std.Io.Writer.Error! pub fn genDebugRnglistsHeader( dwarf: *Dwarf, unit: *Unit, - drh_nw: *MappedFile.Node.Writer, + drh_nw: *link.MappedFile.Node.Writer, ) std.Io.Writer.Error!void { const drh_w = &drh_nw.interface; try dwarf.genUnitLength(drh_w); @@ -1931,7 +1931,7 @@ pub fn genDebugRnglistsHeader( pub fn genDebugRnglists( dwarf: *Dwarf, unit: *Unit, - dr_nw: *MappedFile.Node.Writer, + dr_nw: *link.MappedFile.Node.Writer, func_si: link.File.SymbolId, func_length: u64, ) link.EmitError!void { @@ -1965,7 +1965,7 @@ pub fn updateComptimeNav( .struct_type => { const loaded_struct = ip.loadStructType(nav_val.toIntern()); if (nav_index.toOptional() == loaded_struct.name_nav) { - _ = try dwarf.const_pool.get(pt, .{ .elf2 = dwarf.lf.cast(.elf2).? }, nav_val.toIntern()); + _ = try dwarf.const_pool.get(pt, dwarf.constPoolUser(), nav_val.toIntern()); break :done; } return; @@ -1973,7 +1973,7 @@ pub fn updateComptimeNav( .enum_type => { const loaded_enum = ip.loadEnumType(nav_val.toIntern()); if (nav_index.toOptional() == loaded_enum.name_nav) { - _ = try dwarf.const_pool.get(pt, .{ .elf2 = dwarf.lf.cast(.elf2).? }, nav_val.toIntern()); + _ = try dwarf.const_pool.get(pt, dwarf.constPoolUser(), nav_val.toIntern()); break :done; } return; @@ -1981,7 +1981,7 @@ pub fn updateComptimeNav( .union_type => { const loaded_union = ip.loadUnionType(nav_val.toIntern()); if (nav_index.toOptional() == loaded_union.name_nav) { - _ = try dwarf.const_pool.get(pt, .{ .elf2 = dwarf.lf.cast(.elf2).? }, nav_val.toIntern()); + _ = try dwarf.const_pool.get(pt, dwarf.constPoolUser(), nav_val.toIntern()); break :done; } return; @@ -1989,13 +1989,13 @@ pub fn updateComptimeNav( .opaque_type => { const loaded_opaque = ip.loadOpaqueType(nav_val.toIntern()); if (nav_index.toOptional() == loaded_opaque.name_nav) { - _ = try dwarf.const_pool.get(pt, .{ .elf2 = dwarf.lf.cast(.elf2).? }, nav_val.toIntern()); + _ = try dwarf.const_pool.get(pt, dwarf.constPoolUser(), nav_val.toIntern()); break :done; } return; }, .func => |func| if (func.owner_nav == nav_index and func.generic_owner == .none) { - _ = try dwarf.const_pool.get(pt, .{ .elf2 = dwarf.lf.cast(.elf2).? }, nav_val.toIntern()); + _ = try dwarf.const_pool.get(pt, dwarf.constPoolUser(), nav_val.toIntern()); break :done; } else return, @@ -2004,7 +2004,7 @@ pub fn updateComptimeNav( // memoization, not values .memoized_call => unreachable, } - try dwarf.const_pool.flushPending(pt, .{ .elf2 = dwarf.lf.cast(.elf2).? }); + try dwarf.const_pool.flushPending(pt, dwarf.constPoolUser()); } pub fn addConst( @@ -2015,7 +2015,7 @@ pub fn addConst( lf: *link.File, ui: Unit.Index, cpi: link.ConstPool.Index, - ) link.Error!MappedFile.Node.Index, + ) link.Error!link.MappedFile.Node.Index, ) link.Error!void { const zcu = dwarf.lf.comp.zcu.?; const ip = &zcu.intern_pool; @@ -2053,7 +2053,7 @@ pub fn addConst( pub fn updateConst( dwarf: *Dwarf, pt: Zcu.PerThread, - di_nw: *MappedFile.Node.Writer, + di_nw: *link.MappedFile.Node.Writer, val: InternPool.Index, ) link.Error!void { switch (val) { @@ -2068,7 +2068,7 @@ pub fn updateConst( fn updateConstInner( dwarf: *Dwarf, pt: Zcu.PerThread, - di_nw: *MappedFile.Node.Writer, + di_nw: *link.MappedFile.Node.Writer, val: InternPool.Index, ) link.EmitError!void { const zcu = pt.zcu; @@ -2956,7 +2956,7 @@ fn optRepr(opt_child_type: Type, zcu: *const Zcu) enum { unpacked, opv_null, err pub fn updateConstIncomplete( dwarf: *Dwarf, pt: Zcu.PerThread, - di_nw: *MappedFile.Node.Writer, + di_nw: *link.MappedFile.Node.Writer, val: InternPool.Index, ) link.Error!void { log.debug("updateConstIncomplete({f})", .{Value.fromInterned(val).fmtValue(pt)}); @@ -2968,7 +2968,7 @@ pub fn updateConstIncomplete( fn updateConstIncompleteInner( dwarf: *Dwarf, pt: Zcu.PerThread, - di_nw: *MappedFile.Node.Writer, + di_nw: *link.MappedFile.Node.Writer, val: InternPool.Index, ) link.EmitError!void { const zcu = pt.zcu; @@ -3185,7 +3185,7 @@ fn updateConstIncompleteInner( fn genCaptures( dwarf: *Dwarf, pt: Zcu.PerThread, - di_nw: *MappedFile.Node.Writer, + di_nw: *link.MappedFile.Node.Writer, captures: anytype, ) link.EmitError!void { const zcu = pt.zcu; @@ -3229,7 +3229,7 @@ fn genCaptures( pub fn genDecl( dwarf: *Dwarf, pt: Zcu.PerThread, - di_nw: *MappedFile.Node.Writer, + di_nw: *link.MappedFile.Node.Writer, instance_val: InternPool.Index, ) link.Error!void { log.debug("genDecl({f})", .{Value.fromInterned(instance_val).fmtValue(pt)}); @@ -3241,7 +3241,7 @@ pub fn genDecl( fn genDeclInner( dwarf: *Dwarf, pt: Zcu.PerThread, - di_nw: *MappedFile.Node.Writer, + di_nw: *link.MappedFile.Node.Writer, instance_val: InternPool.Index, ) link.EmitError!void { const zcu = pt.zcu; @@ -3458,7 +3458,7 @@ fn genDeclInner( pub fn updateLineNumber( dwarf: *Dwarf, - mf: *MappedFile, + mf: *link.MappedFile, inst: InternPool.TrackedInst.Index, line: u32, ) void { @@ -3472,7 +3472,7 @@ pub fn updateLineNumber( ); } -pub fn lostTracking(dwarf: *Dwarf, di_nw: *MappedFile.Node.Writer) link.EmitError!void { +pub fn lostTracking(dwarf: *Dwarf, di_nw: *link.MappedFile.Node.Writer) link.EmitError!void { try dwarf.abbrevCode(di_nw, .decl_lost); } @@ -3485,14 +3485,14 @@ fn refAbbrevCodeIfExists( } fn refAbbrevCode( dwarf: *Dwarf, - mf: *MappedFile, + mf: *link.MappedFile, abbrev_code: AbbrevCode, ) link.Error!@typeInfo(AbbrevCode).@"enum".tag_type { if (dwarf.refAbbrevCodeIfExists(abbrev_code)) |backing_int| { @branchHint(.likely); return backing_int; } - var da_nw: MappedFile.Node.Writer = undefined; + var da_nw: link.MappedFile.Node.Writer = undefined; dwarf.debug_abbrev.ni.unwrap().?.writer(dwarf.lf.comp.gpa, mf, &da_nw); defer da_nw.deinit(); dwarf.genDebugAbbrev(&da_nw, abbrev_code) catch |err| switch (err) { @@ -3504,7 +3504,7 @@ fn refAbbrevCode( } fn abbrevCode( dwarf: *Dwarf, - nw: *MappedFile.Node.Writer, + nw: *link.MappedFile.Node.Writer, abbrev_code: AbbrevCode, ) link.EmitError!void { try nw.interface.writeUleb128(try dwarf.refAbbrevCode(nw.mf, abbrev_code)); @@ -3512,7 +3512,7 @@ fn abbrevCode( fn genDebugAbbrev( dwarf: *Dwarf, - da_nw: *MappedFile.Node.Writer, + da_nw: *link.MappedFile.Node.Writer, abbrev_code: AbbrevCode, ) link.EmitError!void { const abbrev = AbbrevCode.abbrevs.get(abbrev_code); @@ -3543,8 +3543,8 @@ fn secOffsetPlaceholder(dwarf: *Dwarf, w: *std.Io.Writer) std.Io.Writer.Error!vo } fn secOffset( dwarf: *Dwarf, - nw: *MappedFile.Node.Writer, - target_ni: MappedFile.Node.Index, + nw: *link.MappedFile.Node.Writer, + target_ni: link.MappedFile.Node.Index, addend: usize, ) link.EmitError!void { const offset = nw.interface.end; @@ -3566,7 +3566,7 @@ fn addrPlaceholder(dwarf: *Dwarf, w: *std.Io.Writer) std.Io.Writer.Error!void { } fn addrSym( dwarf: *Dwarf, - nw: *MappedFile.Node.Writer, + nw: *link.MappedFile.Node.Writer, target_si: link.File.SymbolId, addend: usize, ) link.EmitError!void { @@ -3584,7 +3584,7 @@ fn addrSym( fn blockConst( dwarf: *Dwarf, pt: Zcu.PerThread, - nw: *MappedFile.Node.Writer, + nw: *link.MappedFile.Node.Writer, val: Value, ) link.EmitError!void { const ty = val.typeOf(pt.zcu); @@ -3604,7 +3604,7 @@ fn blockConst( fn refType( dwarf: *Dwarf, pt: Zcu.PerThread, - nw: *MappedFile.Node.Writer, + nw: *link.MappedFile.Node.Writer, ty: Type, ) link.EmitError!void { return dwarf.refConst(pt, nw, ty.toValue()); @@ -3612,7 +3612,7 @@ fn refType( fn refConst( dwarf: *Dwarf, pt: Zcu.PerThread, - nw: *MappedFile.Node.Writer, + nw: *link.MappedFile.Node.Writer, val: Value, ) link.EmitError!void { try dwarf.secOffset(nw, Const.get(try dwarf.getConst(pt, val), dwarf).debug_info_ni.unwrap().?, 0); @@ -3685,7 +3685,7 @@ fn enumConstValue( ); } -fn exprLoc(dwarf: *Dwarf, nw: *MappedFile.Node.Writer, loc: Loc) link.EmitError!void { +fn exprLoc(dwarf: *Dwarf, nw: *link.MappedFile.Node.Writer, loc: Loc) link.EmitError!void { var buf: [@max(8, std.atomic.cache_line)]u8 = undefined; var dw: std.Io.Writer.Discarding = .init(&buf); try loc.write(.{ .io = &dw.writer }, dwarf); @@ -3694,7 +3694,7 @@ fn exprLoc(dwarf: *Dwarf, nw: *MappedFile.Node.Writer, loc: Loc) link.EmitError! try loc.write(.{ .mf = nw }, dwarf); } -fn strp(dwarf: *Dwarf, s: *Str, nw: *MappedFile.Node.Writer, str: []const u8) link.EmitError!void { +fn strp(dwarf: *Dwarf, s: *Str, nw: *link.MappedFile.Node.Writer, str: []const u8) link.EmitError!void { const comp = dwarf.lf.comp; try dwarf.secOffset(nw, s.ni.unwrap().?, s.get(comp.gpa, nw.mf, str) catch |err| switch (err) { error.MappedFileIo => return comp.link_diags.fail("failed to write output file: {t}", .{ @@ -3704,7 +3704,7 @@ fn strp(dwarf: *Dwarf, s: *Str, nw: *MappedFile.Node.Writer, str: []const u8) li }); } -fn reportWriteError(dwarf: *Dwarf, nw: *const MappedFile.Node.Writer) link.Error { +fn reportWriteError(dwarf: *Dwarf, nw: *const link.MappedFile.Node.Writer) link.Error { switch (nw.err.?) { else => |e| return e, error.MappedFileIo => return dwarf.lf.comp.link_diags.fail( @@ -3714,6 +3714,12 @@ fn reportWriteError(dwarf: *Dwarf, nw: *const MappedFile.Node.Writer) link.Error } } +fn constPoolUser(dwarf: *Dwarf) link.ConstPool.User { + return if (dwarf.lf.cast(.elf2)) |elf| .{ + .elf2 = elf, + } else unreachable; +} + fn DeclValEnum(comptime T: type) type { const decl_names = @typeInfo(T).@"struct".decl_names; @setEvalBranchQuota(10 * decl_names.len); @@ -5239,7 +5245,6 @@ const Dwarf = @This(); const InternPool = @import("../InternPool.zig"); const link = @import("../link.zig"); const log = std.log.scoped(.dwarf); -const MappedFile = @import("MappedFile.zig"); const Module = @import("../Module.zig"); const std = @import("std"); const target_info = @import("../target.zig"); diff --git a/src/link/Elf.zig b/src/link/Elf.zig index 681a86d7f4207a5a8389dfb8233c541bf543b4b8..416eab37e05651c42cfedb4e025bca62b9cac016 100644 --- a/src/link/Elf.zig +++ b/src/link/Elf.zig @@ -4410,7 +4410,6 @@ const Path = std.Build.Cache.Path; const Stat = std.Build.Cache.File.Stat; const codegen = @import("../codegen.zig"); -const dev = @import("../dev.zig"); const eh_frame = @import("Elf/eh_frame.zig"); const gc = @import("Elf/gc.zig"); const musl = @import("../libs/musl.zig"); diff --git a/src/link/Elf/Atom.zig b/src/link/Elf/Atom.zig index 075d4aced771cef907276dba8196b981c063369e..9309189f67f4307ec49be64440d5edbff16b388e 100644 --- a/src/link/Elf/Atom.zig +++ b/src/link/Elf/Atom.zig @@ -945,7 +945,7 @@ const x86_64 = struct { code: ?[]const u8, it: *RelocsIterator, ) !void { - dev.check(.x86_64_backend); + dev.checkAny(&.{ .llvm_backend, .x86_64_backend }); const t = &elf_file.base.comp.root_mod.resolved_target.result; const is_static = elf_file.base.isStatic(); const is_dyn_lib = elf_file.isEffectivelyDynLib(); @@ -1059,7 +1059,7 @@ const x86_64 = struct { it: *RelocsIterator, code: []u8, ) !void { - dev.check(.x86_64_backend); + dev.checkAny(&.{ .llvm_backend, .x86_64_backend }); const t = &elf_file.base.comp.root_mod.resolved_target.result; const diags = &elf_file.base.comp.link_diags; const r_type: elf.R_X86_64 = @fromBackingInt(@intCast(rel.r_type())); @@ -1200,7 +1200,7 @@ const x86_64 = struct { args: ResolveArgs, code: []u8, ) !void { - dev.check(.x86_64_backend); + dev.checkAny(&.{ .llvm_backend, .x86_64_backend }); const r_type: elf.R_X86_64 = @fromBackingInt(@intCast(rel.r_type())); _, const A, const S, const GOT, _, _, const DTP = args; @@ -1240,7 +1240,7 @@ const x86_64 = struct { } fn relaxGotpcrelx(code: []u8, t: *const std.Target) !void { - dev.check(.x86_64_backend); + dev.checkAny(&.{ .llvm_backend, .x86_64_backend }); const old_inst = disassemble(code) orelse return error.RelaxFailure; const inst: Instruction = switch (old_inst.encoding.mnemonic) { .call => try .new(old_inst.prefix, .call, &.{ @@ -1259,7 +1259,7 @@ const x86_64 = struct { } fn relaxRexGotpcrelx(code: []u8, t: *const std.Target) !void { - dev.check(.x86_64_backend); + dev.checkAny(&.{ .llvm_backend, .x86_64_backend }); const old_inst = disassemble(code) orelse return error.RelaxFailure; switch (old_inst.encoding.mnemonic) { .mov => { @@ -1279,7 +1279,7 @@ const x86_64 = struct { code: []u8, r_offset: usize, ) !void { - dev.check(.x86_64_backend); + dev.checkAny(&.{ .llvm_backend, .x86_64_backend }); assert(rels.len == 2); const diags = &elf_file.base.comp.link_diags; const rel: elf.R_X86_64 = @fromBackingInt(@intCast(rels[1].r_type())); @@ -1319,7 +1319,7 @@ const x86_64 = struct { code: []u8, r_offset: usize, ) !void { - dev.check(.x86_64_backend); + dev.checkAny(&.{ .llvm_backend, .x86_64_backend }); assert(rels.len == 2); const diags = &elf_file.base.comp.link_diags; const rel: elf.R_X86_64 = @fromBackingInt(@intCast(rels[1].r_type())); @@ -1366,7 +1366,7 @@ const x86_64 = struct { } fn canRelaxGotTpOff(code: []const u8, t: *const std.Target) bool { - dev.check(.x86_64_backend); + dev.checkAny(&.{ .llvm_backend, .x86_64_backend }); const old_inst = disassemble(code) orelse return false; switch (old_inst.encoding.mnemonic) { .mov => { @@ -1384,7 +1384,7 @@ const x86_64 = struct { } fn relaxGotTpOff(code: []u8, t: *const std.Target) void { - dev.check(.x86_64_backend); + dev.checkAny(&.{ .llvm_backend, .x86_64_backend }); const old_inst = disassemble(code) orelse unreachable; switch (old_inst.encoding.mnemonic) { .mov => { @@ -1401,7 +1401,7 @@ const x86_64 = struct { } fn relaxGotPcTlsDesc(code: []u8, target: *const std.Target) !void { - dev.check(.x86_64_backend); + dev.checkAny(&.{ .llvm_backend, .x86_64_backend }); const old_inst = disassemble(code) orelse return error.RelaxFailure; switch (old_inst.encoding.mnemonic) { .lea => { @@ -1425,7 +1425,7 @@ const x86_64 = struct { code: []u8, r_offset: usize, ) !void { - dev.check(.x86_64_backend); + dev.checkAny(&.{ .llvm_backend, .x86_64_backend }); assert(rels.len == 2); const diags = &elf_file.base.comp.link_diags; const rel: elf.R_X86_64 = @fromBackingInt(@intCast(rels[1].r_type())); @@ -1492,6 +1492,7 @@ const aarch64 = struct { ) !void { _ = code; _ = it; + dev.checkAny(&.{ .llvm_backend, .aarch64_backend }); const r_type: elf.R_AARCH64 = @fromBackingInt(@intCast(rel.r_type())); const is_dyn_lib = elf_file.isEffectivelyDynLib(); @@ -1569,6 +1570,7 @@ const aarch64 = struct { code_buffer: []u8, ) (error{ UnexpectedRemainder, DivisionByZero } || RelocError)!void { _ = it; + dev.checkAny(&.{ .llvm_backend, .aarch64_backend }); const diags = &elf_file.base.comp.link_diags; const r_type: elf.R_AARCH64 = @fromBackingInt(@intCast(rel.r_type())); @@ -1742,6 +1744,7 @@ const aarch64 = struct { args: ResolveArgs, code: []u8, ) !void { + dev.checkAny(&.{ .llvm_backend, .aarch64_backend }); const r_type: elf.R_AARCH64 = @fromBackingInt(@intCast(rel.r_type())); _, const A, const S, _, _, _, _ = args; @@ -1772,6 +1775,7 @@ const riscv = struct { ) !void { _ = code; _ = it; + dev.checkAny(&.{ .llvm_backend, .riscv64_backend }); const r_type: elf.R_RISCV = @fromBackingInt(@intCast(rel.r_type())); @@ -1815,6 +1819,7 @@ const riscv = struct { it: *RelocsIterator, code: []u8, ) !void { + dev.checkAny(&.{ .llvm_backend, .riscv64_backend }); const diags = &elf_file.base.comp.link_diags; const r_type: elf.R_RISCV = @fromBackingInt(@intCast(rel.r_type())); const r_offset = std.math.cast(usize, rel.r_offset) orelse return error.Overflow; @@ -1951,6 +1956,7 @@ const riscv = struct { args: ResolveArgs, code: []u8, ) !void { + dev.checkAny(&.{ .llvm_backend, .riscv64_backend }); const r_type: elf.R_RISCV = @fromBackingInt(@intCast(rel.r_type())); _, const A, const S, const GOT, _, _, const DTP = args; diff --git a/src/link/Elf/Thunk.zig b/src/link/Elf/Thunk.zig index 69af9707bc9e8d41c2b81952c32b5cc981ccfdbd..003d4399acee2896214221936c5d20a93a80a602 100644 --- a/src/link/Elf/Thunk.zig +++ b/src/link/Elf/Thunk.zig @@ -91,6 +91,7 @@ pub const Index = u32; const aarch64 = struct { fn write(thunk: Thunk, elf_file: *Elf, writer: anytype) !void { + dev.checkAny(&.{ .llvm_backend, .aarch64_backend }); for (thunk.symbols.keys(), 0..) |ref, i| { const sym = elf_file.symbol(ref).?; const saddr = thunk.address(elf_file) + @as(i64, @intCast(i * trampoline_size)); @@ -113,6 +114,7 @@ const aarch64 = struct { }; const assert = std.debug.assert; +const dev = @import("../../dev.zig"); const elf = std.elf; const log = std.log.scoped(.link); const math = std.math; diff --git a/src/link/Elf/ZigObject.zig b/src/link/Elf/ZigObject.zig index 3fb1450b305d4411ba62ce09147ecb52e41df06e..98ca8b9f25792bd25f091735689ec6e6fecaf916 100644 --- a/src/link/Elf/ZigObject.zig +++ b/src/link/Elf/ZigObject.zig @@ -2396,6 +2396,7 @@ const TlsTable = std.array_hash_map.Auto(Atom.Index, void); const x86_64 = struct { fn writeTrampolineCode(source_addr: i64, target_addr: i64, buf: *[max_trampoline_len]u8) ![]u8 { + dev.checkAny(&.{ .llvm_backend, .x86_64_backend }); const disp = @as(i64, @intCast(target_addr)) - source_addr - 5; var bytes = [_]u8{ 0xe9, 0x00, 0x00, 0x00, 0x00, // jmp rel32 @@ -2411,6 +2412,7 @@ const assert = std.debug.assert; const build_options = @import("build_options"); const builtin = @import("builtin"); const codegen = @import("../../codegen.zig"); +const dev = @import("../../dev.zig"); const elf = std.elf; const link = @import("../../link.zig"); const log = std.log.scoped(.link); diff --git a/src/link/Elf/eh_frame.zig b/src/link/Elf/eh_frame.zig index b4ac44cc9e7338519fc1f1110845a38bbe82e7ae..fb5692486b5be97c70210387709d0c4aace9f071 100644 --- a/src/link/Elf/eh_frame.zig +++ b/src/link/Elf/eh_frame.zig @@ -535,6 +535,7 @@ pub fn writeEhFrameHdr(elf_file: *Elf, writer: anytype) !void { const x86_64 = struct { fn resolveReloc(rec: anytype, elf_file: *Elf, rel: elf.Elf64_Rela, source: i64, target: i64, data: []u8) !void { + dev.checkAny(&.{ .llvm_backend, .x86_64_backend }); const r_type: elf.R_X86_64 = @fromBackingInt(@intCast(rel.r_type())); switch (r_type) { .NONE => {}, @@ -549,6 +550,7 @@ const x86_64 = struct { const aarch64 = struct { fn resolveReloc(rec: anytype, elf_file: *Elf, rel: elf.Elf64_Rela, source: i64, target: i64, data: []u8) !void { + dev.checkAny(&.{ .llvm_backend, .aarch64_backend }); const r_type: elf.R_AARCH64 = @fromBackingInt(@intCast(rel.r_type())); switch (r_type) { .NONE => {}, @@ -562,6 +564,7 @@ const aarch64 = struct { const riscv = struct { fn resolveReloc(rec: anytype, elf_file: *Elf, rel: elf.Elf64_Rela, source: i64, target: i64, data: []u8) !void { + dev.checkAny(&.{ .llvm_backend, .riscv64_backend }); const r_type: elf.R_RISCV = @fromBackingInt(@intCast(rel.r_type())); switch (r_type) { .NONE => {}, @@ -584,6 +587,7 @@ fn reportInvalidReloc(rec: anytype, elf_file: *Elf, rel: elf.Elf64_Rela) !void { const std = @import("std"); const assert = std.debug.assert; +const dev = @import("../../dev.zig"); const elf = std.elf; const math = std.math; const relocs_log = std.log.scoped(.link_relocs); diff --git a/src/link/Elf/synthetic_sections.zig b/src/link/Elf/synthetic_sections.zig index c1b9c0c53e907a2aaab52cd840a4df56d9dcb773..946134a9b26112ec02bdd427a354a5724bf84f9a 100644 --- a/src/link/Elf/synthetic_sections.zig +++ b/src/link/Elf/synthetic_sections.zig @@ -772,6 +772,7 @@ pub const PltSection = struct { const x86_64 = struct { fn write(plt: PltSection, elf_file: *Elf, writer: *std.Io.Writer) !void { + dev.checkAny(&.{ .llvm_backend, .x86_64_backend }); const shdrs = elf_file.sections.items(.shdr); const plt_addr = shdrs[elf_file.section_indexes.plt.?].sh_addr; const got_plt_addr = shdrs[elf_file.section_indexes.got_plt.?].sh_addr; @@ -807,6 +808,7 @@ pub const PltSection = struct { const aarch64 = struct { fn write(plt: PltSection, elf_file: *Elf, writer: *std.Io.Writer) !void { + dev.checkAny(&.{ .llvm_backend, .aarch64_backend }); { const shdrs = elf_file.sections.items(.shdr); const plt_addr: i64 = @intCast(shdrs[elf_file.section_indexes.plt.?].sh_addr); @@ -949,6 +951,7 @@ pub const PltGotSection = struct { const x86_64 = struct { pub fn write(plt_got: PltGotSection, elf_file: *Elf, writer: *std.Io.Writer) !void { + dev.checkAny(&.{ .llvm_backend, .x86_64_backend }); for (plt_got.symbols.items) |ref| { const sym = elf_file.symbol(ref).?; const target_addr = sym.gotAddress(elf_file); @@ -967,6 +970,7 @@ pub const PltGotSection = struct { const aarch64 = struct { fn write(plt_got: PltGotSection, elf_file: *Elf, writer: *std.Io.Writer) !void { + dev.checkAny(&.{ .llvm_backend, .aarch64_backend }); for (plt_got.symbols.items) |ref| { const sym = elf_file.symbol(ref).?; const target_addr = sym.gotAddress(elf_file); @@ -1518,6 +1522,7 @@ fn writeInt(value: anytype, elf_file: *Elf, writer: *std.Io.Writer) !void { const assert = std.debug.assert; const builtin = @import("builtin"); +const dev = @import("../../dev.zig"); const elf = std.elf; const math = std.math; const mem = std.mem; diff --git a/src/link/Elf2.zig b/src/link/Elf2.zig index 4fd1226b0d628218285d768dff173111222419a5..ba352c95f1f0471d83ae0243806f088c04a7ec65 100644 --- a/src/link/Elf2.zig +++ b/src/link/Elf2.zig @@ -7,11 +7,10 @@ const log = std.log.scoped(.link); const codegen = @import("../codegen.zig"); const Compilation = @import("../Compilation.zig"); -const dev = @import("../dev.zig"); const Dwarf = @import("Dwarf2.zig"); const InternPool = @import("../InternPool.zig"); const link = @import("../link.zig"); -const MappedFile = @import("MappedFile.zig"); +const MappedFile = link.MappedFile; const target_util = @import("../target.zig"); const tracy = @import("../tracy.zig"); const Type = @import("../Type.zig"); diff --git a/src/link/MachO.zig b/src/link/MachO.zig index 9e17264efa630896211fc511fa56e803987b9219..72e34b943e1d565e6c3360cfd017b4d9c7ba3f5e 100644 --- a/src/link/MachO.zig +++ b/src/link/MachO.zig @@ -5503,4 +5503,3 @@ const Value = @import("../Value.zig"); const UnwindInfo = @import("MachO/UnwindInfo.zig"); const WeakBind = bind.WeakBind; const ZigObject = @import("MachO/ZigObject.zig"); -const dev = @import("../dev.zig"); diff --git a/src/link/MachO/Atom.zig b/src/link/MachO/Atom.zig index a79fd6d95f28e77da73b609719111766892d1718..33da74bb70a2bc5ac82d053f223a6dfe6f673c52 100644 --- a/src/link/MachO/Atom.zig +++ b/src/link/MachO/Atom.zig @@ -853,7 +853,7 @@ fn resolveRelocInner( const x86_64 = struct { fn relaxGotLoad(self: Atom, code: []u8, rel: Relocation, macho_file: *MachO) ResolveError!void { - dev.check(.x86_64_backend); + dev.checkAny(&.{ .llvm_backend, .x86_64_backend }); const t = &macho_file.base.comp.root_mod.resolved_target.result; const diags = &macho_file.base.comp.link_diags; const old_inst = disassemble(code) orelse return error.RelaxFail; @@ -879,7 +879,7 @@ const x86_64 = struct { } fn relaxTlv(code: []u8, t: *const std.Target) error{RelaxFail}!void { - dev.check(.x86_64_backend); + dev.checkAny(&.{ .llvm_backend, .x86_64_backend }); const old_inst = disassemble(code) orelse return error.RelaxFail; switch (old_inst.encoding.mnemonic) { .mov => { diff --git a/src/link/MachO/Object.zig b/src/link/MachO/Object.zig index 6f66764847e91d8264701aa9bba95266fcbd2ae5..3c45dc419db5b1fc86b47eeffeb5c438c36ea38e 100644 --- a/src/link/MachO/Object.zig +++ b/src/link/MachO/Object.zig @@ -3,6 +3,7 @@ const Object = @This(); const trace = @import("../../tracy.zig").trace; const Archive = @import("Archive.zig"); const Atom = @import("Atom.zig"); +const dev = @import("../../dev.zig"); const Dwarf = @import("Dwarf.zig"); const File = @import("file.zig").File; const MachO = @import("../MachO.zig"); @@ -2826,6 +2827,7 @@ const x86_64 = struct { handle: File.Handle, macho_file: *MachO, ) !void { + dev.checkAny(&.{ .llvm_backend, .x86_64_backend }); const comp = macho_file.base.comp; const io = comp.io; const gpa = comp.gpa; @@ -2938,6 +2940,7 @@ const x86_64 = struct { } fn validateRelocType(rel: macho.relocation_info, rel_type: macho.reloc_type_x86_64, is_extern: bool) !Relocation.Type { + dev.checkAny(&.{ .llvm_backend, .x86_64_backend }); switch (rel_type) { .X86_64_RELOC_UNSIGNED => { if (rel.r_pcrel == 1) return error.Pcrel; @@ -2995,6 +2998,7 @@ const aarch64 = struct { handle: File.Handle, macho_file: *MachO, ) !void { + dev.checkAny(&.{ .llvm_backend, .aarch64_backend }); const comp = macho_file.base.comp; const io = comp.io; const gpa = comp.gpa; @@ -3131,6 +3135,7 @@ const aarch64 = struct { } fn validateRelocType(rel: macho.relocation_info, rel_type: macho.reloc_type_arm64, is_extern: bool) !Relocation.Type { + dev.checkAny(&.{ .llvm_backend, .aarch64_backend }); switch (rel_type) { .ARM64_RELOC_UNSIGNED => { if (rel.r_pcrel == 1) return error.Pcrel; diff --git a/src/link/MachO/ZigObject.zig b/src/link/MachO/ZigObject.zig index 7f27237432b084917e457a34c495e20912290762..93a76ca63a92db3d6528b70f827ddc93a1c89022 100644 --- a/src/link/MachO/ZigObject.zig +++ b/src/link/MachO/ZigObject.zig @@ -1744,6 +1744,7 @@ const TlvInitializerTable = std.array_hash_map.Auto(Atom.Index, TlvInitializer); const x86_64 = struct { fn writeTrampolineCode(source_addr: u64, target_addr: u64, buf: *[max_trampoline_len]u8) ![]u8 { + dev.checkAny(&.{ .llvm_backend, .x86_64_backend }); const disp = @as(i64, @intCast(target_addr)) - @as(i64, @intCast(source_addr)) - 5; var bytes = [_]u8{ 0xe9, 0x00, 0x00, 0x00, 0x00, // jmp rel32 @@ -1758,6 +1759,7 @@ const x86_64 = struct { const assert = std.debug.assert; const builtin = @import("builtin"); const codegen = @import("../../codegen.zig"); +const dev = @import("../../dev.zig"); const link = @import("../../link.zig"); const log = std.log.scoped(.link); const macho = std.macho; diff --git a/src/link/Spork8.zig b/src/link/Spork8.zig index 32c983ce1c7a407f75101bf2d5ff982373dd3820..6f925fbc71fb092a11c4fa3b8d99c0e406c6e436 100644 --- a/src/link/Spork8.zig +++ b/src/link/Spork8.zig @@ -18,7 +18,6 @@ const Mir = @import("../codegen/spork8/Mir.zig"); const link = @import("../link.zig"); const Compilation = @import("../Compilation.zig"); const Liveness = @import("../Air/Liveness.zig"); -const dev = @import("../dev.zig"); const Value = @import("../Value.zig"); base: link.File, @@ -89,7 +88,6 @@ pub fn updateFunc( func_index: InternPool.Index, any_mir: *const codegen.AnyMir, ) !void { - dev.check(.spork8_backend); // This linker implementation only works with `std.lang.CompilerBackend.zsf_spork8`. const mir = &any_mir.spork8; const zcu = pt.zcu; diff --git a/src/link/Wasm.zig b/src/link/Wasm.zig index 6f393c7b836d8674e70d220c5eabac58ef3d1391..4532b75a647013c1f15f19aebceae5a094b510ab 100644 --- a/src/link/Wasm.zig +++ b/src/link/Wasm.zig @@ -38,7 +38,6 @@ const Dwarf = @import("Dwarf.zig"); const InternPool = @import("../InternPool.zig"); const Zcu = @import("../Zcu.zig"); const codegen = @import("../codegen.zig"); -const dev = @import("../dev.zig"); const link = @import("../link.zig"); const trace = @import("../tracy.zig").trace; const wasi_libc = @import("../libs/wasi_libc.zig"); @@ -3575,8 +3574,6 @@ pub fn updateFunc( func_index: InternPool.Index, any_mir: *const codegen.AnyMir, ) !void { - dev.check(.wasm_backend); - // This linker implementation only works with codegen backend `.stage2_wasm`. const mir = &any_mir.wasm; const zcu = pt.zcu; diff --git a/src/main.zig b/src/main.zig index 4584c950abd7855d781492de48e25204a8de10c1..ea09d77f914ff36cea3d6e84738a84b0e189f093 100644 --- a/src/main.zig +++ b/src/main.zig @@ -36,7 +36,7 @@ const Module = @import("Module.zig"); test { _ = @import("codegen.zig"); - _ = @import("link/MappedFile.zig"); + _ = link.MappedFile; } const thread_stack_size = 60 << 20; diff --git a/src/target.zig b/src/target.zig index 5edf18e9581df4d786b515f6b5a2bfdf33e34561..5439374628c8f5d29c68a1e6aa55ad272e02e920 100644 --- a/src/target.zig +++ b/src/target.zig @@ -2,6 +2,7 @@ const builtin = @import("builtin"); const std = @import("std"); const assert = std.debug.assert; +const dev = @import("dev.zig"); const Type = @import("Type.zig"); const AddressSpace = std.lang.AddressSpace; const Alignment = @import("InternPool.zig").Alignment; @@ -855,7 +856,10 @@ pub fn functionPointerMask(target: *const std.Target) ?u64 { pub fn supportsTailCall(target: *const std.Target, backend: std.lang.CompilerBackend) bool { switch (backend) { - .stage2_llvm => return @import("codegen/llvm.zig").supportsTailCall(target), + .stage2_llvm => { + dev.check(.llvm_backend); + return @import("codegen/llvm.zig").supportsTailCall(target); + }, .stage2_c => return true, else => return false, } -- 2.54.0