On Thu, 12 Jan 2017, Richard Biener wrote:

> On Thu, 12 Jan 2017, Jakub Jelinek wrote:
> 
> > On Thu, Jan 12, 2017 at 01:35:32PM +0100, Richard Biener wrote:
> > > It also lacks expressiveness when comparing
> > > 
> > >   short s;
> > >   s_1 = (short) 1;
> > >   s_2 = short (1);
> > > 
> > > IMHO having a _Literal somewhere makes it more obvious what is meant
> > > (I'm still going to dump 1u or 1l instead of _Literal (unsigned) 1
> > > of course as that's even more easy to recognize).
> > 
> > So, with the _Literal (type) constant syntax, what are we going to emit
> > and parse for __int128 constants?
> > _Literal (__int128) (0x123456ULL << 64 || 0x123456ULL), something else?
> 
> Yes, unless we teach libcpp about larger than 64bit literals.
> 
> The following patch implements _Literal (but not proper dumping of
> > 64bit literals for __int128 nor parsing the above).
> 
> I think that's a good start which also covers pointer types nicely.
> For integers we might at some point want to adopt sN and uN suffixes
> which appearantly MSVC supports to handle native 128bit literals.
> 
> For
> 
> struct X { int a : 2; };
> void __GIMPLE ()
> foo (struct X * p)
> {
>   p->a = _Literal (int : 2) 1;
>   return;
> }
> 
> and thus 2 bit literals c_parser_type_name needs to be extended
> or for _Literal we can handle : 2 on our own.  But for loads
> from p->a into a temporary we need to handle that in declarations as well.
> 
> struct X { int a : 2; };
> int __GIMPLE ()
> foo (struct X * p)
> {
>   int : 2 a; // int a : 2;
>   a = p->a;
>   return a;
> }

I have bootstrapped and tested the patch below and installed it.  We
can add support for parsing vector and complex constants via the
same mechanism so having _Literal ( type ) x looks useful even if
we get another means of handling integer literals in the future.

Richard.

> 2017-01-12  Richard Biener  <rguent...@suse.de>
> 
>       c/
>       * gimple-parser.c (c_parser_gimple_postfix_expression): Parse
>       _Literal ( type-name ) number.
> 
>       * tree-pretty-print.c (dump_generic_node): Dump INTEGER_CSTs
>       as _Literal ( type ) number in case usual suffixes do not
>       preserve all information.
> 
>       * gcc.dg/gimplefe-22.c: New testcase.
> 
> Index: gcc/c/gimple-parser.c
> ===================================================================
> --- gcc/c/gimple-parser.c     (revision 244350)
> +++ gcc/c/gimple-parser.c     (working copy)
> @@ -799,6 +799,32 @@ c_parser_gimple_postfix_expression (c_pa
>                                      type, ptr.value, alias_off);
>             break;
>           }
> +       else if (strcmp (IDENTIFIER_POINTER (id), "_Literal") == 0)
> +         {
> +           /* _Literal '(' type-name ')' number  */
> +           c_parser_consume_token (parser);
> +           tree type = NULL_TREE;
> +           if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
> +             {
> +               struct c_type_name *type_name = c_parser_type_name (parser);
> +               tree tem;
> +               if (type_name)
> +                 type = groktypename (type_name, &tem, NULL);
> +               c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
> +                                          "expected %<)%>");
> +             }
> +           tree val = c_parser_gimple_postfix_expression (parser).value;
> +           if (! type
> +               || ! val
> +               || val == error_mark_node
> +               || TREE_CODE (val) != INTEGER_CST)
> +             {
> +               c_parser_error (parser, "invalid _Literal");
> +               return expr;
> +             }
> +           expr.value = fold_convert (type, val);
> +           return expr;
> +         }
>         /* SSA name.  */
>         unsigned version, ver_offset;
>         if (! lookup_name (id)
> Index: gcc/tree-pretty-print.c
> ===================================================================
> --- gcc/tree-pretty-print.c   (revision 244350)
> +++ gcc/tree-pretty-print.c   (working copy)
> @@ -1664,6 +1664,16 @@ dump_generic_node (pretty_printer *pp, t
>        break;
>  
>      case INTEGER_CST:
> +      if (flags & TDF_GIMPLE
> +       && (POINTER_TYPE_P (TREE_TYPE (node))
> +           || (TYPE_PRECISION (TREE_TYPE (node))
> +               < TYPE_PRECISION (integer_type_node))
> +           || exact_log2 (TYPE_PRECISION (TREE_TYPE (node))) == -1))
> +     {
> +       pp_string (pp, "_Literal (");
> +       dump_generic_node (pp, TREE_TYPE (node), spc, flags, false);
> +       pp_string (pp, ") ");
> +     }
>        if (TREE_CODE (TREE_TYPE (node)) == POINTER_TYPE
>         && ! (flags & TDF_GIMPLE))
>       {
> @@ -1693,11 +1703,7 @@ dump_generic_node (pretty_printer *pp, t
>        else if (tree_fits_shwi_p (node))
>       pp_wide_integer (pp, tree_to_shwi (node));
>        else if (tree_fits_uhwi_p (node))
> -     {
> -       pp_unsigned_wide_integer (pp, tree_to_uhwi (node));
> -       if (flags & TDF_GIMPLE)
> -         pp_character (pp, 'U');
> -     }
> +     pp_unsigned_wide_integer (pp, tree_to_uhwi (node));
>        else
>       {
>         wide_int val = node;
> @@ -1710,6 +1716,24 @@ dump_generic_node (pretty_printer *pp, t
>         print_hex (val, pp_buffer (pp)->digit_buffer);
>         pp_string (pp, pp_buffer (pp)->digit_buffer);
>       }
> +      if ((flags & TDF_GIMPLE)
> +       && (POINTER_TYPE_P (TREE_TYPE (node))
> +           || (TYPE_PRECISION (TREE_TYPE (node))
> +               < TYPE_PRECISION (integer_type_node))
> +           || exact_log2 (TYPE_PRECISION (TREE_TYPE (node))) == -1))
> +     {
> +       if (TYPE_UNSIGNED (TREE_TYPE (node)))
> +         pp_character (pp, 'u');
> +       if (TYPE_PRECISION (TREE_TYPE (node))
> +           == TYPE_PRECISION (unsigned_type_node))
> +         ;
> +       else if (TYPE_PRECISION (TREE_TYPE (node))
> +                == TYPE_PRECISION (long_unsigned_type_node))
> +         pp_character (pp, 'l');
> +       else if (TYPE_PRECISION (TREE_TYPE (node))
> +                == TYPE_PRECISION (long_long_unsigned_type_node))
> +         pp_string (pp, "ll");
> +     }
>        if (TREE_OVERFLOW (node))
>       pp_string (pp, "(OVF)");
>        break;
> Index: gcc/testsuite/gcc.dg/gimplefe-22.c
> ===================================================================
> --- gcc/testsuite/gcc.dg/gimplefe-22.c        (nonexistent)
> +++ gcc/testsuite/gcc.dg/gimplefe-22.c        (working copy)
> @@ -0,0 +1,9 @@
> +/* { dg-do compile } */
> +/* { dg-options "-fgimple" } */
> +
> +void __GIMPLE ()
> +foo (short * p)
> +{
> +  *p = _Literal (short int) 1;
> +  return;
> +}
> 

-- 
Richard Biener <rguent...@suse.de>
SUSE LINUX GmbH, GF: Felix Imendoerffer, Jane Smithard, Graham Norton, HRB 
21284 (AG Nuernberg)

Reply via email to