PR ld/12726

* ldexp.h (lang_phase_type): Add lang_assigning_phase_enum.
	* ldexp.c (exp_fold_tree_1): Correct assign to dot comment.  Don't
	assign to dot when lang_assigning_phase_enum.
	* ldlang.h (lang_do_assignments): Update prototype.
	* ldlang.c (lang_do_assignments): Add phase parameter.  Update all
	callers.
	* pe-dll.c (pe_dll_fill_sections, pe_exe_fill_sections): Update
	lang_do_assignments calls.
This commit is contained in:
Alan Modra
2011-05-03 14:56:14 +00:00
parent 2fbb87f627
commit 2f65ac726a
6 changed files with 27 additions and 11 deletions

View File

@ -1,3 +1,15 @@
2011-05-04 Alan Modra <amodra@gmail.com>
PR ld/12726
* ldexp.h (lang_phase_type): Add lang_assigning_phase_enum.
* ldexp.c (exp_fold_tree_1): Correct assign to dot comment. Don't
assign to dot when lang_assigning_phase_enum.
* ldlang.h (lang_do_assignments): Update prototype.
* ldlang.c (lang_do_assignments): Add phase parameter. Update all
callers.
* pe-dll.c (pe_dll_fill_sections, pe_exe_fill_sections): Update
lang_do_assignments calls.
2011-04-28 Daniel C. Klauer <daniel.c.klauer@web.de>
PR ld/12614

View File

@ -783,12 +783,15 @@ exp_fold_tree_1 (etree_type *tree)
case etree_provided:
if (tree->assign.dst[0] == '.' && tree->assign.dst[1] == 0)
{
/* Assignment to dot can only be done during allocation. */
if (tree->type.node_class != etree_assign)
einfo (_("%F%S can not PROVIDE assignment to location counter\n"));
/* After allocation, assignment to dot should not be done inside
an output section since allocation adds a padding statement
that effectively duplicates the assignment. */
if (expld.phase == lang_mark_phase_enum
|| expld.phase == lang_allocating_phase_enum
|| (expld.phase == lang_final_phase_enum
|| ((expld.phase == lang_assigning_phase_enum
|| expld.phase == lang_final_phase_enum)
&& expld.section == bfd_abs_section_ptr))
{
/* Notify the folder that this is an assignment to dot. */

View File

@ -97,6 +97,7 @@ typedef enum {
lang_first_phase_enum,
lang_mark_phase_enum,
lang_allocating_phase_enum,
lang_assigning_phase_enum,
lang_final_phase_enum
} lang_phase_type;

View File

@ -5606,8 +5606,9 @@ lang_do_assignments_1 (lang_statement_union_type *s,
}
void
lang_do_assignments (void)
lang_do_assignments (lang_phase_type phase)
{
expld.phase = phase;
lang_statement_iteration++;
lang_do_assignments_1 (statement_list.head, abs_output_section, NULL, 0);
}
@ -6403,7 +6404,7 @@ lang_relax_sections (bfd_boolean need_layout)
/* Do all the assignments with our current guesses as to
section sizes. */
lang_do_assignments ();
lang_do_assignments (lang_assigning_phase_enum);
/* We must do this after lang_do_assignments, because it uses
size. */
@ -6424,7 +6425,7 @@ lang_relax_sections (bfd_boolean need_layout)
if (need_layout)
{
/* Final extra sizing to report errors. */
lang_do_assignments ();
lang_do_assignments (lang_assigning_phase_enum);
lang_reset_memory_regions ();
lang_size_sections (NULL, TRUE);
}
@ -6666,8 +6667,7 @@ lang_process (void)
/* Do all the assignments, now that we know the final resting places
of all the symbols. */
expld.phase = lang_final_phase_enum;
lang_do_assignments ();
lang_do_assignments (lang_final_phase_enum);
ldemul_finish ();

View File

@ -543,7 +543,7 @@ extern void lang_for_each_file
extern void lang_reset_memory_regions
(void);
extern void lang_do_assignments
(void);
(lang_phase_type);
#define LANG_FOR_EACH_INPUT_STATEMENT(statement) \
lang_input_statement_type *statement; \

View File

@ -1,6 +1,6 @@
/* Routines to help build PEI-format DLLs (Win32 etc)
Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
2008, 2009, 2010 Free Software Foundation, Inc.
2008, 2009, 2010, 2011 Free Software Foundation, Inc.
Written by DJ Delorie <dj@cygnus.com>
This file is part of the GNU Binutils.
@ -3232,7 +3232,7 @@ pe_dll_fill_sections (bfd *abfd, struct bfd_link_info *info)
ldemul_after_allocation ();
/* Do the assignments again. */
lang_do_assignments ();
lang_do_assignments (lang_final_phase_enum);
}
fill_edata (abfd, info);
@ -3264,7 +3264,7 @@ pe_exe_fill_sections (bfd *abfd, struct bfd_link_info *info)
ldemul_after_allocation ();
/* Do the assignments again. */
lang_do_assignments ();
lang_do_assignments (lang_final_phase_enum);
}
reloc_s->contents = reloc_d;
}