diff --git a/lib/std/debug/Dwarf.zig b/lib/std/debug/Dwarf.zig index 525e9ce078882cc4fb8013762e323579a1d05126..3bbad635ca9f613f15dbfe2fa68996de39526b8f 100644 --- a/lib/std/debug/Dwarf.zig +++ b/lib/std/debug/Dwarf.zig @@ -387,18 +387,19 @@ fn scanAllFunctions(di: *Dwarf, gpa: Allocator, endian: Endian) ScanError!void { const next_offset = unit_header.header_length + unit_header.unit_length; const version = try fr.takeInt(u16, endian); - if (version < 2 or version > 5) return bad(); - var address_size: u8 = undefined; var debug_abbrev_offset: u64 = undefined; - if (version >= 5) { + if (version == 5) { const unit_type = try fr.takeByte(); if (unit_type != DW.UT.compile) return bad(); address_size = try fr.takeByte(); debug_abbrev_offset = try readFormatSizedInt(&fr, unit_header.format, endian); - } else { + } else if (version >= 2 and version < 5) { debug_abbrev_offset = try readFormatSizedInt(&fr, unit_header.format, endian); address_size = try fr.takeByte(); + } else { + this_unit_offset += next_offset; + continue; } const abbrev_table = try di.getAbbrevTable(gpa, debug_abbrev_offset); @@ -585,18 +586,19 @@ fn scanAllCompileUnits(di: *Dwarf, gpa: Allocator, endian: Endian) ScanError!voi const next_offset = unit_header.header_length + unit_header.unit_length; const version = try fr.takeInt(u16, endian); - if (version < 2 or version > 5) return bad(); - var address_size: u8 = undefined; var debug_abbrev_offset: u64 = undefined; - if (version >= 5) { + if (version == 5) { const unit_type = try fr.takeByte(); if (unit_type != UT.compile) return bad(); address_size = try fr.takeByte(); debug_abbrev_offset = try readFormatSizedInt(&fr, unit_header.format, endian); - } else { + } else if (version >= 2 and version < 5) { debug_abbrev_offset = try readFormatSizedInt(&fr, unit_header.format, endian); address_size = try fr.takeByte(); + } else { + this_unit_offset += next_offset; + continue; } const abbrev_table = try di.getAbbrevTable(gpa, debug_abbrev_offset); diff --git a/src/link/Dwarf2.zig b/src/link/Dwarf2.zig index aa8077389db21de102939ea332ce3b4ca8b32e00..20ab9a14877402921eb62c09c2b0f2a68dbcc541 100644 --- a/src/link/Dwarf2.zig +++ b/src/link/Dwarf2.zig @@ -1058,7 +1058,6 @@ pub const WipNav = struct { 0 else zcu.navSrcLine(zcu.funcInfo(debug.wip_nav.func).owner_nav) + 1) + line); - try di_w.writeUleb128(line); try di_w.writeUleb128(column + 1); block.low_pc_off = code_off; try dwarf.addrSym(di_nw, debug.wip_nav.func_si, code_off); @@ -2898,11 +2897,6 @@ fn updateConstInner( else => return, .func => |func| { - const fi = try dwarf.getFunc(func.owner_nav); - switch (fi.get(dwarf).state) { - .unresolved => {}, - .resolved => return, - } const fn_ty = ip.indexToKey(func.ty).func_type; const nav = ip.getNav(func.owner_nav); const inst_info = nav.srcInst(ip).resolveFull(ip).?; diff --git a/src/link/Elf2.zig b/src/link/Elf2.zig index c624c3ca822a8188fc2013e8da6eed8e4ec2b574..20514f0a4a44d59e5c6e13f947d024a428b55980 100644 --- a/src/link/Elf2.zig +++ b/src/link/Elf2.zig @@ -8753,7 +8753,7 @@ pub fn updateConst( ) link.Error!void { switch (val) { .anyerror_type => {}, // handled in `updateErrorData` instead - else => try elf.updateConstInner(pt, cpi, val), + else => try elf.updateConstInner(pt, cpi, val, .complete), } } fn updateConstInner( @@ -8761,11 +8761,22 @@ fn updateConstInner( pt: Zcu.PerThread, cpi: link.ConstPool.Index, val: InternPool.Index, + complete: enum { incomplete, complete }, ) link.Error!void { switch (elf.base.comp.config.debug_format) { .strip => {}, .dwarf => { { + switch (pt.zcu.intern_pool.indexToKey(val)) { + else => {}, + .func => |func| { + const fi = try elf.dwarf.getFunc(func.owner_nav); + switch (fi.get(&elf.dwarf).state) { + .unresolved => {}, + .resolved => return, + } + }, + } const gpa = elf.base.comp.gpa; const debug_info_ni = Dwarf.Const.get(cpi, &elf.dwarf).debug_info_ni.unwrap().?; try debug_info_ni.moved(gpa, &elf.mf); @@ -8773,7 +8784,10 @@ fn updateConstInner( debug_info_ni.writer(gpa, &elf.mf, &di_nw); defer di_nw.deinit(); elf.resetNodeRelocs(debug_info_ni); - try elf.dwarf.updateConst(pt, &di_nw, val); + switch (complete) { + .incomplete => try elf.dwarf.updateConstIncomplete(pt, &di_nw, val), + .complete => try elf.dwarf.updateConst(pt, &di_nw, val), + } } try elf.genPending(pt); }, @@ -8787,23 +8801,7 @@ pub fn updateConstIncomplete( cpi: link.ConstPool.Index, val: InternPool.Index, ) link.Error!void { - switch (elf.base.comp.config.debug_format) { - .strip => {}, - .dwarf => { - { - const gpa = elf.base.comp.gpa; - const debug_info_ni = Dwarf.Const.get(cpi, &elf.dwarf).debug_info_ni.unwrap().?; - try debug_info_ni.moved(gpa, &elf.mf); - var di_nw: MappedFile.Node.Writer = undefined; - debug_info_ni.writer(gpa, &elf.mf, &di_nw); - defer di_nw.deinit(); - elf.resetNodeRelocs(debug_info_ni); - try elf.dwarf.updateConstIncomplete(pt, &di_nw, val); - } - try elf.genPending(pt); - }, - .code_view => unreachable, - } + return elf.updateConstInner(pt, cpi, val, .incomplete); } pub fn updateFunc( @@ -9032,7 +9030,7 @@ fn updateFuncInner( if (func.analysisUnordered(ip).inferred_error_set) { const ies = ip.getIfExists(.{ .inferred_error_set_type = func_index }).?; if (elf.dwarf.const_pool.getIfExists(ies)) |cpi| - try elf.updateConstInner(pt, cpi, ies); + try elf.updateConstInner(pt, cpi, ies, .complete); } }, .none => {}, @@ -9083,7 +9081,7 @@ pub fn updateErrorData(elf: *Elf, pt: Zcu.PerThread) link.Error!void { .index = @intCast(lmi), }); if (elf.dwarf.const_pool.getIfExists(.anyerror_type)) |cpi| - try elf.updateConstInner(pt, cpi, .anyerror_type); + try elf.updateConstInner(pt, cpi, .anyerror_type, .complete); } pub fn flush( diff --git a/test/src/ErrorTrace.zig b/test/src/ErrorTrace.zig index 15b8e7f46dafc0bf4c155fdf66cf85e7896848cd..43ca8776026c82022f3d3de03160113e88f286a8 100644 --- a/test/src/ErrorTrace.zig +++ b/test/src/ErrorTrace.zig @@ -36,6 +36,7 @@ pub const CaseParameters = struct { optimize: OptimizeMode = .debug, use_llvm: ?bool = null, use_lld: ?bool = null, + use_new_linker: ?bool = null, // This is intended for targets that, for any reason, shouldn't be run as part of a normal test // invocation. This could be because of a slow backend, requiring a newer LLVM version, being @@ -256,6 +257,14 @@ pub const param_sets = [_]CaseParameters{ .abi = .none, }, }, + .{ + .target = .{ + .cpu_arch = .x86_64, + .os_tag = .linux, + .abi = .none, + }, + .use_new_linker = true, + }, .{ .target = .{ .cpu_arch = .x86_64, @@ -265,6 +274,15 @@ pub const param_sets = [_]CaseParameters{ .use_llvm = true, .use_lld = true, }, + .{ + .target = .{ + .cpu_arch = .x86_64, + .os_tag = .linux, + .abi = .none, + }, + .use_llvm = true, + .use_new_linker = true, + }, .{ .target = .{ .cpu_arch = .x86_64, @@ -439,18 +457,23 @@ pub fn addCase(self: *ErrorTrace, case: Case) void { }; const backend_string = if (params.use_llvm == true) - "-llvm" + " llvm" else if (params.use_llvm == false) - "-selfhosted" + " selfhosted" else ""; - const annotated_case_name = b.fmt("check {s} ({s}{s}{t}{s})", .{ + const annotated_case_name = b.fmt("check {s} ({s} {t}{s}{s})", .{ case.name, - triple orelse "", - if (triple != null) " " else "", + triple orelse "native", params.optimize, backend_string, + if (params.use_new_linker == true) + " new_linker" + else if (params.use_lld == true) + " lld" + else + "", }); if (self.options.test_filters.len > 0) { for (self.options.test_filters) |test_filter| { @@ -472,6 +495,7 @@ pub fn addCase(self: *ErrorTrace, case: Case) void { .use_llvm = params.use_llvm, .use_lld = params.use_lld, }); + exe.use_new_linker = params.use_new_linker; exe.bundle_ubsan_rt = false; const run = b.addRunArtifact(exe); diff --git a/test/src/StackTrace.zig b/test/src/StackTrace.zig index 51d5355fa00bd85d5f43a0cba2b59bb82febbd1f..e6897214daf5d11e642855d30853c4f58d076a10 100644 --- a/test/src/StackTrace.zig +++ b/test/src/StackTrace.zig @@ -38,6 +38,7 @@ pub const CaseParameters = struct { link_libc: ?bool = null, use_llvm: ?bool = null, use_lld: ?bool = null, + use_new_linker: ?bool = null, pie: ?bool = null, /// To enable this coverage, one of two things needs to happen: /// * The compiler needs to gain the ability to strip only debug info (not symbols) @@ -752,6 +753,14 @@ pub const param_sets = [_]CaseParameters{ .abi = .none, }, }, + .{ + .target = .{ + .cpu_arch = .x86_64, + .os_tag = .linux, + .abi = .none, + }, + .use_new_linker = true, + }, .{ .target = .{ .cpu_arch = .x86_64, @@ -761,6 +770,15 @@ pub const param_sets = [_]CaseParameters{ .use_llvm = true, .use_lld = true, }, + .{ + .target = .{ + .cpu_arch = .x86_64, + .os_tag = .linux, + .abi = .none, + }, + .use_llvm = true, + .use_new_linker = true, + }, .{ .target = .{ .cpu_arch = .x86_64, @@ -1175,9 +1193,14 @@ fn addCaseInstance( const annotated_case_name = b.fmt("check {s} ({s}{s}{s}{s}{s}{s}{s}{s}{s})", .{ name, - triple orelse "", - if (triple != null) " " else "", + triple orelse "native", backend_string, + if (params.use_new_linker == true) + " new_linker" + else if (params.use_lld == true) + " lld" + else + "", if (params.pie == true) " pie" else "", if (params.link_libc == true) " libc" else "", if (params.linkage) |linkage| switch (linkage) { @@ -1210,6 +1233,7 @@ fn addCaseInstance( .use_llvm = params.use_llvm, .use_lld = params.use_lld, }); + exe.use_new_linker = params.use_new_linker; exe.linkage = params.linkage; exe.pie = params.pie; exe.bundle_ubsan_rt = false;