From: Doug Evans <dje@google.com>
To: Ulrich Weigand <uweigand@de.ibm.com>
Cc: gdb-patches@sourceware.org
Subject: Re: [RFA] Fix crash of convenience vars with typedefs.
Date: Tue, 18 Aug 2009 18:44:00 -0000 [thread overview]
Message-ID: <e394668d0908181117x76e5d84fn609b5f59e77c6c44@mail.gmail.com> (raw)
In-Reply-To: <200908171816.n7HIGd2j014563@d12av02.megacenter.de.ibm.com>
On Mon, Aug 17, 2009 at 11:16 AM, Ulrich Weigand<uweigand@de.ibm.com> wrote:
> I wrote:
>> Maybe it would be best to split the INTERNALVAR_SCALAR state into two
>> distinct states INTERNALVAL_INTEGER and INTERNAL_POINTER; the decision
>> can be make in set_internalvar, where we already call check_typedef,
>> and then used subsequentially.
>
> Like so. Does this fix your problem?
Almost. gdb now crashes in a different place.
[from testsuite/gdb.log]
print /x $prog_var
../../../src/gdb/findvar.c:246: internal-error: store_typed_address:
type is not a pointer or reference
A problem internal to GDB has been detected,
further debugging may prove unreliable.
Quit this debugging session? (y or n) FAIL: gdb.base/gdbvars.exp:
Print contents of new convenience variable of program variable (GDB
internal error)
n
../../../src/gdb/findvar.c:246: internal-error: store_typed_address:
type is not a pointer or reference
A problem internal to GDB has been detected,
further debugging may prove unreliable.
Can you run the testcase included in my patch?
If that passes I'm happy.
>
> Bye,
> Ulrich
>
>
> ChangeLog:
>
> * value.c (enum internalvar_kind): Replace INTERNALVAR_SCALAR by
> INTERNALVAR_INTEGER and INTERNALVAR_POINTER.
> (union internalvar_data): Replace "scalar" member by "integer"
> and "pointer".
> (value_of_internalvar): Handle INTERNALVAR_INTEGER and
> INTERNALVAR_POINTER instead of INTERNALVAR_SCALAR.
> (get_internalvar_integer): Likewise.
> (set_internalvar): Likewise.
> (set_internalvar_integer): Likewise.
> (preserve_one_internalvar): Likewise.
>
>
> Index: gdb/value.c
> ===================================================================
> RCS file: /cvs/src/src/gdb/value.c,v
> retrieving revision 1.92
> diff -u -p -r1.92 value.c
> --- gdb/value.c 13 Aug 2009 18:39:20 -0000 1.92
> +++ gdb/value.c 17 Aug 2009 17:06:30 -0000
> @@ -920,8 +920,11 @@ struct internalvar
> /* The internal variable holds a GDB internal convenience function. */
> INTERNALVAR_FUNCTION,
>
> - /* The variable holds a simple scalar value. */
> - INTERNALVAR_SCALAR,
> + /* The variable holds an integer value. */
> + INTERNALVAR_INTEGER,
> +
> + /* The variable holds a pointer value. */
> + INTERNALVAR_POINTER,
>
> /* The variable holds a GDB-provided string. */
> INTERNALVAR_STRING,
> @@ -944,19 +947,22 @@ struct internalvar
> int canonical;
> } fn;
>
> - /* A scalar value used with INTERNALVAR_SCALAR. */
> + /* An integer value used with INTERNALVAR_INTEGER. */
> struct
> {
> /* If type is non-NULL, it will be used as the type to generate
> a value for this internal variable. If type is NULL, a default
> integer type for the architecture is used. */
> struct type *type;
> - union
> - {
> - LONGEST l; /* Used with TYPE_CODE_INT and NULL types. */
> - CORE_ADDR a; /* Used with TYPE_CODE_PTR types. */
> - } val;
> - } scalar;
> + LONGEST val;
> + } integer;
> +
> + /* A pointer value used with INTERNALVAR_POINTER. */
> + struct
> + {
> + struct type *type;
> + CORE_ADDR val;
> + } pointer;
>
> /* A string value used with INTERNALVAR_STRING. */
> char *string;
> @@ -1082,16 +1088,16 @@ value_of_internalvar (struct gdbarch *gd
> val = allocate_value (builtin_type (gdbarch)->internal_fn);
> break;
>
> - case INTERNALVAR_SCALAR:
> - if (!var->u.scalar.type)
> + case INTERNALVAR_INTEGER:
> + if (!var->u.integer.type)
> val = value_from_longest (builtin_type (gdbarch)->builtin_int,
> - var->u.scalar.val.l);
> - else if (TYPE_CODE (var->u.scalar.type) == TYPE_CODE_INT)
> - val = value_from_longest (var->u.scalar.type, var->u.scalar.val.l);
> - else if (TYPE_CODE (var->u.scalar.type) == TYPE_CODE_PTR)
> - val = value_from_pointer (var->u.scalar.type, var->u.scalar.val.a);
> + var->u.integer.val);
> else
> - internal_error (__FILE__, __LINE__, "bad type");
> + val = value_from_longest (var->u.integer.type, var->u.integer.val);
> + break;
> +
> + case INTERNALVAR_POINTER:
> + val = value_from_pointer (var->u.pointer.type, var->u.pointer.val);
> break;
>
> case INTERNALVAR_STRING:
> @@ -1145,14 +1151,9 @@ get_internalvar_integer (struct internal
> {
> switch (var->kind)
> {
> - case INTERNALVAR_SCALAR:
> - if (var->u.scalar.type == NULL
> - || TYPE_CODE (var->u.scalar.type) == TYPE_CODE_INT)
> - {
> - *result = var->u.scalar.val.l;
> - return 1;
> - }
> - /* Fall through. */
> + case INTERNALVAR_INTEGER:
> + *result = var->u.integer.val;
> + return 1;
>
> default:
> return 0;
> @@ -1224,15 +1225,15 @@ set_internalvar (struct internalvar *var
> break;
>
> case TYPE_CODE_INT:
> - new_kind = INTERNALVAR_SCALAR;
> - new_data.scalar.type = value_type (val);
> - new_data.scalar.val.l = value_as_long (val);
> + new_kind = INTERNALVAR_INTEGER;
> + new_data.integer.type = value_type (val);
> + new_data.integer.val = value_as_long (val);
> break;
>
> case TYPE_CODE_PTR:
> - new_kind = INTERNALVAR_SCALAR;
> - new_data.scalar.type = value_type (val);
> - new_data.scalar.val.a = value_as_address (val);
> + new_kind = INTERNALVAR_POINTER;
> + new_data.pointer.type = value_type (val);
> + new_data.pointer.val = value_as_address (val);
> break;
>
> default:
> @@ -1269,9 +1270,9 @@ set_internalvar_integer (struct internal
> /* Clean up old contents. */
> clear_internalvar (var);
>
> - var->kind = INTERNALVAR_SCALAR;
> - var->u.scalar.type = NULL;
> - var->u.scalar.val.l = l;
> + var->kind = INTERNALVAR_INTEGER;
> + var->u.integer.type = NULL;
> + var->u.integer.val = l;
> }
>
> void
> @@ -1426,10 +1427,16 @@ preserve_one_internalvar (struct interna
> {
> switch (var->kind)
> {
> - case INTERNALVAR_SCALAR:
> - if (var->u.scalar.type && TYPE_OBJFILE (var->u.scalar.type) == objfile)
> - var->u.scalar.type
> - = copy_type_recursive (objfile, var->u.scalar.type, copied_types);
> + case INTERNALVAR_INTEGER:
> + if (var->u.integer.type && TYPE_OBJFILE (var->u.integer.type) == objfile)
> + var->u.integer.type
> + = copy_type_recursive (objfile, var->u.integer.type, copied_types);
> + break;
> +
> + case INTERNALVAR_POINTER:
> + if (TYPE_OBJFILE (var->u.pointer.type) == objfile)
> + var->u.pointer.type
> + = copy_type_recursive (objfile, var->u.pointer.type, copied_types);
> break;
>
> case INTERNALVAR_VALUE:
>
> --
> Dr. Ulrich Weigand
> GNU Toolchain for Linux on System z and Cell BE
> Ulrich.Weigand@de.ibm.com
>
next prev parent reply other threads:[~2009-08-18 18:18 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-08-15 0:22 Doug Evans
2009-08-17 13:11 ` Ulrich Weigand
2009-08-17 16:10 ` Tom Tromey
2009-08-17 18:24 ` Ulrich Weigand
2009-08-17 18:22 ` Ulrich Weigand
2009-08-18 18:44 ` Doug Evans [this message]
2009-08-19 16:43 ` [commit] " Ulrich Weigand
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=e394668d0908181117x76e5d84fn609b5f59e77c6c44@mail.gmail.com \
--to=dje@google.com \
--cc=gdb-patches@sourceware.org \
--cc=uweigand@de.ibm.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox