On 25 November 2016 at 13:43, Richard Biener <rguent...@suse.de> wrote:
> On Fri, 25 Nov 2016, Jakub Jelinek wrote:
>
>> On Fri, Nov 25, 2016 at 01:28:06PM +0530, Prathamesh Kulkarni wrote:
>> > --- a/gcc/lto/lto-lang.c
>> > +++ b/gcc/lto/lto-lang.c
>> > @@ -1271,8 +1271,30 @@ lto_init (void)
>> >    gcc_assert (TYPE_MAIN_VARIANT (const_tm_ptr_type_node)
>> >           == const_ptr_type_node);
>> >
>> > -  ptrdiff_type_node = integer_type_node;
>> > +  if (strcmp (PTRDIFF_TYPE, "int") == 0)
>> > +    ptrdiff_type_node = integer_type_node;
>> > +  else if (strcmp (PTRDIFF_TYPE, "long int") == 0)
>> > +    ptrdiff_type_node = long_integer_type_node;
>> > +  else if (strcmp (PTRDIFF_TYPE, "long long int") == 0)
>> > +    ptrdiff_type_node = long_long_integer_type_node;
>> > +  else if (strcmp (PTRDIFF_TYPE, "short int") == 0)
>> > +    ptrdiff_type_node = short_integer_type_node;
>> > +  else
>> > +    {
>> > +      ptrdiff_type_node = NULL_TREE;
>> > +      for (int i = 0; i < NUM_INT_N_ENTS; i++)
>> > +   if (int_n_enabled_p[i])
>> > +     {
>> > +       char name[50];
>> > +       sprintf (name, "__int%d", int_n_data[i].bitsize);
>> > +       if (strcmp (name, PTRDIFF_TYPE) == 0)
>> > +         ptrdiff_type_node = int_n_trees[i].signed_type;
>> > +     }
>> > +      if (ptrdiff_type_node == NULL_TREE)
>> > +   gcc_unreachable ();
>> > +    }
>>
>> This looks ok to me.
>
> But I'd like to see this in build_common_tree_nodes alongside
> the initialization of size_type_node (and thus removed from
> c_common_nodes_and_builtins).  This way you can simply remove
> the lto-lang.c code as well.
>
> Please then also remove the ptrdiff_type_node re-set from
> free_lang_data ().
Hi Richard,
Does this version look OK ?
Validation in progress.

Thanks,
Prathamesh
>
>> >
>> > +  unsigned_ptrdiff_type_node = unsigned_type_for (ptrdiff_type_node);
>> >    lto_build_c_type_nodes ();
>> >    gcc_assert (va_list_type_node);
>>
>> But why this and the remaining hunks?  Nothing in the middle-end
>> needs it, IMHO it should be kept in c-family/.
>
> Yeah, this change looks unnecessary to me.
>
>> > diff --git a/gcc/tree-core.h b/gcc/tree-core.h
>> > index eec2d4f..6c52387 100644
>> > --- a/gcc/tree-core.h
>> > +++ b/gcc/tree-core.h
>> > @@ -617,6 +617,7 @@ enum tree_index {
>> >    TI_SIZE_TYPE,
>> >    TI_PID_TYPE,
>> >    TI_PTRDIFF_TYPE,
>> > +  TI_UNSIGNED_PTRDIFF_TYPE,
>> >    TI_VA_LIST_TYPE,
>> >    TI_VA_LIST_GPR_COUNTER_FIELD,
>> >    TI_VA_LIST_FPR_COUNTER_FIELD,
>> > diff --git a/gcc/tree.h b/gcc/tree.h
>> > index 62cd7bb..ae69d0d 100644
>> > --- a/gcc/tree.h
>> > +++ b/gcc/tree.h
>> > @@ -3667,6 +3667,7 @@ tree_operand_check_code (const_tree __t, enum 
>> > tree_code __code, int __i,
>> >  #define size_type_node                  global_trees[TI_SIZE_TYPE]
>> >  #define pid_type_node                   global_trees[TI_PID_TYPE]
>> >  #define ptrdiff_type_node          global_trees[TI_PTRDIFF_TYPE]
>> > +#define unsigned_ptrdiff_type_node global_trees[TI_UNSIGNED_PTRDIFF_TYPE]
>> >  #define va_list_type_node          global_trees[TI_VA_LIST_TYPE]
>> >  #define va_list_gpr_counter_field  
>> > global_trees[TI_VA_LIST_GPR_COUNTER_FIELD]
>> >  #define va_list_fpr_counter_field  
>> > global_trees[TI_VA_LIST_FPR_COUNTER_FIELD]
>>
>>
>>       Jakub
>>
>>
>
> --
> Richard Biener <rguent...@suse.de>
> SUSE LINUX GmbH, GF: Felix Imendoerffer, Jane Smithard, Graham Norton, HRB 
> 21284 (AG Nuernberg)
2016-11-25  Prathamesh Kulkarni  <prathamesh.kulka...@linaro.org>

        * tree.c (build_common_tree_nodes): Initialize ptrdiff_type_node.
        (free_lang_data): Remove assignment to ptrdiff_type_node.
c-family/
        * c-common.c (c_common_nodes_and_builtins): Remove initialization of
        ptrdiff_type_node.
lto/
        * lto-lang.c (lto_init): Remove initialization of ptrdiff_type_node.

diff --git a/gcc/c-family/c-common.c b/gcc/c-family/c-common.c
index 62174a9..0749361 100644
--- a/gcc/c-family/c-common.c
+++ b/gcc/c-family/c-common.c
@@ -4475,8 +4475,6 @@ c_common_nodes_and_builtins (void)
 
   default_function_type
     = build_varargs_function_type_list (integer_type_node, NULL_TREE);
-  ptrdiff_type_node
-    = TREE_TYPE (identifier_global_value (get_identifier (PTRDIFF_TYPE)));
   unsigned_ptrdiff_type_node = c_common_unsigned_type (ptrdiff_type_node);
 
   lang_hooks.decls.pushdecl
diff --git a/gcc/lto/lto-lang.c b/gcc/lto/lto-lang.c
index a5f04ba..58f6e0c 100644
--- a/gcc/lto/lto-lang.c
+++ b/gcc/lto/lto-lang.c
@@ -1271,8 +1271,6 @@ lto_init (void)
   gcc_assert (TYPE_MAIN_VARIANT (const_tm_ptr_type_node)
              == const_ptr_type_node);
 
-  ptrdiff_type_node = integer_type_node;
-
   lto_build_c_type_nodes ();
   gcc_assert (va_list_type_node);
 
diff --git a/gcc/tree.c b/gcc/tree.c
index 11e0abc..57f2e9a 100644
--- a/gcc/tree.c
+++ b/gcc/tree.c
@@ -6006,7 +6006,6 @@ free_lang_data (void)
   free_lang_data_in_cgraph ();
 
   /* Create gimple variants for common types.  */
-  ptrdiff_type_node = integer_type_node;
   fileptr_type_node = ptr_type_node;
   const_tm_ptr_type_node = const_ptr_type_node;
 
@@ -10314,6 +10313,30 @@ build_common_tree_nodes (bool signed_char)
        gcc_unreachable ();
     }
 
+  /* Define what type to use for ptrdiff_t.  */
+  if (strcmp (PTRDIFF_TYPE, "int") == 0)
+    ptrdiff_type_node = integer_type_node;
+  else if (strcmp (PTRDIFF_TYPE, "long int") == 0)
+    ptrdiff_type_node = long_integer_type_node;
+  else if (strcmp (PTRDIFF_TYPE, "long long int") == 0)
+    ptrdiff_type_node = long_long_integer_type_node;
+  else if (strcmp (PTRDIFF_TYPE, "short int") == 0)
+    ptrdiff_type_node = short_integer_type_node;
+  else
+    {
+      ptrdiff_type_node = NULL_TREE;
+      for (int i = 0; i < NUM_INT_N_ENTS; i++)
+       if (int_n_enabled_p[i])
+         {
+           char name[50];
+           sprintf (name, "__int%d", int_n_data[i].bitsize);
+           if (strcmp (name, PTRDIFF_TYPE) == 0)
+             ptrdiff_type_node = int_n_trees[i].signed_type;
+         }
+      if (ptrdiff_type_node == NULL_TREE)
+       gcc_unreachable ();
+    }
+
   /* Fill in the rest of the sized types.  Reuse existing type nodes
      when possible.  */
   intQI_type_node = make_or_reuse_type (GET_MODE_BITSIZE (QImode), 0);

Reply via email to