This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
[PATCH] Fix mi "-var-create" regression
- From: Luis Gustavo <luis_gustavo at mentor dot com>
- To: gdb-patches at sourceware dot org
- Date: Wed, 10 Oct 2012 17:05:17 -0300
- Subject: [PATCH] Fix mi "-var-create" regression
- Reply-to: "Gustavo, Luis" <luis_gustavo at mentor dot com>
Hi,
After the commit that fixed #13393
(http://sourceware.org/bugzilla/show_bug.cgi?id=13393), certain calls to
-var-create with "set print object on" started failing with a
dereferencing error, like so:
(gdb)
-var-create - * $sp
^error,msg="Attempt to dereference a generic pointer."
(gdb)
This happens because in value.c:value_actual_type we have this check:
if (TYPE_CODE (result) == TYPE_CODE_PTR
|| TYPE_CODE (result) == TYPE_CODE_REF)
{
struct type *real_type;
real_type = value_rtti_indirect_type (value, NULL, NULL, NULL);
if (real_type)
{
if (real_type_found)
*real_type_found = 1;
result = real_type;
}
}
If we reach this point with result being a pointer of reference, we
execute the if block. This will eventually lead to a call to
valops.c:get_value_at, where we throw an error in case the target type
is void (pointers usually have such a target type)
Anton does mention a particular problem with indirect pointers in #13393
comment #8, but it is not clear if a bug ticket has been filed for that.
The following patch adds a check for target type void, and skips the
problematic if block accordingly. This fixes the problem and does not
seem to cause any regressions.
With "set print object off", everything works as it should.
Ok?
2012-10-10 Luis Machado <lgustavo@codesourcery.com>
* value.c (value_actual_type): Check for TYPE_CODE_VOID
target types.
Index: gdb/gdb/value.c
===================================================================
--- gdb.orig/gdb/value.c 2012-10-10 16:38:21.872234906 -0300
+++ gdb/gdb/value.c 2012-10-10 16:42:49.560222099 -0300
@@ -850,8 +850,13 @@ value_actual_type (struct value *value,
result = value_type (value);
if (opts.objectprint)
{
- if (TYPE_CODE (result) == TYPE_CODE_PTR
+ /* If result's target type is TYPE_CODE_VOID, do not try fetching its rtti
+ type. GDB will try to dereference the void pointer and will throw an
+ error when trying to do so. */
+ if ((TYPE_CODE (result) == TYPE_CODE_PTR
|| TYPE_CODE (result) == TYPE_CODE_REF)
+ && ((TYPE_TARGET_TYPE (result) != NULL)
+ && TYPE_CODE (TYPE_TARGET_TYPE (result)) != TYPE_CODE_VOID))
{
struct type *real_type;