diff options
-rw-r--r-- | ld/ChangeLog | 21 | ||||
-rw-r--r-- | ld/ldexp.c | 10 | ||||
-rw-r--r-- | ld/ldexp.h | 3 | ||||
-rw-r--r-- | ld/ldlang.c | 78 | ||||
-rw-r--r-- | ld/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | ld/testsuite/ld-scripts/default-script2.d | 2 |
6 files changed, 46 insertions, 73 deletions
diff --git a/ld/ChangeLog b/ld/ChangeLog index c145a7e..13aa681 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,24 @@ +2010-12-20 Alan Modra <amodra@gmail.com> + + PR ld/12001 + Revert 2010-11-03 Nick Clifton + * ldlang.c (ldlang_def_chain_list): Delete. + (insert_defined, ldlang_add_def, lang_place_defineds): Delete. + (lang_process): Don't call lang_place_defineds. + (lang_add_assignment): Don't do anything special for --defsym. + + * ldexp.h (struct ldexp_control): Add uses_defined. + (exp_fold_tree_no_dot): Declare. + * ldexp.c (exp_fold_tree): Clear uses_defined. + (exp_fold_tree_no_dot): Likewise. Make global. + (fold_name <DEFINED>): Set uses_defined. + (exp_fold_tree_1 <etree_assign>): Define symbol during first phase + even when the value being assigned isn't valid. + * ldlang.c (open_input_bfds): Process assignment statements. + (lang_process): Bump lang_statement_iteration. + (scan_for_self_assignment): Formatting. + (print_assignment): Style. + 2010-12-15 H.J. Lu <hongjiu.lu@intel.com> * Makefile.am (GENSCRIPTS): Add @enable_initfini_array@. @@ -44,7 +44,6 @@ #include "safe-ctype.h" static void exp_fold_tree_1 (etree_type *); -static void exp_fold_tree_no_dot (etree_type *); static bfd_vma align_n (bfd_vma, bfd_vma); segment_type *segments; @@ -504,6 +503,7 @@ fold_name (etree_type *tree) break; case DEFINED: + expld.uses_defined = TRUE; if (expld.phase == lang_first_phase_enum) lang_track_definedness (tree->name.name); else @@ -802,7 +802,9 @@ exp_fold_tree_1 (etree_type *tree) } exp_fold_tree_1 (tree->assign.src); - if (expld.result.valid_p) + if (expld.result.valid_p + || (expld.phase == lang_first_phase_enum + && !expld.uses_defined)) { if (h == NULL) { @@ -872,15 +874,17 @@ exp_fold_tree (etree_type *tree, asection *current_section, bfd_vma *dotp) expld.dot = *dotp; expld.dotp = dotp; expld.section = current_section; + expld.uses_defined = FALSE; exp_fold_tree_1 (tree); } -static void +void exp_fold_tree_no_dot (etree_type *tree) { expld.dot = 0; expld.dotp = NULL; expld.section = bfd_abs_section_ptr; + expld.uses_defined = FALSE; exp_fold_tree_1 (tree); } @@ -127,6 +127,7 @@ struct ldexp_control { /* Working results. */ etree_value_type result; bfd_vma dot; + bfd_boolean uses_defined; /* Current dot and section passed to ldexp folder. */ bfd_vma *dotp; @@ -173,6 +174,8 @@ etree_type *exp_relop (asection *, bfd_vma); void exp_fold_tree (etree_type *, asection *, bfd_vma *); +void exp_fold_tree_no_dot + (etree_type *); etree_type *exp_binop (int, etree_type *, etree_type *); etree_type *exp_trinop diff --git a/ld/ldlang.c b/ld/ldlang.c index 32c4af3..6f4e200 100644 --- a/ld/ldlang.c +++ b/ld/ldlang.c @@ -3249,6 +3249,9 @@ open_input_bfds (lang_statement_union_type *s, bfd_boolean force) } } break; + case lang_assignment_statement_enum: + exp_fold_tree_no_dot (s->assignment_statement.exp); + break; default: break; } @@ -3395,65 +3398,6 @@ lang_place_undefineds (void) insert_undefined (ptr->name); } -typedef struct bfd_sym_chain ldlang_def_chain_list_type; - -static ldlang_def_chain_list_type ldlang_def_chain_list_head; - -/* Insert NAME as defined in the symbol table. */ - -static void -insert_defined (const char *name) -{ - struct bfd_link_hash_entry *h; - - h = bfd_link_hash_lookup (link_info.hash, name, TRUE, FALSE, TRUE); - if (h == NULL) - einfo (_("%P%F: bfd_link_hash_lookup failed: %E\n")); - if (h->type == bfd_link_hash_new - || h->type == bfd_link_hash_undefined - || h->type == bfd_link_hash_undefweak) - { - h->type = bfd_link_hash_defined; - h->u.def.section = bfd_abs_section_ptr; - h->u.def.value = 0; - } -} - -/* Like lang_add_undef, but this time for symbols defined on the - command line. */ - -static void -ldlang_add_def (const char *const name) -{ - if (link_info.output_bfd != NULL) - insert_defined (xstrdup (name)); - else - { - ldlang_def_chain_list_type *new_def; - - new_def = (ldlang_def_chain_list_type *) stat_alloc (sizeof (*new_def)); - new_def->next = ldlang_def_chain_list_head.next; - ldlang_def_chain_list_head.next = new_def; - - new_def->name = xstrdup (name); - } -} - -/* Run through the list of defineds created above and place them - into the linker hash table as defined symbols belonging to the - script file. */ - -static void -lang_place_defineds (void) -{ - ldlang_def_chain_list_type *ptr; - - for (ptr = ldlang_def_chain_list_head.next; - ptr != NULL; - ptr = ptr->next) - insert_defined (ptr->name); -} - /* Check for all readonly or some readwrite sections. */ static void @@ -3982,12 +3926,12 @@ scan_for_self_assignment (const char * dst, etree_type * rhs) switch (rhs->type.node_class) { case etree_binary: - return scan_for_self_assignment (dst, rhs->binary.lhs) - || scan_for_self_assignment (dst, rhs->binary.rhs); + return (scan_for_self_assignment (dst, rhs->binary.lhs) + || scan_for_self_assignment (dst, rhs->binary.rhs)); case etree_trinary: - return scan_for_self_assignment (dst, rhs->trinary.lhs) - || scan_for_self_assignment (dst, rhs->trinary.rhs); + return (scan_for_self_assignment (dst, rhs->trinary.lhs) + || scan_for_self_assignment (dst, rhs->trinary.rhs)); case etree_assign: case etree_provided: @@ -4042,7 +3986,7 @@ print_assignment (lang_assignment_statement_type *assignment, is_dot = (dst[0] == '.' && dst[1] == 0); tree = assignment->exp->assign.src; - computation_is_valid = is_dot || (scan_for_self_assignment (dst, tree) == FALSE); + computation_is_valid = is_dot || !scan_for_self_assignment (dst, tree); } osec = output_section->bfd_section; @@ -6461,7 +6405,6 @@ lang_process (void) /* Add to the hash table all undefineds on the command line. */ lang_place_undefineds (); - lang_place_defineds (); if (!bfd_section_already_linked_table_init ()) einfo (_("%P%F: Failed to create hash table\n")); @@ -6523,6 +6466,7 @@ lang_process (void) /* Run through the contours of the script and attach input sections to the correct output sections. */ + lang_statement_iteration++; map_input_to_output_sections (statement_list.head, NULL, NULL); process_insert_statements (); @@ -6746,10 +6690,6 @@ lang_add_assignment (etree_type *exp) { lang_assignment_statement_type *new_stmt; - extern int parsing_defsym; - if (parsing_defsym) - ldlang_add_def (exp->assign.dst); - new_stmt = new_stat (lang_assignment_statement, stat_ptr); new_stmt->exp = exp; return new_stmt; diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog index 3f0fc2b..f1e7a35 100644 --- a/ld/testsuite/ChangeLog +++ b/ld/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-12-20 Alan Modra <amodra@gmail.com> + + PR ld/12001 + * ld-scripts/default-script2.d: Revert 2010-11-03 change. + 2010-12-15 H.J. Lu <hongjiu.lu@intel.com> * ld-elf/elf.exp (array_tests): Add init-mixed. diff --git a/ld/testsuite/ld-scripts/default-script2.d b/ld/testsuite/ld-scripts/default-script2.d index 829718d..68ce2aa 100644 --- a/ld/testsuite/ld-scripts/default-script2.d +++ b/ld/testsuite/ld-scripts/default-script2.d @@ -5,5 +5,5 @@ #... 0*8000000 . _START #... -0*8000000 T text +0*9000000 T text #pass |