+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
/* 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;
}
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;
+/* A list of all derived types. */
+extern gfc_symbol *gfc_derived_types;
typedef struct gfc_oacc_routine_name
{
gfc_charlen *cl_list;
- gfc_dt_list *derived_types;
+ gfc_symbol *derived_types;
int save_all, seen_save, seen_implicit_none;
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)
{
/* 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. */
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;
+ }
}
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;
p->common_block = NULL;
p->f2k_derived = NULL;
p->assoc = NULL;
+ p->dt_next = NULL;
p->fn_result_spec = 0;
return p;
}
-/* 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
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);
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;
-
- dt_list = dt_list->next;
+ 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->dt_next;
+ }
}
return NULL;
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;
case ISOCBINDING_FUNPTR:
{
gfc_symbol *dt_sym;
- gfc_dt_list **dt_list_ptr = NULL;
gfc_component *tmp_comp = NULL;
/* Generate real derived type. */
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)
bool got_canonical = false;
bool unlimited_entity = false;
gfc_component *c;
- gfc_dt_list *dt;
gfc_namespace *ns;
tree tmp;
bool coarray_flag;
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);
- if (derived->backend_decl)
- got_canonical = 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;
+ }
+ }
+ }
}
/* Store up the canonical type to be added to this one. */
}
}
- 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;
}