authorgravatar for michael.dusan@gmail.comMichael Dusan <michael.dusan@gmail.com> 2021-04-12 15:27:59-04:00
committergravatar for michael.dusan@gmail.comMichael Dusan <michael.dusan@gmail.com> 2021-04-12 17:18:56-04:00
log28ae4982542c2bdf90dd355b51bfc309ec315e82
tree034b1ba751807ef3880277be57b67a2fa7aa43f8
parent0fa1a2cb732c85a59e72a720f19bc0d69ac9b08c

dwarf: fix LineNumberProgram check

- on first iteration populate `prev_` fields and do nothing else closes #8421

1 files changed, 5 insertions(+), 1 deletions(-)

lib/std/dwarf.zig+5-1
...@@ -157,6 +157,7 @@ const LineNumberProgram = struct {...@@ -157,6 +157,7 @@ const LineNumberProgram = struct {
157 include_dirs: []const []const u8,157 include_dirs: []const []const u8,
158 file_entries: *ArrayList(FileEntry),158 file_entries: *ArrayList(FileEntry),
159159
160 prev_valid: bool,
160 prev_address: usize,161 prev_address: usize,
161 prev_file: usize,162 prev_file: usize,
162 prev_line: i64,163 prev_line: i64,
...@@ -175,6 +176,7 @@ const LineNumberProgram = struct {...@@ -175,6 +176,7 @@ const LineNumberProgram = struct {
175 self.basic_block = false;176 self.basic_block = false;
176 self.end_sequence = false;177 self.end_sequence = false;
177 // Invalidate all the remaining fields178 // Invalidate all the remaining fields
179 self.prev_valid = false;
178 self.prev_address = 0;180 self.prev_address = 0;
179 self.prev_file = undefined;181 self.prev_file = undefined;
180 self.prev_line = undefined;182 self.prev_line = undefined;
...@@ -197,6 +199,7 @@ const LineNumberProgram = struct {...@@ -197,6 +199,7 @@ const LineNumberProgram = struct {
197 .file_entries = file_entries,199 .file_entries = file_entries,
198 .default_is_stmt = is_stmt,200 .default_is_stmt = is_stmt,
199 .target_address = target_address,201 .target_address = target_address,
202 .prev_valid = false,
200 .prev_address = 0,203 .prev_address = 0,
201 .prev_file = undefined,204 .prev_file = undefined,
202 .prev_line = undefined,205 .prev_line = undefined,
...@@ -208,7 +211,7 @@ const LineNumberProgram = struct {...@@ -208,7 +211,7 @@ const LineNumberProgram = struct {
208 }211 }
209212
210 pub fn checkLineMatch(self: *LineNumberProgram) !?debug.LineInfo {213 pub fn checkLineMatch(self: *LineNumberProgram) !?debug.LineInfo {
211 if (self.target_address >= self.prev_address and self.target_address < self.address) {214 if (self.prev_valid and self.target_address >= self.prev_address and self.target_address < self.address) {
212 const file_entry = if (self.prev_file == 0) {215 const file_entry = if (self.prev_file == 0) {
213 return error.MissingDebugInfo;216 return error.MissingDebugInfo;
214 } else if (self.prev_file - 1 >= self.file_entries.items.len) {217 } else if (self.prev_file - 1 >= self.file_entries.items.len) {
...@@ -228,6 +231,7 @@ const LineNumberProgram = struct {...@@ -228,6 +231,7 @@ const LineNumberProgram = struct {
228 };231 };
229 }232 }
230233
234 self.prev_valid = true;
231 self.prev_address = self.address;235 self.prev_address = self.address;
232 self.prev_file = self.file;236 self.prev_file = self.file;
233 self.prev_line = self.line;237 self.prev_line = self.line;