public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
From: Richard Biener <rguenther@suse.de>
To: Eric Botcazou <ebotcazou@adacore.com>
Cc: gcc-patches@gcc.gnu.org
Subject: Re: [PATCH] Fix type field walking in gimplifier unsharing
Date: Wed, 27 Apr 2016 10:29:00 -0000	[thread overview]
Message-ID: <alpine.LSU.2.11.1604271221530.13384@t29.fhfr.qr> (raw)
In-Reply-To: <1563866.3PAXIoXYk7@polaris>

On Wed, 27 Apr 2016, Eric Botcazou wrote:

> > Gimplification is done in-place and thus relies on all processed
> > trees being unshared.  This is achieved by unshare_body which
> > in the end uses walk_tree to get at all interesting trees that possibly
> > need unsharing.
> > 
> > Unfortunately it doesn't really work because walk_tree only walks
> > types and type-related fields (TYPE_SIZE, TYPE_MIN_VALUE, etc.) in
> > very narrow circumstances.
> 
> Right, but well defined and explained:
> 
>     case DECL_EXPR:
>       /* If this is a TYPE_DECL, walk into the fields of the type that it's
> 	 defining.  We only want to walk into these fields of a type in this
> 	 case and not in the general case of a mere reference to the type.
> 
> 	 The criterion is as follows: if the field can be an expression, it
> 	 must be walked only here.  This should be in keeping with the fields
> 	 that are directly gimplified in gimplify_type_sizes in order for the
> 	 mark/copy-if-shared/unmark machinery of the gimplifier to work with
> 	 variable-sized types.
> 
> 	 Note that DECLs get walked as part of processing the BIND_EXPR.  */
> 
> > Thus the following patch which makes the gimplifier unsharing
> > visit all types.
> 
> I think this will generate a lot of useless walking in Ada...
> 
> > So - any opinion on the "correct" way to fix this?
> 
> Add DECL_EXPRs for the types, that's what done in Ada.

Aww, I was hoping for sth that would not require me to fix all
frontends ...

It seems the C frontend does it correctly already - I hit the
ubsan issue for c-c++-common/ubsan/pr59667.c and only for the C++ FE
for example.  Notice how only the pointed-to type is variable-size
here.

C produces

{
  unsigned int len = 1;
  typedef float <anon>[0:(sizetype) ((long int) SAVE_EXPR <len> + 
-1)][0:(sizetype) ((long int) SAVE_EXPR <len> + -1)];
  float[0:(sizetype) ((long int) SAVE_EXPR <len> + -1)][0:(sizetype) 
((long int) SAVE_EXPR <len> + -1)] * P = 0B;

    unsigned int len = 1;
    typedef float <anon>[0:(sizetype) ((long int) SAVE_EXPR <len> + 
-1)][0:(sizetype) ((long int) SAVE_EXPR <len> + -1)];
  SAVE_EXPR <len>;, (void) SAVE_EXPR <len>;;
    float[0:(sizetype) ((long int) SAVE_EXPR <len> + -1)][0:(sizetype) 
((long int) SAVE_EXPR <len> + -1)] * P = 0B;
  (*P)[0][0] = 1.0e+0;
  return 0;
}

the decl-expr is the 'typedef' line.  The C++ FE produces

{
  unsigned int len = 1;
  float[0:(sizetype) (SAVE_EXPR <(ssizetype) len + -1>)][0:(sizetype) 
(SAVE_EXPR <(ssizetype) len + -1>)] * P = 0B;

  <<cleanup_point   unsigned int len = 1;>>;
  <<cleanup_point <<< Unknown tree: expr_stmt
  (void) (((bitsizetype) ((sizetype) (SAVE_EXPR <(ssizetype) len + -1>) + 
1) * (bitsizetype) ((sizetype) (SAVE_EXPR <(ssizetype) len + -1>) + 1)) * 
32) >>>>>;
  <<cleanup_point   float[0:(sizetype) (SAVE_EXPR <(ssizetype) len + 
-1>)][0:(sizetype) (SAVE_EXPR <(ssizetype) len + -1>)] * P = 0B;>>;
  <<cleanup_point <<< Unknown tree: expr_stmt
  (void) ((*P)[0][0] = 1.0e+0) >>>>>;
  return <retval> = 0;
}

notice the lack of a decl-expr here.  It has some weird expr_stmt
here covering the sizes though. Possibly because VLA arrays are a GNU 
extension.

Didn't look into the fortran FE issue but I expect it's similar
(it only occurs for pointers to VLAs as well).

I'll try to come up with patches.

Thanks for the hint,
Richard.

  reply	other threads:[~2016-04-27 10:29 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-04-27  8:49 Richard Biener
2016-04-27  9:16 ` Eric Botcazou
2016-04-27 10:29   ` Richard Biener [this message]
2016-04-28 10:22     ` Eric Botcazou
2016-04-28 10:53       ` Richard Biener
2016-04-28 12:10         ` Richard Biener
2016-04-29  8:15           ` Eric Botcazou
2016-04-29  8:18             ` Richard Biener

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=alpine.LSU.2.11.1604271221530.13384@t29.fhfr.qr \
    --to=rguenther@suse.de \
    --cc=ebotcazou@adacore.com \
    --cc=gcc-patches@gcc.gnu.org \
    /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;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).