mirror of git://gcc.gnu.org/git/gcc.git
gfortran.h (gfc_symbol): Add pointer to next derived type.
2018-07-20 Andrew Benson <abenson@carnegiescience.edu> * gfortran.h (gfc_symbol): Add pointer to next derived type. (gfc_dt_list, gfc_get_dt_list): Remove. (gfc_namespace): Replace gfc_dt_list with gfc_symbol. * parse.c (resolve_all_program_units): Replace gfc_free_dt_list() with simple nullification of gfc_derived_types. * resolve.c (resolve_global_procedure): Replace gfc_dt_list with gfc_symbol. (add_dt_to_dt_list): Change derived type linked list insertion to utilize dt_next pointers in gfc_symbol. * symbol.c (gfc_new_symbol, gfc_free_dt_list, gfc_symbol_done2) (get_iso_c_binding_dt, generate_isocbinding_symbol): Remove gfc_free_dt_list as gfc_dt_list is obsoleted. Change derived type linked list search/insertion to utilize dt_next pointers in gfc_symbol. * trans-types.c (gfc_get_derived_type): Change derived type linked list search to utilize dt_next pointers in gfc_symbol. From-SVN: r262909
This commit is contained in:
parent
d9a81cdb41
commit
20e8ceae67
|
|
@ -1,3 +1,21 @@
|
|||
2018-07-20 Andrew Benson <abenson@carnegiescience.edu>
|
||||
|
||||
* gfortran.h (gfc_symbol): Add pointer to next derived type.
|
||||
(gfc_dt_list, gfc_get_dt_list): Remove.
|
||||
(gfc_namespace): Replace gfc_dt_list with gfc_symbol.
|
||||
* parse.c (resolve_all_program_units): Replace gfc_free_dt_list() with
|
||||
simple nullification of gfc_derived_types.
|
||||
* resolve.c (resolve_global_procedure): Replace gfc_dt_list with
|
||||
gfc_symbol.
|
||||
(add_dt_to_dt_list): Change derived type linked list insertion to
|
||||
utilize dt_next pointers in gfc_symbol.
|
||||
* symbol.c (gfc_new_symbol, gfc_free_dt_list, gfc_symbol_done2)
|
||||
(get_iso_c_binding_dt, generate_isocbinding_symbol): Remove
|
||||
gfc_free_dt_list as gfc_dt_list is obsoleted. Change derived type
|
||||
linked list search/insertion to utilize dt_next pointers in gfc_symbol.
|
||||
* trans-types.c (gfc_get_derived_type): Change derived type linked
|
||||
list search to utilize dt_next pointers in gfc_symbol.
|
||||
|
||||
2018-07-19 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
|
||||
|
||||
* trans-intrinsic.c: (gfc_conv_intrinsic_minmax): Emit MIN_MAX_EXPR
|
||||
|
|
|
|||
|
|
@ -1614,6 +1614,9 @@ typedef struct gfc_symbol
|
|||
|
||||
/* Link to corresponding association-list if this is an associate name. */
|
||||
struct gfc_association_list *assoc;
|
||||
|
||||
/* Link to next entry in derived type list */
|
||||
struct gfc_symbol *dt_next;
|
||||
}
|
||||
gfc_symbol;
|
||||
|
||||
|
|
@ -1715,18 +1718,8 @@ typedef struct gfc_symtree
|
|||
}
|
||||
gfc_symtree;
|
||||
|
||||
/* A linked list of derived types in the namespace. */
|
||||
typedef struct gfc_dt_list
|
||||
{
|
||||
struct gfc_symbol *derived;
|
||||
struct gfc_dt_list *next;
|
||||
}
|
||||
gfc_dt_list;
|
||||
|
||||
#define gfc_get_dt_list() XCNEW (gfc_dt_list)
|
||||
|
||||
/* A list of all derived types. */
|
||||
extern gfc_dt_list *gfc_derived_types;
|
||||
extern gfc_symbol *gfc_derived_types;
|
||||
|
||||
typedef struct gfc_oacc_routine_name
|
||||
{
|
||||
|
|
@ -1812,7 +1805,7 @@ typedef struct gfc_namespace
|
|||
|
||||
gfc_charlen *cl_list;
|
||||
|
||||
gfc_dt_list *derived_types;
|
||||
gfc_symbol *derived_types;
|
||||
|
||||
int save_all, seen_save, seen_implicit_none;
|
||||
|
||||
|
|
|
|||
|
|
@ -6051,7 +6051,7 @@ add_global_program (void)
|
|||
static void
|
||||
resolve_all_program_units (gfc_namespace *gfc_global_ns_list)
|
||||
{
|
||||
gfc_free_dt_list ();
|
||||
gfc_derived_types = NULL;
|
||||
gfc_current_ns = gfc_global_ns_list;
|
||||
for (; gfc_current_ns; gfc_current_ns = gfc_current_ns->sibling)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -2509,7 +2509,7 @@ resolve_global_procedure (gfc_symbol *sym, locus *where,
|
|||
/* Resolve the gsymbol namespace if needed. */
|
||||
if (!gsym->ns->resolved)
|
||||
{
|
||||
gfc_dt_list *old_dt_list;
|
||||
gfc_symbol *old_dt_list;
|
||||
|
||||
/* Stash away derived types so that the backend_decls do not
|
||||
get mixed up. */
|
||||
|
|
@ -13533,16 +13533,19 @@ resolve_typebound_procedures (gfc_symbol* derived)
|
|||
static void
|
||||
add_dt_to_dt_list (gfc_symbol *derived)
|
||||
{
|
||||
gfc_dt_list *dt_list;
|
||||
|
||||
for (dt_list = gfc_derived_types; dt_list; dt_list = dt_list->next)
|
||||
if (derived == dt_list->derived)
|
||||
return;
|
||||
|
||||
dt_list = gfc_get_dt_list ();
|
||||
dt_list->next = gfc_derived_types;
|
||||
dt_list->derived = derived;
|
||||
gfc_derived_types = dt_list;
|
||||
if (!derived->dt_next)
|
||||
{
|
||||
if (gfc_derived_types)
|
||||
{
|
||||
derived->dt_next = gfc_derived_types->dt_next;
|
||||
gfc_derived_types->dt_next = derived;
|
||||
}
|
||||
else
|
||||
{
|
||||
derived->dt_next = derived;
|
||||
}
|
||||
gfc_derived_types = derived;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -107,7 +107,7 @@ gfc_namespace *gfc_global_ns_list;
|
|||
|
||||
gfc_gsymbol *gfc_gsym_root = NULL;
|
||||
|
||||
gfc_dt_list *gfc_derived_types;
|
||||
gfc_symbol *gfc_derived_types;
|
||||
|
||||
static gfc_undo_change_set default_undo_chgset_var = { vNULL, vNULL, NULL };
|
||||
static gfc_undo_change_set *latest_undo_chgset = &default_undo_chgset_var;
|
||||
|
|
@ -3137,6 +3137,7 @@ gfc_new_symbol (const char *name, gfc_namespace *ns)
|
|||
p->common_block = NULL;
|
||||
p->f2k_derived = NULL;
|
||||
p->assoc = NULL;
|
||||
p->dt_next = NULL;
|
||||
p->fn_result_spec = 0;
|
||||
|
||||
return p;
|
||||
|
|
@ -3896,23 +3897,6 @@ free_sym_tree (gfc_symtree *sym_tree)
|
|||
}
|
||||
|
||||
|
||||
/* Free the derived type list. */
|
||||
|
||||
void
|
||||
gfc_free_dt_list (void)
|
||||
{
|
||||
gfc_dt_list *dt, *n;
|
||||
|
||||
for (dt = gfc_derived_types; dt; dt = n)
|
||||
{
|
||||
n = dt->next;
|
||||
free (dt);
|
||||
}
|
||||
|
||||
gfc_derived_types = NULL;
|
||||
}
|
||||
|
||||
|
||||
/* Free the gfc_equiv_info's. */
|
||||
|
||||
static void
|
||||
|
|
@ -4098,7 +4082,7 @@ gfc_symbol_done_2 (void)
|
|||
gfc_free_namespace (gfc_current_ns);
|
||||
gfc_current_ns = NULL;
|
||||
}
|
||||
gfc_free_dt_list ();
|
||||
gfc_derived_types = NULL;
|
||||
|
||||
enforce_single_undo_checkpoint ();
|
||||
free_undo_change_set_data (*latest_undo_chgset);
|
||||
|
|
@ -4361,20 +4345,21 @@ gfc_get_gsymbol (const char *name)
|
|||
static gfc_symbol *
|
||||
get_iso_c_binding_dt (int sym_id)
|
||||
{
|
||||
gfc_dt_list *dt_list;
|
||||
|
||||
dt_list = gfc_derived_types;
|
||||
gfc_symbol *dt_list = gfc_derived_types;
|
||||
|
||||
/* Loop through the derived types in the name list, searching for
|
||||
the desired symbol from iso_c_binding. Search the parent namespaces
|
||||
if necessary and requested to (parent_flag). */
|
||||
while (dt_list != NULL)
|
||||
if (dt_list)
|
||||
{
|
||||
if (dt_list->derived->from_intmod != INTMOD_NONE
|
||||
&& dt_list->derived->intmod_sym_id == sym_id)
|
||||
return dt_list->derived;
|
||||
while (dt_list->dt_next != gfc_derived_types)
|
||||
{
|
||||
if (dt_list->from_intmod != INTMOD_NONE
|
||||
&& dt_list->intmod_sym_id == sym_id)
|
||||
return dt_list;
|
||||
|
||||
dt_list = dt_list->next;
|
||||
dt_list = dt_list->dt_next;
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
|
|
@ -4780,11 +4765,16 @@ generate_isocbinding_symbol (const char *mod_name, iso_c_binding_symbol s,
|
|||
if (tmp_sym->attr.flavor == FL_DERIVED
|
||||
&& !get_iso_c_binding_dt (tmp_sym->intmod_sym_id))
|
||||
{
|
||||
gfc_dt_list *dt_list;
|
||||
dt_list = gfc_get_dt_list ();
|
||||
dt_list->derived = tmp_sym;
|
||||
dt_list->next = gfc_derived_types;
|
||||
gfc_derived_types = dt_list;
|
||||
if (gfc_derived_types)
|
||||
{
|
||||
tmp_sym->dt_next = gfc_derived_types->dt_next;
|
||||
gfc_derived_types->dt_next = tmp_sym;
|
||||
}
|
||||
else
|
||||
{
|
||||
tmp_sym->dt_next = tmp_sym;
|
||||
}
|
||||
gfc_derived_types = tmp_sym;
|
||||
}
|
||||
|
||||
return tmp_symtree;
|
||||
|
|
@ -4892,7 +4882,6 @@ generate_isocbinding_symbol (const char *mod_name, iso_c_binding_symbol s,
|
|||
case ISOCBINDING_FUNPTR:
|
||||
{
|
||||
gfc_symbol *dt_sym;
|
||||
gfc_dt_list **dt_list_ptr = NULL;
|
||||
gfc_component *tmp_comp = NULL;
|
||||
|
||||
/* Generate real derived type. */
|
||||
|
|
@ -4954,17 +4943,16 @@ generate_isocbinding_symbol (const char *mod_name, iso_c_binding_symbol s,
|
|||
dt_sym->ts.u.derived = dt_sym;
|
||||
|
||||
/* Add the symbol created for the derived type to the current ns. */
|
||||
dt_list_ptr = &(gfc_derived_types);
|
||||
while (*dt_list_ptr != NULL && (*dt_list_ptr)->next != NULL)
|
||||
dt_list_ptr = &((*dt_list_ptr)->next);
|
||||
|
||||
/* There is already at least one derived type in the list, so append
|
||||
the one we're currently building for c_ptr or c_funptr. */
|
||||
if (*dt_list_ptr != NULL)
|
||||
dt_list_ptr = &((*dt_list_ptr)->next);
|
||||
(*dt_list_ptr) = gfc_get_dt_list ();
|
||||
(*dt_list_ptr)->derived = dt_sym;
|
||||
(*dt_list_ptr)->next = NULL;
|
||||
if (gfc_derived_types)
|
||||
{
|
||||
dt_sym->dt_next = gfc_derived_types->dt_next;
|
||||
gfc_derived_types->dt_next = dt_sym;
|
||||
}
|
||||
else
|
||||
{
|
||||
dt_sym->dt_next = dt_sym;
|
||||
}
|
||||
gfc_derived_types = dt_sym;
|
||||
|
||||
gfc_add_component (dt_sym, "c_address", &tmp_comp);
|
||||
if (tmp_comp == NULL)
|
||||
|
|
|
|||
|
|
@ -2542,7 +2542,6 @@ gfc_get_derived_type (gfc_symbol * derived, int codimen)
|
|||
bool got_canonical = false;
|
||||
bool unlimited_entity = false;
|
||||
gfc_component *c;
|
||||
gfc_dt_list *dt;
|
||||
gfc_namespace *ns;
|
||||
tree tmp;
|
||||
bool coarray_flag;
|
||||
|
|
@ -2607,12 +2606,17 @@ gfc_get_derived_type (gfc_symbol * derived, int codimen)
|
|||
ns->translated && !got_canonical;
|
||||
ns = ns->sibling)
|
||||
{
|
||||
dt = ns->derived_types;
|
||||
for (; dt && !canonical; dt = dt->next)
|
||||
if (ns->derived_types)
|
||||
{
|
||||
gfc_copy_dt_decls_ifequal (dt->derived, derived, true);
|
||||
for (gfc_symbol *dt = ns->derived_types; dt && !got_canonical;
|
||||
dt = dt->dt_next)
|
||||
{
|
||||
gfc_copy_dt_decls_ifequal (dt, derived, true);
|
||||
if (derived->backend_decl)
|
||||
got_canonical = true;
|
||||
if (dt->dt_next == ns->derived_types)
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -2875,8 +2879,12 @@ copy_derived_types:
|
|||
}
|
||||
}
|
||||
|
||||
for (dt = gfc_derived_types; dt; dt = dt->next)
|
||||
gfc_copy_dt_decls_ifequal (derived, dt->derived, false);
|
||||
for (gfc_symbol *dt = gfc_derived_types; dt; dt = dt->dt_next)
|
||||
{
|
||||
gfc_copy_dt_decls_ifequal (derived, dt, false);
|
||||
if (dt->dt_next == gfc_derived_types)
|
||||
break;
|
||||
}
|
||||
|
||||
return derived->backend_decl;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue