Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
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
>


  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