authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2024-08-21 01:26:10-04:00
committergravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2024-08-21 01:43:22-04:00
logdb48a789632ed901cedfa9af480bb987c23fcdbf
tree89f0cb8bf7b72b0eaf96789345e4b184a1223925
parentb17bbf9e6cf9862dabac4402d9dab5cbeb3063a1

Dwarf: ensure stale relocations are deleted


1 files changed, 51 insertions(+), 17 deletions(-)

src/link/Dwarf.zig+51-17
...@@ -1958,11 +1958,10 @@ pub fn updateComptimeNav(dwarf: *Dwarf, pt: Zcu.PerThread, nav_index: InternPool...@@ -1958,11 +1958,10 @@ pub fn updateComptimeNav(dwarf: *Dwarf, pt: Zcu.PerThread, nav_index: InternPool
1958 const loc = tree.tokenLocation(0, tree.nodes.items(.main_token)[decl_inst.data.declaration.src_node]);1958 const loc = tree.tokenLocation(0, tree.nodes.items(.main_token)[decl_inst.data.declaration.src_node]);
1959 assert(loc.line == zcu.navSrcLine(nav_index));1959 assert(loc.line == zcu.navSrcLine(nav_index));
19601960
1961 const unit = try dwarf.getUnit(file.mod);
1962 var wip_nav: WipNav = .{1961 var wip_nav: WipNav = .{
1963 .dwarf = dwarf,1962 .dwarf = dwarf,
1964 .pt = pt,1963 .pt = pt,
1965 .unit = unit,1964 .unit = try dwarf.getUnit(file.mod),
1966 .entry = undefined,1965 .entry = undefined,
1967 .any_children = false,1966 .any_children = false,
1968 .func = .none,1967 .func = .none,
...@@ -1981,7 +1980,7 @@ pub fn updateComptimeNav(dwarf: *Dwarf, pt: Zcu.PerThread, nav_index: InternPool...@@ -1981,7 +1980,7 @@ pub fn updateComptimeNav(dwarf: *Dwarf, pt: Zcu.PerThread, nav_index: InternPool
1981 switch (ip.indexToKey(nav_val.toIntern())) {1980 switch (ip.indexToKey(nav_val.toIntern())) {
1982 .func => |func| {1981 .func => |func| {
1983 if (nav_gop.found_existing) {1982 if (nav_gop.found_existing) {
1984 const unit_ptr = dwarf.debug_info.section.getUnit(unit);1983 const unit_ptr = dwarf.debug_info.section.getUnit(wip_nav.unit);
1985 const entry_ptr = unit_ptr.getEntry(nav_gop.value_ptr.*);1984 const entry_ptr = unit_ptr.getEntry(nav_gop.value_ptr.*);
1986 if (entry_ptr.len >= AbbrevCode.decl_bytes) {1985 if (entry_ptr.len >= AbbrevCode.decl_bytes) {
1987 var abbrev_code_buf: [AbbrevCode.decl_bytes]u8 = undefined;1986 var abbrev_code_buf: [AbbrevCode.decl_bytes]u8 = undefined;
...@@ -2000,7 +1999,7 @@ pub fn updateComptimeNav(dwarf: *Dwarf, pt: Zcu.PerThread, nav_index: InternPool...@@ -2000,7 +1999,7 @@ pub fn updateComptimeNav(dwarf: *Dwarf, pt: Zcu.PerThread, nav_index: InternPool
2000 }1999 }
2001 }2000 }
2002 entry_ptr.clear();2001 entry_ptr.clear();
2003 } else nav_gop.value_ptr.* = try dwarf.addCommonEntry(unit);2002 } else nav_gop.value_ptr.* = try dwarf.addCommonEntry(wip_nav.unit);
2004 wip_nav.entry = nav_gop.value_ptr.*;2003 wip_nav.entry = nav_gop.value_ptr.*;
20052004
2006 const parent_type, const accessibility: u8 = if (nav.analysis_owner.unwrap()) |cau| parent: {2005 const parent_type, const accessibility: u8 = if (nav.analysis_owner.unwrap()) |cau| parent: {
...@@ -2074,8 +2073,14 @@ pub fn updateComptimeNav(dwarf: *Dwarf, pt: Zcu.PerThread, nav_index: InternPool...@@ -2074,8 +2073,14 @@ pub fn updateComptimeNav(dwarf: *Dwarf, pt: Zcu.PerThread, nav_index: InternPool
2074 if (type_inst_info.inst != value_inst) break :decl_struct;2073 if (type_inst_info.inst != value_inst) break :decl_struct;
20752074
2076 const type_gop = try dwarf.types.getOrPut(dwarf.gpa, nav_val.toIntern());2075 const type_gop = try dwarf.types.getOrPut(dwarf.gpa, nav_val.toIntern());
2077 if (type_gop.found_existing) nav_gop.value_ptr.* = type_gop.value_ptr.* else {2076 if (type_gop.found_existing) {
2078 if (!nav_gop.found_existing) nav_gop.value_ptr.* = try dwarf.addCommonEntry(unit);2077 dwarf.debug_info.section.getUnit(wip_nav.unit).getEntry(type_gop.value_ptr.*).clear();
2078 nav_gop.value_ptr.* = type_gop.value_ptr.*;
2079 } else {
2080 if (nav_gop.found_existing)
2081 dwarf.debug_info.section.getUnit(wip_nav.unit).getEntry(nav_gop.value_ptr.*).clear()
2082 else
2083 nav_gop.value_ptr.* = try dwarf.addCommonEntry(wip_nav.unit);
2079 type_gop.value_ptr.* = nav_gop.value_ptr.*;2084 type_gop.value_ptr.* = nav_gop.value_ptr.*;
2080 }2085 }
2081 wip_nav.entry = nav_gop.value_ptr.*;2086 wip_nav.entry = nav_gop.value_ptr.*;
...@@ -2139,7 +2144,10 @@ pub fn updateComptimeNav(dwarf: *Dwarf, pt: Zcu.PerThread, nav_index: InternPool...@@ -2139,7 +2144,10 @@ pub fn updateComptimeNav(dwarf: *Dwarf, pt: Zcu.PerThread, nav_index: InternPool
2139 break :done;2144 break :done;
2140 }2145 }
21412146
2142 if (!nav_gop.found_existing) nav_gop.value_ptr.* = try dwarf.addCommonEntry(unit);2147 if (nav_gop.found_existing)
2148 dwarf.debug_info.section.getUnit(wip_nav.unit).getEntry(nav_gop.value_ptr.*).clear()
2149 else
2150 nav_gop.value_ptr.* = try dwarf.addCommonEntry(wip_nav.unit);
2143 wip_nav.entry = nav_gop.value_ptr.*;2151 wip_nav.entry = nav_gop.value_ptr.*;
2144 const diw = wip_nav.debug_info.writer(dwarf.gpa);2152 const diw = wip_nav.debug_info.writer(dwarf.gpa);
2145 try uleb128(diw, @intFromEnum(AbbrevCode.decl_alias));2153 try uleb128(diw, @intFromEnum(AbbrevCode.decl_alias));
...@@ -2190,8 +2198,14 @@ pub fn updateComptimeNav(dwarf: *Dwarf, pt: Zcu.PerThread, nav_index: InternPool...@@ -2190,8 +2198,14 @@ pub fn updateComptimeNav(dwarf: *Dwarf, pt: Zcu.PerThread, nav_index: InternPool
2190 if (type_inst_info.inst != value_inst) break :decl_enum;2198 if (type_inst_info.inst != value_inst) break :decl_enum;
21912199
2192 const type_gop = try dwarf.types.getOrPut(dwarf.gpa, nav_val.toIntern());2200 const type_gop = try dwarf.types.getOrPut(dwarf.gpa, nav_val.toIntern());
2193 if (type_gop.found_existing) nav_gop.value_ptr.* = type_gop.value_ptr.* else {2201 if (type_gop.found_existing) {
2194 if (!nav_gop.found_existing) nav_gop.value_ptr.* = try dwarf.addCommonEntry(unit);2202 dwarf.debug_info.section.getUnit(wip_nav.unit).getEntry(type_gop.value_ptr.*).clear();
2203 nav_gop.value_ptr.* = type_gop.value_ptr.*;
2204 } else {
2205 if (nav_gop.found_existing)
2206 dwarf.debug_info.section.getUnit(wip_nav.unit).getEntry(nav_gop.value_ptr.*).clear()
2207 else
2208 nav_gop.value_ptr.* = try dwarf.addCommonEntry(wip_nav.unit);
2195 type_gop.value_ptr.* = nav_gop.value_ptr.*;2209 type_gop.value_ptr.* = nav_gop.value_ptr.*;
2196 }2210 }
2197 wip_nav.entry = nav_gop.value_ptr.*;2211 wip_nav.entry = nav_gop.value_ptr.*;
...@@ -2215,7 +2229,10 @@ pub fn updateComptimeNav(dwarf: *Dwarf, pt: Zcu.PerThread, nav_index: InternPool...@@ -2215,7 +2229,10 @@ pub fn updateComptimeNav(dwarf: *Dwarf, pt: Zcu.PerThread, nav_index: InternPool
2215 break :done;2229 break :done;
2216 }2230 }
22172231
2218 if (!nav_gop.found_existing) nav_gop.value_ptr.* = try dwarf.addCommonEntry(unit);2232 if (nav_gop.found_existing)
2233 dwarf.debug_info.section.getUnit(wip_nav.unit).getEntry(nav_gop.value_ptr.*).clear()
2234 else
2235 nav_gop.value_ptr.* = try dwarf.addCommonEntry(wip_nav.unit);
2219 wip_nav.entry = nav_gop.value_ptr.*;2236 wip_nav.entry = nav_gop.value_ptr.*;
2220 const diw = wip_nav.debug_info.writer(dwarf.gpa);2237 const diw = wip_nav.debug_info.writer(dwarf.gpa);
2221 try uleb128(diw, @intFromEnum(AbbrevCode.decl_alias));2238 try uleb128(diw, @intFromEnum(AbbrevCode.decl_alias));
...@@ -2264,8 +2281,14 @@ pub fn updateComptimeNav(dwarf: *Dwarf, pt: Zcu.PerThread, nav_index: InternPool...@@ -2264,8 +2281,14 @@ pub fn updateComptimeNav(dwarf: *Dwarf, pt: Zcu.PerThread, nav_index: InternPool
2264 if (type_inst_info.inst != value_inst) break :decl_union;2281 if (type_inst_info.inst != value_inst) break :decl_union;
22652282
2266 const type_gop = try dwarf.types.getOrPut(dwarf.gpa, nav_val.toIntern());2283 const type_gop = try dwarf.types.getOrPut(dwarf.gpa, nav_val.toIntern());
2267 if (type_gop.found_existing) nav_gop.value_ptr.* = type_gop.value_ptr.* else {2284 if (type_gop.found_existing) {
2268 if (!nav_gop.found_existing) nav_gop.value_ptr.* = try dwarf.addCommonEntry(unit);2285 dwarf.debug_info.section.getUnit(wip_nav.unit).getEntry(type_gop.value_ptr.*).clear();
2286 nav_gop.value_ptr.* = type_gop.value_ptr.*;
2287 } else {
2288 if (nav_gop.found_existing)
2289 dwarf.debug_info.section.getUnit(wip_nav.unit).getEntry(nav_gop.value_ptr.*).clear()
2290 else
2291 nav_gop.value_ptr.* = try dwarf.addCommonEntry(wip_nav.unit);
2269 type_gop.value_ptr.* = nav_gop.value_ptr.*;2292 type_gop.value_ptr.* = nav_gop.value_ptr.*;
2270 }2293 }
2271 wip_nav.entry = nav_gop.value_ptr.*;2294 wip_nav.entry = nav_gop.value_ptr.*;
...@@ -2328,7 +2351,10 @@ pub fn updateComptimeNav(dwarf: *Dwarf, pt: Zcu.PerThread, nav_index: InternPool...@@ -2328,7 +2351,10 @@ pub fn updateComptimeNav(dwarf: *Dwarf, pt: Zcu.PerThread, nav_index: InternPool
2328 break :done;2351 break :done;
2329 }2352 }
23302353
2331 if (!nav_gop.found_existing) nav_gop.value_ptr.* = try dwarf.addCommonEntry(unit);2354 if (nav_gop.found_existing)
2355 dwarf.debug_info.section.getUnit(wip_nav.unit).getEntry(nav_gop.value_ptr.*).clear()
2356 else
2357 nav_gop.value_ptr.* = try dwarf.addCommonEntry(wip_nav.unit);
2332 wip_nav.entry = nav_gop.value_ptr.*;2358 wip_nav.entry = nav_gop.value_ptr.*;
2333 const diw = wip_nav.debug_info.writer(dwarf.gpa);2359 const diw = wip_nav.debug_info.writer(dwarf.gpa);
2334 try uleb128(diw, @intFromEnum(AbbrevCode.decl_alias));2360 try uleb128(diw, @intFromEnum(AbbrevCode.decl_alias));
...@@ -2377,8 +2403,14 @@ pub fn updateComptimeNav(dwarf: *Dwarf, pt: Zcu.PerThread, nav_index: InternPool...@@ -2377,8 +2403,14 @@ pub fn updateComptimeNav(dwarf: *Dwarf, pt: Zcu.PerThread, nav_index: InternPool
2377 if (type_inst_info.inst != value_inst) break :decl_opaque;2403 if (type_inst_info.inst != value_inst) break :decl_opaque;
23782404
2379 const type_gop = try dwarf.types.getOrPut(dwarf.gpa, nav_val.toIntern());2405 const type_gop = try dwarf.types.getOrPut(dwarf.gpa, nav_val.toIntern());
2380 if (type_gop.found_existing) nav_gop.value_ptr.* = type_gop.value_ptr.* else {2406 if (type_gop.found_existing) {
2381 if (!nav_gop.found_existing) nav_gop.value_ptr.* = try dwarf.addCommonEntry(unit);2407 dwarf.debug_info.section.getUnit(wip_nav.unit).getEntry(type_gop.value_ptr.*).clear();
2408 nav_gop.value_ptr.* = type_gop.value_ptr.*;
2409 } else {
2410 if (nav_gop.found_existing)
2411 dwarf.debug_info.section.getUnit(wip_nav.unit).getEntry(nav_gop.value_ptr.*).clear()
2412 else
2413 nav_gop.value_ptr.* = try dwarf.addCommonEntry(wip_nav.unit);
2382 type_gop.value_ptr.* = nav_gop.value_ptr.*;2414 type_gop.value_ptr.* = nav_gop.value_ptr.*;
2383 }2415 }
2384 wip_nav.entry = nav_gop.value_ptr.*;2416 wip_nav.entry = nav_gop.value_ptr.*;
...@@ -2394,7 +2426,10 @@ pub fn updateComptimeNav(dwarf: *Dwarf, pt: Zcu.PerThread, nav_index: InternPool...@@ -2394,7 +2426,10 @@ pub fn updateComptimeNav(dwarf: *Dwarf, pt: Zcu.PerThread, nav_index: InternPool
2394 break :done;2426 break :done;
2395 }2427 }
23962428
2397 if (!nav_gop.found_existing) nav_gop.value_ptr.* = try dwarf.addCommonEntry(unit);2429 if (nav_gop.found_existing)
2430 dwarf.debug_info.section.getUnit(wip_nav.unit).getEntry(nav_gop.value_ptr.*).clear()
2431 else
2432 nav_gop.value_ptr.* = try dwarf.addCommonEntry(wip_nav.unit);
2398 wip_nav.entry = nav_gop.value_ptr.*;2433 wip_nav.entry = nav_gop.value_ptr.*;
2399 const diw = wip_nav.debug_info.writer(dwarf.gpa);2434 const diw = wip_nav.debug_info.writer(dwarf.gpa);
2400 try uleb128(diw, @intFromEnum(AbbrevCode.decl_alias));2435 try uleb128(diw, @intFromEnum(AbbrevCode.decl_alias));
...@@ -2412,7 +2447,6 @@ pub fn updateComptimeNav(dwarf: *Dwarf, pt: Zcu.PerThread, nav_index: InternPool...@@ -2412,7 +2447,6 @@ pub fn updateComptimeNav(dwarf: *Dwarf, pt: Zcu.PerThread, nav_index: InternPool
2412 },2447 },
2413 }2448 }
2414 try dwarf.debug_info.section.replaceEntry(wip_nav.unit, wip_nav.entry, dwarf, wip_nav.debug_info.items);2449 try dwarf.debug_info.section.replaceEntry(wip_nav.unit, wip_nav.entry, dwarf, wip_nav.debug_info.items);
2415 try dwarf.debug_loclists.section.replaceEntry(wip_nav.unit, wip_nav.entry, dwarf, wip_nav.debug_loclists.items);
2416 try wip_nav.flush();2450 try wip_nav.flush();
2417}2451}
24182452