Commit d99a7b4d by Martin Sebor Committed by Martin Sebor

re PR sanitizer/65479 (sanitizer stack trace missing frames past #0 on powerpc64)

2015-06-11  Martin Sebor  <msebor@redhat.com>

	PR sanitizer/65479
	* dwarf.c (struct line): Add new field idx.
	(line_compare): Use it.
	(add_line): Set it.
	(read_line_info): Reset it.

From-SVN: r224402
parent 39e150e8
2015-06-11 Martin Sebor <msebor@redhat.com>
PR sanitizer/65479
* dwarf.c (struct line): Add new field idx.
(line_compare): Use it.
(add_line): Set it.
(read_line_info): Reset it.
2015-05-29 Tristan Gingold <gingold@adacore.com> 2015-05-29 Tristan Gingold <gingold@adacore.com>
* pecoff.c: New file. * pecoff.c: New file.
......
...@@ -211,6 +211,10 @@ struct line ...@@ -211,6 +211,10 @@ struct line
const char *filename; const char *filename;
/* Line number. */ /* Line number. */
int lineno; int lineno;
/* Index of the object in the original array read from the DWARF
section, before it has been sorted. The index makes it possible
to use Quicksort and maintain stability. */
int idx;
}; };
/* A growable vector of line number information. This is used while /* A growable vector of line number information. This is used while
...@@ -940,9 +944,10 @@ unit_addrs_search (const void *vkey, const void *ventry) ...@@ -940,9 +944,10 @@ unit_addrs_search (const void *vkey, const void *ventry)
return 0; return 0;
} }
/* Sort the line vector by PC. We want a stable sort here. We know /* Sort the line vector by PC. We want a stable sort here to maintain
that the pointers are into the same array, so it is safe to compare the order of lines for the same PC values. Since the sequence is
them directly. */ being sorted in place, their addresses cannot be relied on to
maintain stability. That is the purpose of the index member. */
static int static int
line_compare (const void *v1, const void *v2) line_compare (const void *v1, const void *v2)
...@@ -954,9 +959,9 @@ line_compare (const void *v1, const void *v2) ...@@ -954,9 +959,9 @@ line_compare (const void *v1, const void *v2)
return -1; return -1;
else if (ln1->pc > ln2->pc) else if (ln1->pc > ln2->pc)
return 1; return 1;
else if (ln1 < ln2) else if (ln1->idx < ln2->idx)
return -1; return -1;
else if (ln1 > ln2) else if (ln1->idx > ln2->idx)
return 1; return 1;
else else
return 0; return 0;
...@@ -1551,6 +1556,7 @@ add_line (struct backtrace_state *state, struct dwarf_data *ddata, ...@@ -1551,6 +1556,7 @@ add_line (struct backtrace_state *state, struct dwarf_data *ddata,
ln->filename = filename; ln->filename = filename;
ln->lineno = lineno; ln->lineno = lineno;
ln->idx = vec->count;
++vec->count; ++vec->count;
...@@ -2011,6 +2017,7 @@ read_line_info (struct backtrace_state *state, struct dwarf_data *ddata, ...@@ -2011,6 +2017,7 @@ read_line_info (struct backtrace_state *state, struct dwarf_data *ddata,
ln->pc = (uintptr_t) -1; ln->pc = (uintptr_t) -1;
ln->filename = NULL; ln->filename = NULL;
ln->lineno = 0; ln->lineno = 0;
ln->idx = 0;
if (!backtrace_vector_release (state, &vec.vec, error_callback, data)) if (!backtrace_vector_release (state, &vec.vec, error_callback, data))
goto fail; goto fail;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment