From 5033013f17524964564dac5d422739ae5214729e Mon Sep 17 00:00:00 2001 From: Ulrich Weigand Date: Tue, 24 Oct 2017 16:33:53 +0200 Subject: [PATCH] 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 * buildsym.c (end_symtab_get_static_block): Use std::stable_sort. --- gdb/ChangeLog | 4 ++++ gdb/buildsym.c | 14 ++++++++------ 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index e13b0d8..b44349f 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,7 @@ +2017-10-24 Ulrich Weigand + + * buildsym.c (end_symtab_get_static_block): Use std::stable_sort. + 2017-10-21 Simon Marchi * memattr.h: Don't include vec.h. diff --git a/gdb/buildsym.c b/gdb/buildsym.c index c556ac1..07bfbd5 100644 --- a/gdb/buildsym.c +++ b/gdb/buildsym.c @@ -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) -- 2.7.4