From patchwork Wed Feb 24 00:19:14 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Don Breazeal X-Patchwork-Id: 11034 Received: (qmail 47622 invoked by alias); 24 Feb 2016 00:19:20 -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 47606 invoked by uid 89); 24 Feb 2016 00:19:19 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.8 required=5.0 tests=AWL, BAYES_00, RCVD_IN_DNSWL_NONE, SPF_PASS autolearn=ham version=3.3.2 spammy=dereference, 1811, Hx-languages-length:2813, Eliminate X-HELO: relay1.mentorg.com Received: from relay1.mentorg.com (HELO relay1.mentorg.com) (192.94.38.131) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Wed, 24 Feb 2016 00:19:18 +0000 Received: from svr-orw-fem-05.mgc.mentorg.com ([147.34.97.43]) by relay1.mentorg.com with esmtp id 1aYNAh-00026Q-3T from Don_Breazeal@mentor.com for gdb-patches@sourceware.org; Tue, 23 Feb 2016 16:19:15 -0800 Received: from build4-lucid-cs (147.34.91.1) by svr-orw-fem-05.mgc.mentorg.com (147.34.97.43) with Microsoft SMTP Server id 14.3.224.2; Tue, 23 Feb 2016 16:19:14 -0800 Received: by build4-lucid-cs (Postfix, from userid 1905) id 92DD141155; Tue, 23 Feb 2016 16:19:14 -0800 (PST) From: Don Breazeal To: Subject: [PATCH] Eliminate -var-create error for optzd ptr to struct Date: Tue, 23 Feb 2016 16:19:14 -0800 Message-ID: <1456273154-28629-1-git-send-email-donb@codesourcery.com> MIME-Version: 1.0 X-IsSubscribed: yes Problem: This patch eliminates an error thrown when accessing the value of a pointer to a structure where the pointer has been optimized out. The error shows up as the rather ugly value of the pointer variable in Eclipse. With this change such an access will return "" like other optimized out variables. We should throw an error when dereferencing an optimized-out pointer, but not when just looking at its value. Cause: The error only occurs when '-gdb-set print object on' has been set. This setting requires GDB to "identify the actual (derived) type of the object rather than the declared type". Part of this process is to dereference the pointer in order to get the type of the thing that is pointed-to. Since the pointer has been optimized out, this is impossible, and an error is thrown. Fix: The fix is to simply ignore the 'print object on' setting for pointers or references to structures when they have been optimized out. This means we just get the declared type instead of the actual type, because in this case that's the best that we can do. Results: Attempts to dereference the optimized-out pointer using -var-create or -data-evaluate-expression will throw an error, but a dereference using -var-evaluate-expression will return an empty value. To be consistent, this last case would also throw an error. I looked into this some, enough to confirm that there isn't an obvious fix. Given that my goal is just to eliminate the unnecessary error, I stopped here. I'm working on setting things in motion for a patch to Eclipse that recognizes optimized-out pointer-to-struct in this scenario and prevents any subsequent attempt to dereference it from that end. Testing: I looked at creating a test case for this, but so far haven't been able to create anything general enough to include in the test suite. Tested on bare-metal powerpc board with Linux x86_64 host. OK? thanks --Don gdb/ChangeLog: 2016-02-23 Don Breazeal * gdb/value.c (value_actual_type): Ignore the 'print object on' setting for pointers and references to structures. --- gdb/value.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/gdb/value.c b/gdb/value.c index 738b2b2..50e4f8a 100644 --- a/gdb/value.c +++ b/gdb/value.c @@ -1203,9 +1203,10 @@ value_actual_type (struct value *value, int resolve_simple_types, /* If result's target type is TYPE_CODE_STRUCT, proceed to fetch its rtti type. */ if ((TYPE_CODE (result) == TYPE_CODE_PTR - || TYPE_CODE (result) == TYPE_CODE_REF) + || TYPE_CODE (result) == TYPE_CODE_REF) && TYPE_CODE (check_typedef (TYPE_TARGET_TYPE (result))) - == TYPE_CODE_STRUCT) + == TYPE_CODE_STRUCT + && !value_optimized_out (value)) { struct type *real_type;