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:
parent
39e150e85f
commit
d99a7b4d6b
@ -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.
|
||||||
|
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user