| ... | ... | @@ -1073,10 +1073,14 @@ const dwarf_relocs = struct { |
| 1073 | 1073 | const Addr = struct { |
| 1074 | 1074 | first_target_reloc: NodeReloc.Index, |
| 1075 | 1075 | symbol_relocs: std.ArrayList(SymbolReloc.Index), |
| 1076 | /// Index into `symbol_relocs`. |
| 1077 | pending_reloc_index: usize, |
| 1076 | 1078 | }; |
| 1077 | 1079 | const StrOffsets = struct { |
| 1078 | 1080 | first_target_reloc: NodeReloc.Index, |
| 1079 | 1081 | node_relocs: std.ArrayList(NodeReloc.Index), |
| 1082 | /// Index into `node_relocs`. |
| 1083 | pending_reloc_index: usize, |
| 1080 | 1084 | }; |
| 1081 | 1085 | const Unit = struct { |
| 1082 | 1086 | frame_cie_first_target_reloc: NodeReloc.Index, |
| ... | ... | @@ -5000,10 +5004,12 @@ fn create( |
| 5000 | 5004 | .dwarf_addr = .{ |
| 5001 | 5005 | .first_target_reloc = .none, |
| 5002 | 5006 | .symbol_relocs = .empty, |
| 5007 | .pending_reloc_index = 0, |
| 5003 | 5008 | }, |
| 5004 | 5009 | .dwarf_str_offsets = .{ |
| 5005 | 5010 | .first_target_reloc = .none, |
| 5006 | 5011 | .node_relocs = .empty, |
| 5012 | .pending_reloc_index = 0, |
| 5007 | 5013 | }, |
| 5008 | 5014 | .dwarf_units = &.{}, |
| 5009 | 5015 | .dwarf_consts = .empty, |
| ... | ... | @@ -11010,6 +11016,9 @@ pub fn idle(elf: *Elf) link.Error!bool { |
| 11010 | 11016 | if (elf.bss_moved) { |
| 11011 | 11017 | elf.bss_moved = false; |
| 11012 | 11018 | |
| 11019 | const idle_prog_node = elf.mf.update_prog_node.start(".bss", 0); |
| 11020 | defer idle_prog_node.end(); |
| 11021 | |
| 11013 | 11022 | const data_phndx = elf.getNode(elf.ni.data).segment; |
| 11014 | 11023 | const data_offset: u64, const data_vaddr: u64, const data_filesz: u64 = switch (elf.phdrSlice()) { |
| 11015 | 11024 | inline else => |phdr| .{ |
| ... | ... | @@ -11040,6 +11049,32 @@ pub fn idle(elf: *Elf) link.Error!bool { |
| 11040 | 11049 | |
| 11041 | 11050 | break :task; |
| 11042 | 11051 | } |
| 11052 | if (elf.dwarf_addr.pending_reloc_index < elf.dwarf_addr.symbol_relocs.items.len) { |
| 11053 | const idle_prog_node = elf.mf.update_prog_node.start(@tagName(Node.debug_addr), 0); |
| 11054 | defer idle_prog_node.end(); |
| 11055 | const debug_addr_ni = elf.dwarf.debug_addr.ni.unwrap().?; |
| 11056 | const debug_addr_vaddr = elf.getNodeVAddr(debug_addr_ni); |
| 11057 | for (elf.dwarf_addr.symbol_relocs.items[elf.dwarf_addr.pending_reloc_index..]) |symbol_ri| { |
| 11058 | const symbol_reloc = symbol_ri.get(elf); |
| 11059 | assert(symbol_reloc.node.unwrap().? == debug_addr_ni); |
| 11060 | symbol_reloc.flushMovedNode(elf, debug_addr_vaddr); |
| 11061 | } |
| 11062 | elf.dwarf_addr.pending_reloc_index = elf.dwarf_addr.symbol_relocs.items.len; |
| 11063 | break :task; |
| 11064 | } |
| 11065 | if (elf.dwarf_str_offsets.pending_reloc_index < elf.dwarf_str_offsets.node_relocs.items.len) { |
| 11066 | const idle_prog_node = elf.mf.update_prog_node.start(@tagName(Node.debug_str_offsets), 0); |
| 11067 | defer idle_prog_node.end(); |
| 11068 | const debug_str_offsets_ni = elf.dwarf.debug_str_offsets.ni.unwrap().?; |
| 11069 | const debug_str_offsets_vaddr = elf.getNodeVAddr(debug_str_offsets_ni); |
| 11070 | for (elf.dwarf_str_offsets.node_relocs.items[elf.dwarf_str_offsets.pending_reloc_index..]) |node_ri| { |
| 11071 | const node_reloc = node_ri.get(elf); |
| 11072 | assert(node_reloc.node.unwrap().? == debug_str_offsets_ni); |
| 11073 | node_reloc.flushMovedNode(elf, debug_str_offsets_vaddr); |
| 11074 | } |
| 11075 | elf.dwarf_str_offsets.pending_reloc_index = elf.dwarf_str_offsets.node_relocs.items.len; |
| 11076 | break :task; |
| 11077 | } |
| 11043 | 11078 | } |
| 11044 | 11079 | if (elf.inputs.items.len - elf.input_pending_index > 0) return true; |
| 11045 | 11080 | if (elf.input_sections.items.len - elf.input_section_pending_index > 0) return true; |
| ... | ... | @@ -11047,6 +11082,8 @@ pub fn idle(elf: *Elf) link.Error!bool { |
| 11047 | 11082 | if (elf.changed_symtab_index.count() > 0) return true; |
| 11048 | 11083 | if (elf.mf.updates.items.len > 0) return true; |
| 11049 | 11084 | if (elf.bss_moved) return true; |
| 11085 | if (elf.dwarf_addr.pending_reloc_index < elf.dwarf_addr.symbol_relocs.items.len) return true; |
| 11086 | if (elf.dwarf_str_offsets.pending_reloc_index < elf.dwarf_str_offsets.node_relocs.items.len) return true; |
| 11050 | 11087 | return false; |
| 11051 | 11088 | } |
| 11052 | 11089 | |
| ... | ... | @@ -11177,7 +11214,6 @@ fn genPending(elf: *Elf, pt: Zcu.PerThread) link.Error!void { |
| 11177 | 11214 | fn genPendingDebug(elf: *Elf, gpa: std.mem.Allocator) link.Error!void { |
| 11178 | 11215 | while (elf.dwarf.debug_addr.map.count() - elf.dwarf.debug_addr.pending_index > 0) { |
| 11179 | 11216 | const debug_addr_ni = elf.dwarf.debug_addr.ni.unwrap().?; |
| 11180 | | try debug_addr_ni.moved(gpa, &elf.mf); |
| 11181 | 11217 | var da_nw: link.MappedFile.Node.Writer = undefined; |
| 11182 | 11218 | debug_addr_ni.writer(gpa, &elf.mf, &da_nw); |
| 11183 | 11219 | defer da_nw.deinit(); |
| ... | ... | @@ -11190,7 +11226,6 @@ fn genPendingDebug(elf: *Elf, gpa: std.mem.Allocator) link.Error!void { |
| 11190 | 11226 | } |
| 11191 | 11227 | while (elf.dwarf.debug_str_offsets.map.count() - elf.dwarf.debug_str_offsets.pending_index > 0) { |
| 11192 | 11228 | const debug_str_offsets_ni = elf.dwarf.debug_str_offsets.ni.unwrap().?; |
| 11193 | | try debug_str_offsets_ni.moved(gpa, &elf.mf); |
| 11194 | 11229 | var dso_nw: link.MappedFile.Node.Writer = undefined; |
| 11195 | 11230 | debug_str_offsets_ni.writer(gpa, &elf.mf, &dso_nw); |
| 11196 | 11231 | defer dso_nw.deinit(); |
| ... | ... | @@ -11659,6 +11694,7 @@ fn flushMoved(elf: *Elf, ni: MappedFile.Node.Index) std.mem.Allocator.Error!void |
| 11659 | 11694 | assert(symbol_reloc.node.unwrap().? == ni); |
| 11660 | 11695 | symbol_reloc.flushMovedNode(elf, node_vaddr); |
| 11661 | 11696 | } |
| 11697 | elf.dwarf_addr.pending_reloc_index = elf.dwarf_addr.symbol_relocs.items.len; |
| 11662 | 11698 | }, |
| 11663 | 11699 | .debug_str_offsets => { |
| 11664 | 11700 | const target_section_offset = elf.computeNodeSectionOffset(ni); |
| ... | ... | @@ -11675,6 +11711,7 @@ fn flushMoved(elf: *Elf, ni: MappedFile.Node.Index) std.mem.Allocator.Error!void |
| 11675 | 11711 | assert(node_reloc.node.unwrap().? == ni); |
| 11676 | 11712 | node_reloc.flushMovedNode(elf, node_vaddr); |
| 11677 | 11713 | } |
| 11714 | elf.dwarf_str_offsets.pending_reloc_index = elf.dwarf_str_offsets.node_relocs.items.len; |
| 11678 | 11715 | }, |
| 11679 | 11716 | .unit_frame_cie => |ui| { |
| 11680 | 11717 | const target_section_offset = elf.computeNodeSectionOffset(ni); |