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
This commit is contained in:
Martin Sebor 2015-06-12 00:01:50 +00:00 committed by Martin Sebor
parent 39e150e85f
commit d99a7b4d6b
2 changed files with 20 additions and 5 deletions

View File

@ -1,3 +1,11 @@
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.

View File

@ -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)
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)
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,
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,
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;