}
}
+static lang_statement_union_type *
+new_statement (enum statement_enum type,
+ size_t size,
+ lang_statement_list_type *list);
static void
-walk_wild (lang_wild_statement_type *s, callback_t callback, void *data)
+add_matching_callback (lang_wild_statement_type *ptr,
+ struct wildcard_list *sec,
+ asection *section,
+ lang_input_statement_type *file,
+ void *data ATTRIBUTE_UNUSED)
+{
+ lang_input_matcher_type *new_section;
+ /* Add a section reference to the list. */
+ new_section = new_stat (lang_input_matcher, &ptr->matching_sections);
+ new_section->section = section;
+ new_section->pattern = sec;
+ new_section->input_stmt = file;
+}
+
+static void
+walk_wild_resolve (lang_wild_statement_type *s)
{
const char *file_spec = s->filename;
char *p;
/* Perform the iteration over all files in the list. */
LANG_FOR_EACH_INPUT_STATEMENT (f)
{
+ //printf("XXX %s\n", f->filename);
+ walk_wild_file (s, f, add_matching_callback, NULL);
+ }
+ }
+ else if ((p = archive_path (file_spec)) != NULL)
+ {
+ LANG_FOR_EACH_INPUT_STATEMENT (f)
+ {
+ if (input_statement_is_archive_path (file_spec, p, f))
+ walk_wild_file (s, f, add_matching_callback, NULL);
+ }
+ }
+ else if (wildcardp (file_spec))
+ {
+ LANG_FOR_EACH_INPUT_STATEMENT (f)
+ {
+ if (fnmatch (file_spec, f->filename, 0) == 0)
+ walk_wild_file (s, f, add_matching_callback, NULL);
+ }
+ }
+ else
+ {
+ lang_input_statement_type *f;
+
+ /* Perform the iteration over a single file. */
+ f = lookup_name (file_spec);
+ if (f)
+ walk_wild_file (s, f, add_matching_callback, NULL);
+ }
+}
+
+static void
+walk_wild (lang_wild_statement_type *s, callback_t callback, void *data)
+{
+ const char *file_spec = s->filename;
+ //char *p;
+
+ if (!s->resolved)
+ {
+ //printf("XXX %s\n", file_spec ? file_spec : "<null>");
+ walk_wild_resolve (s);
+ s->resolved = true;
+ }
+
+ {
+ lang_statement_union_type *l;
+ for (l = s->matching_sections.head; l; l = l->header.next)
+ {
+ (*callback) (s, l->input_matcher.pattern, l->input_matcher.section, l->input_matcher.input_stmt, data);
+ }
+ return;
+ }
+
+#if 0
+ if (file_spec == NULL)
+ {
+ /* Perform the iteration over all files in the list. */
+ LANG_FOR_EACH_INPUT_STATEMENT (f)
+ {
+ printf("XXX %s\n", f->filename);
walk_wild_file (s, f, callback, data);
}
}
if (f)
walk_wild_file (s, f, callback, data);
}
+#endif
}
/* lang_for_each_statement walks the parse tree and calls the provided
case lang_group_statement_enum:
case lang_insert_statement_enum:
continue;
+ case lang_input_matcher_enum:
+ FAIL ();
}
break;
}
break;
case lang_insert_statement_enum:
break;
+ case lang_input_matcher_enum:
+ FAIL ();
}
}
}
new_stmt->section_list = section_list;
new_stmt->keep_sections = keep_sections;
lang_list_init (&new_stmt->children);
+ new_stmt->resolved = false;
+ lang_list_init (&new_stmt->matching_sections);
analyze_walk_wild_section_handler (new_stmt);
}
lang_fill_statement_enum,
lang_group_statement_enum,
lang_input_section_enum,
+ lang_input_matcher_enum,
lang_input_statement_enum,
lang_insert_statement_enum,
lang_output_section_statement_enum,
void *pattern;
} lang_input_section_type;
+typedef struct
+{
+ lang_statement_header_type header;
+ asection *section;
+ void *pattern;
+ lang_input_statement_type *input_stmt;
+} lang_input_matcher_type;
+
struct map_symbol_def {
struct bfd_link_hash_entry *entry;
struct map_symbol_def *next;
bool keep_sections;
lang_statement_list_type children;
struct name_list *exclude_name_list;
+ lang_statement_list_type matching_sections;
+ bool resolved;
walk_wild_section_handler_t walk_wild_section_handler;
struct wildcard_list *handler_data[4];
lang_fill_statement_type fill_statement;
lang_group_statement_type group_statement;
lang_input_section_type input_section;
+ lang_input_matcher_type input_matcher;
lang_input_statement_type input_statement;
lang_insert_statement_type insert_statement;
lang_output_section_statement_type output_section_statement;