Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Paul Hilfinger <Hilfinger@adacore.com>
To: tromey@redhat.com
Cc: brobecker@adacore.com, gdb-patches@sourceware.org
Subject: Re: [RFA] 64-bit range types in GDB
Date: Sat, 05 Dec 2009 12:18:00 -0000	[thread overview]
Message-ID: <20091205121800.DB060227B32@nile.gnat.com> (raw)
In-Reply-To: <m3zl5yegg8.fsf@fleche.redhat.com> (message from Tom Tromey on 	Fri, 04 Dec 2009 11:34:31 -0700)


Tom,

Thanks for the (blindingly) fast response.  Is Joel blackmailing you or 
something?  I could have a word with him if so.

> Paul> +/* Fix the RANGE_TYPE flags if we think they are incorrect.
> Paul> +   This is a temporary (?) hack to work around problems with handling 
> Paul> +   of >32bit range types on older compilers. On pure 32-bit hosts, 
> Paul> +   the compiler does not always emit the bounds as expected. 
> Paul> +   FIXME: pnh/2009-08-05. */
> Paul> + 
> Paul> +static void
> Paul> +fixup_range_type_hack (struct type *range_type, struct die_info *die,
> Paul> +                       struct dwarf2_cu *cu)
> 
> On irc, Joel said that he thought that this was perhaps no longer
> needed.  Could you comment?

In fact, at one point I HAD removed this function, but then discovered to
my annoyance that it was still needed somewhere.  I'll have to go back and
reconstruct (from some months back) just what the problem was and whether it
has become OBE.

> Paul> +         _("Suspicious DW_AT_byte_size value treated as zero instead of 0x%llx"),
> Paul> +         (long long) DW_UNSND (attr));
> 
> Are %ll and `long long' really portable?  I think you need something
> else here.  There are a few cases.

Yeah, it seems that long long either appears in system-specific code (like
linux-nat) where one can probably assume its existence, or conditionalized
as in printcmd.c.

> 
> [check_typedef]
> Paul> -	  const int low_bound = TYPE_LOW_BOUND (range_type);
> Paul> -	  const int high_bound = TYPE_HIGH_BOUND (range_type);
> Paul> +	  const LONGEST low_bound = TYPE_LOW_BOUND (range_type);
> Paul> +	  const LONGEST high_bound = TYPE_HIGH_BOUND (range_type);
> Paul>  	  int nb_elements;
>  	
> Paul>  	  if (high_bound < low_bound)
> Paul>  	    nb_elements = 0;
> Paul>  	  else
> Paul> -	    nb_elements = high_bound - low_bound + 1;
> Paul> +	    nb_elements = (int) (high_bound - low_bound + 1);
> 
> Can't this overflow?  There's a subsequent multiplication, too...
> 
> I don't know what would be best to do here.  Changing TYPE_LENGTH to a
> LONGEST seems tough to swallow, but so does throwing an error.
> 

Hmm.  Sticky.  There's this comment on 'length' in struct type:

  /* Length of storage for a value of this type.  This is what
     sizeof(type) would return; use it for address arithmetic,
     memory reads and writes, etc. ....

But then the code goes on to define 'unsigned length'.  However, according 
to the C standard, the type should really be size_t---and technically
that should be the TARGET's size_t.  I suspect this part of the representation 
hasn't been updated since the days when people actually used 16-bit address
spaces.  What do you suppose people would say to using size_t here at least?

In any case, you are correct that there ought to be some provision for 
overflow here.

> Also, what does this code mean if either the high or low bound is
> undefined?  Maybe those cases should choose the min or max of the
> underlying integral type?

That also will require some thought.  Some undefined bounds seem to be 
carelessness on the part of the compiler, and I suspect that returning a
null range might be safer.

> Paul> +    struct range_bounds {
> 
> Brace on its own line.
> 
> Paul> +      TYPE_RANGE_DATA (tp) = ((struct range_bounds *)
> Paul> +			  TYPE_ALLOC (tp, sizeof (struct range_bounds)));
> Paul> +      memset (TYPE_RANGE_DATA (tp), 0, sizeof (struct range_bounds));
> 
> Use TYPE_ZALLOC instead.

OK and OK.  

Thanks for the input.  I should be submitting a revision soon.

Paul


  reply	other threads:[~2009-12-05 12:18 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-12-04  8:13 Paul Hilfinger
2009-12-04 18:35 ` Tom Tromey
2009-12-05 12:18   ` Paul Hilfinger [this message]
2009-12-05 16:53     ` Pierre Muller
2009-12-07 20:08     ` Tom Tromey
2009-12-11 10:03       ` Paul Hilfinger
2009-12-11 19:06         ` Tom Tromey
2009-12-14  6:24           ` [COMMIT] " Paul Hilfinger

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=20091205121800.DB060227B32@nile.gnat.com \
    --to=hilfinger@adacore.com \
    --cc=brobecker@adacore.com \
    --cc=gdb-patches@sourceware.org \
    --cc=tromey@redhat.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