2006-08-08 H.J. Lu <hongjiu.lu@intel.com>

PR ld/3006
	* ldlang.c (lang_section_bst_type): Moved to ...
	* ldlang.h: Here.

	* ldlang.h (lang_wild_statement_struct): Add a tree field.

	* ldlang.c (wild_sort_fast): Use the tree field for BST.
	(wild): Likeise.
	(analyze_walk_wild_section_handler): Initialize the tree field.
This commit is contained in:
H.J. Lu 2006-08-08 16:08:47 +00:00
parent 6798554723
commit e6f2cbf536
3 changed files with 29 additions and 13 deletions

View file

@ -1,3 +1,15 @@
2006-08-08 H.J. Lu <hongjiu.lu@intel.com>
PR ld/3006
* ldlang.c (lang_section_bst_type): Moved to ...
* ldlang.h: Here.
* ldlang.h (lang_wild_statement_struct): Add a tree field.
* ldlang.c (wild_sort_fast): Use the tree field for BST.
(wild): Likeise.
(analyze_walk_wild_section_handler): Initialize the tree field.
2006-08-08 H.J. Lu <hongjiu.lu@intel.com> 2006-08-08 H.J. Lu <hongjiu.lu@intel.com>
PR ld/3009 PR ld/3009

View file

@ -45,15 +45,6 @@
#define offsetof(TYPE, MEMBER) ((size_t) & (((TYPE*) 0)->MEMBER)) #define offsetof(TYPE, MEMBER) ((size_t) & (((TYPE*) 0)->MEMBER))
#endif #endif
/* Binary search tree structure to
efficiently sort sections by name. */
typedef struct lang_section_bst
{
asection *section;
struct lang_section_bst *left;
struct lang_section_bst *right;
} lang_section_bst_type;
/* Locals variables. */ /* Locals variables. */
static struct obstack stat_obstack; static struct obstack stat_obstack;
static struct obstack map_obstack; static struct obstack map_obstack;
@ -377,7 +368,7 @@ wild_sort_fast (lang_wild_statement_type *wild,
{ {
lang_section_bst_type **tree; lang_section_bst_type **tree;
tree = (lang_section_bst_type **) &wild->handler_data[1]; tree = &wild->tree;
if (!wild->filenames_sorted if (!wild->filenames_sorted
&& (sec == NULL || sec->spec.sorted == none)) && (sec == NULL || sec->spec.sorted == none))
{ {
@ -674,6 +665,7 @@ analyze_walk_wild_section_handler (lang_wild_statement_type *ptr)
ptr->handler_data[1] = NULL; ptr->handler_data[1] = NULL;
ptr->handler_data[2] = NULL; ptr->handler_data[2] = NULL;
ptr->handler_data[3] = NULL; ptr->handler_data[3] = NULL;
ptr->tree = NULL;
/* Count how many wildcard_specs there are, and how many of those /* Count how many wildcard_specs there are, and how many of those
actually use wildcards in the name. Also, bail out if any of the actually use wildcards in the name. Also, bail out if any of the
@ -2552,10 +2544,12 @@ wild (lang_wild_statement_type *s,
walk_wild (s, output_section_callback_fast, output); walk_wild (s, output_section_callback_fast, output);
tree = (lang_section_bst_type *) s->handler_data[1]; tree = s->tree;
if (tree) if (tree)
output_section_callback_tree_to_list (s, tree, output); {
s->handler_data[1] = NULL; output_section_callback_tree_to_list (s, tree, output);
s->tree = NULL;
}
} }
else else
walk_wild (s, output_section_callback, output); walk_wild (s, output_section_callback, output);

View file

@ -305,6 +305,15 @@ typedef void (*walk_wild_section_handler_t) (lang_wild_statement_type *,
typedef bfd_boolean (*lang_match_sec_type_func) (bfd *, const asection *, typedef bfd_boolean (*lang_match_sec_type_func) (bfd *, const asection *,
bfd *, const asection *); bfd *, const asection *);
/* Binary search tree structure to efficiently sort sections by
name. */
typedef struct lang_section_bst
{
asection *section;
struct lang_section_bst *left;
struct lang_section_bst *right;
} lang_section_bst_type;
struct lang_wild_statement_struct struct lang_wild_statement_struct
{ {
lang_statement_header_type header; lang_statement_header_type header;
@ -316,6 +325,7 @@ struct lang_wild_statement_struct
walk_wild_section_handler_t walk_wild_section_handler; walk_wild_section_handler_t walk_wild_section_handler;
struct wildcard_list *handler_data[4]; struct wildcard_list *handler_data[4];
lang_section_bst_type *tree;
}; };
typedef struct lang_address_statement_struct typedef struct lang_address_statement_struct