diff options
-rw-r--r-- | ld/ChangeLog | 12 | ||||
-rw-r--r-- | ld/ldlang.c | 20 | ||||
-rw-r--r-- | ld/ldlang.h | 10 |
3 files changed, 29 insertions, 13 deletions
diff --git a/ld/ChangeLog b/ld/ChangeLog index 39d7d1f..4435a25 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,5 +1,17 @@ 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> + PR ld/3009 * ldlang.c (update_wild_statements): Update the whole wild section list. diff --git a/ld/ldlang.c b/ld/ldlang.c index 51dfe36..0ee1156 100644 --- a/ld/ldlang.c +++ b/ld/ldlang.c @@ -45,15 +45,6 @@ #define offsetof(TYPE, MEMBER) ((size_t) & (((TYPE*) 0)->MEMBER)) #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. */ static struct obstack stat_obstack; static struct obstack map_obstack; @@ -377,7 +368,7 @@ wild_sort_fast (lang_wild_statement_type *wild, { lang_section_bst_type **tree; - tree = (lang_section_bst_type **) &wild->handler_data[1]; + tree = &wild->tree; if (!wild->filenames_sorted && (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[2] = NULL; ptr->handler_data[3] = NULL; + ptr->tree = NULL; /* 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 @@ -2552,10 +2544,12 @@ wild (lang_wild_statement_type *s, walk_wild (s, output_section_callback_fast, output); - tree = (lang_section_bst_type *) s->handler_data[1]; + tree = s->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 walk_wild (s, output_section_callback, output); diff --git a/ld/ldlang.h b/ld/ldlang.h index 91a4344..c23c3e5 100644 --- a/ld/ldlang.h +++ b/ld/ldlang.h @@ -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 *, 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 { lang_statement_header_type header; @@ -316,6 +325,7 @@ struct lang_wild_statement_struct walk_wild_section_handler_t walk_wild_section_handler; struct wildcard_list *handler_data[4]; + lang_section_bst_type *tree; }; typedef struct lang_address_statement_struct |