Fix gdb.opt/inline-cmds.exp regressions
When sorting pending blocks in end_symtab_get_static_block, blocks with the same starting address must remain in the original order to preserve inline function caller/callee relationships. The original code seems to have implicitly relied on the fact that the glibc qsort implemention actually (in the common case) provides a stable sort, although this is not guaranteed by the standard. But the GNU libstdc++ std::sort implementation is *not* stable. gdb/ChangeLog: 2017-10-24 Ulrich Weigand <uweigand@de.ibm.com> * buildsym.c (end_symtab_get_static_block): Use std::stable_sort.
This commit is contained in:
parent
93f4de3929
commit
5033013f17
|
@ -1,3 +1,7 @@
|
|||
2017-10-24 Ulrich Weigand <uweigand@de.ibm.com>
|
||||
|
||||
* buildsym.c (end_symtab_get_static_block): Use std::stable_sort.
|
||||
|
||||
2017-10-21 Simon Marchi <simon.marchi@ericsson.com>
|
||||
|
||||
* memattr.h: Don't include vec.h.
|
||||
|
|
|
@ -1249,12 +1249,14 @@ end_symtab_get_static_block (CORE_ADDR end_addr, int expandable, int required)
|
|||
for (pb = pending_blocks; pb != NULL; pb = pb->next)
|
||||
barray.push_back (pb->block);
|
||||
|
||||
std::sort (barray.begin (), barray.end (),
|
||||
[] (const block *a, const block *b)
|
||||
{
|
||||
/* Sort blocks in descending order. */
|
||||
return BLOCK_START (a) > BLOCK_START (b);
|
||||
});
|
||||
/* Sort blocks by start address in descending order. Blocks with the
|
||||
same start address must remain in the original order to preserve
|
||||
inline function caller/callee relationships. */
|
||||
std::stable_sort (barray.begin (), barray.end (),
|
||||
[] (const block *a, const block *b)
|
||||
{
|
||||
return BLOCK_START (a) > BLOCK_START (b);
|
||||
});
|
||||
|
||||
int i = 0;
|
||||
for (pb = pending_blocks; pb != NULL; pb = pb->next)
|
||||
|
|
Loading…
Reference in New Issue