mirror of
https://github.com/darlinghq/darling-gdb.git
synced 2025-01-22 09:04:58 +00:00
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:
parent
544838827c
commit
e759c11602
21
ld/ChangeLog
21
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@.
|
||||
|
10
ld/ldexp.c
10
ld/ldexp.c
@ -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
|
||||
|
78
ld/ldlang.c
78
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;
|
||||
|
@ -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.
|
||||
|
@ -5,5 +5,5 @@
|
||||
#...
|
||||
0*8000000 . _START
|
||||
#...
|
||||
0*8000000 T text
|
||||
0*9000000 T text
|
||||
#pass
|
||||
|
Loading…
x
Reference in New Issue
Block a user