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.

testsuite/
	* ld-scripts/default-script2.d: Revert 2010-11-03 change.
This commit is contained in:
Alan Modra 2010-12-20 06:27:11 +00:00
parent 544838827c
commit e759c11602
6 changed files with 46 additions and 73 deletions

View file

@ -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@.

View file

@ -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);
}

View file

@ -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

View file

@ -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;

View file

@ -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.

View file

@ -5,5 +5,5 @@
#...
0*8000000 . _START
#...
0*8000000 T text
0*9000000 T text
#pass