From patchwork Mon Oct 21 15:49:26 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Simon Marchi (Code Review)" X-Patchwork-Id: 35199 Received: (qmail 73972 invoked by alias); 21 Oct 2019 15:49:39 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 73963 invoked by uid 89); 21 Oct 2019 15:49:39 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-26.9 required=5.0 tests=BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3 autolearn=ham version=3.3.1 spammy= X-HELO: mx1.osci.io Received: from polly.osci.io (HELO mx1.osci.io) (8.43.85.229) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Mon, 21 Oct 2019 15:49:33 +0000 Received: by mx1.osci.io (Postfix, from userid 994) id AAD43204BC; Mon, 21 Oct 2019 11:49:31 -0400 (EDT) Received: from gnutoolchain-gerrit.osci.io (gnutoolchain-gerrit.osci.io [IPv6:2620:52:3:1:5054:ff:fe06:16ca]) by mx1.osci.io (Postfix) with ESMTP id E54C620293 for ; Mon, 21 Oct 2019 11:49:26 -0400 (EDT) Received: from localhost (localhost [127.0.0.1]) by gnutoolchain-gerrit.osci.io (Postfix) with ESMTP id 8C62E21926 for ; Mon, 21 Oct 2019 11:49:26 -0400 (EDT) X-Gerrit-PatchSet: 1 Date: Mon, 21 Oct 2019 11:49:26 -0400 From: "Andrew Burgess (Code Review)" To: gdb-patches@sourceware.org Message-ID: Auto-Submitted: auto-generated X-Gerrit-MessageType: newchange Subject: [review] gdb: Ensure that !(a < a) is true in sort_cmp on obj_section objects X-Gerrit-Change-Id: I4b1e3e1640865104c0896cbb6c3fdbbc04d9645b X-Gerrit-Change-Number: 177 X-Gerrit-ChangeURL: X-Gerrit-Commit: 18702701d93c806a00fe7563b6cc647fc943959d References: Reply-To: andrew.burgess@embecosm.com, gdb-patches@sourceware.org MIME-Version: 1.0 Content-Disposition: inline User-Agent: Gerrit/3.0.3 Change URL: https://gnutoolchain-gerrit.osci.io/r/c/binutils-gdb/+/177 ...................................................................... gdb: Ensure that !(a < a) is true in sort_cmp on obj_section objects After the switch to use std::sort, if GDB is compiled with the -D_GLIBCXX_DEBUG=1 flag then we see an error when using sort_cmp (in objfiles.c) to sort obj_section objects. The problem is that std::sort checks that the condition !(a < a) holds, and currently this is not true. GDB's sort_cmp is really designed to sort lists in which no obj_section repeats, however, there is some code in place to try and ensure we get a stable sort order if there is a bug in GDB, unfortunately this code fails the above check. By reordering some of the checks inside sort_cmp, it is pretty easy to ensure that the !(a < a) condition holds. I've not bothered to make this condition check optimal, like I said this code is only in place to ensure that we get stable results if GDB goes wrong, so I've made the smallest change needed to get the correct behaviour. After this commit I see no regressions when running GDB compiled with -D_GLIBCXX_DEBUG=1. gdb/ChangeLog: * objfiles.c (sort_cmp): Ensure that !(a < a) holds true. Change-Id: I4b1e3e1640865104c0896cbb6c3fdbbc04d9645b --- M gdb/ChangeLog M gdb/objfiles.c 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 6f1a1c0..8dea436 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,7 @@ +2019-10-21 Andrew Burgess + + * objfiles.c (sort_cmp): Ensure that !(a < a) holds true. + 2019-10-21 Tom Tromey * configure.ac (nm.h): Conditionally create nm.h link. Subst diff --git a/gdb/objfiles.c b/gdb/objfiles.c index fd1cbf7..18a3e98 100644 --- a/gdb/objfiles.c +++ b/gdb/objfiles.c @@ -1044,19 +1044,23 @@ doesn't happen at all). If you discover that significant time is spent in the loops below, do 'set complaints 100' and examine the resulting complaints. */ - if (objfile1 == objfile2) { - /* Both sections came from the same objfile. We are really confused. - Sort on sequence order of sections within the objfile. */ + /* Both sections came from the same objfile. We are really + confused. Sort on sequence order of sections within the + objfile. The order of checks is important here, if we find a + match on SECT2 first then either SECT2 is before SECT1, or, + SECT2 == SECT1, in both cases we should return false. The + second case shouldn't occur during normal use, but std::sort + does check that '!(a < a)'. */ const struct obj_section *osect; ALL_OBJFILE_OSECTIONS (objfile1, osect) - if (osect == sect1) - return true; - else if (osect == sect2) + if (osect == sect2) return false; + else if (osect == sect1) + return true; /* We should have found one of the sections before getting here. */ gdb_assert_not_reached ("section not found");