| ... | @@ -174,28 +174,30 @@ pub fn resolveAddressesDwarf( | ... | @@ -174,28 +174,30 @@ pub fn resolveAddressesDwarf( |
| 174 | continue :next_pc; | 174 | continue :next_pc; |
| 175 | } | 175 | } |
| 176 | const cu = &d.compile_unit_list.items[range.compile_unit_index]; | 176 | const cu = &d.compile_unit_list.items[range.compile_unit_index]; |
| 177 | if (cu.src_loc_cache == null) { | | |
| 178 | cov.mutex.unlock(); | | |
| 179 | defer cov.mutex.lock(); | | |
| 180 | d.populateSrcLocCache(gpa, cu) catch |err| switch (err) { | | |
| 181 | error.MissingDebugInfo, error.InvalidDebugInfo => { | | |
| 182 | out.* = SourceLocation.invalid; | | |
| 183 | continue :next_pc; | | |
| 184 | }, | | |
| 185 | else => |e| return e, | | |
| 186 | }; | | |
| 187 | } | | |
| 188 | const slc = &cu.src_loc_cache.?; | | |
| 189 | const table_addrs = slc.line_table.keys(); | | |
| 190 | if (cu != prev_cu) { | 177 | if (cu != prev_cu) { |
| 191 | prev_cu = cu; | 178 | prev_cu = cu; |
| | 179 | if (cu.src_loc_cache == null) { |
| | 180 | cov.mutex.unlock(); |
| | 181 | defer cov.mutex.lock(); |
| | 182 | d.populateSrcLocCache(gpa, cu) catch |err| switch (err) { |
| | 183 | error.MissingDebugInfo, error.InvalidDebugInfo => { |
| | 184 | out.* = SourceLocation.invalid; |
| | 185 | continue :next_pc; |
| | 186 | }, |
| | 187 | else => |e| return e, |
| | 188 | }; |
| | 189 | } |
| | 190 | const slc = &cu.src_loc_cache.?; |
| | 191 | const table_addrs = slc.line_table.keys(); |
| 192 | line_table_i = std.sort.upperBound(u64, table_addrs, pc, struct { | 192 | line_table_i = std.sort.upperBound(u64, table_addrs, pc, struct { |
| 193 | fn order(context: u64, item: u64) std.math.Order { | 193 | fn order(context: u64, item: u64) std.math.Order { |
| 194 | return std.math.order(item, context); | 194 | return std.math.order(item, context); |
| 195 | } | 195 | } |
| 196 | }.order); | 196 | }.order); |
| 197 | } | 197 | } |
| 198 | while (line_table_i < table_addrs.len and table_addrs[line_table_i] < pc) line_table_i += 1; | 198 | const slc = &cu.src_loc_cache.?; |
| | 199 | const table_addrs = slc.line_table.keys(); |
| | 200 | while (line_table_i < table_addrs.len and table_addrs[line_table_i] <= pc) line_table_i += 1; |
| 199 | | 201 | |
| 200 | const entry = slc.line_table.values()[line_table_i - 1]; | 202 | const entry = slc.line_table.values()[line_table_i - 1]; |
| 201 | const corrected_file_index = entry.file - @intFromBool(slc.version < 5); | 203 | const corrected_file_index = entry.file - @intFromBool(slc.version < 5); |