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);