diff options
author | Hans-Peter Nilsson <hp@axis.com> | 2003-10-11 09:16:20 +0000 |
---|---|---|
committer | Hans-Peter Nilsson <hp@axis.com> | 2003-10-11 09:16:20 +0000 |
commit | 5dce08959267da239411b60ac8735b34e990fa37 (patch) | |
tree | 5f430702ae76a949fffcb7329431633515bb129d /ld/ldexp.c | |
parent | 843344944db631567f5d224454ea831ae5b826b0 (diff) | |
download | binutils-redhat-5dce08959267da239411b60ac8735b34e990fa37.tar.gz |
* ld.texinfo (Builtin Functions) <DEFINED>: Say that only symbols
defined before the statement using DEFINED yield 1.
* ldexp.c (fold_name) <case DEFINED>: In lang_first_phase_enum,
call lang_track_definedness on symbol. In subsequent phases, use
lang_symbol_definition_iteration and lang_statement_iteration to
check whether the symbol was defined before the current statement.
(exp_fold_tree) <case etree_assign et al>: Call
lang_update_definedness before updating symbol type when setting
symbol.
* ldlang.c (lang_definedness_table): New variable.
(lang_definedness_newfunc, lang_track_definedness)
(lang_symbol_definition_iteration, lang_update_definedness): New
functions.
(lang_init): Initialize lang_definedness_table and
lang_statement_iteration.
(lang_finish): Destroy bfd_hash_table_free.
(lang_size_sections): Increment lang_statement_iteration.
(lang_do_assignments_1): New function with former
lang_do_assignments contents. Change recursive calls to call this
function.
(lang_do_assignments): Evacuate contents. Increment
lang_statement_iteration, then just call lang_do_assignments_1.
* ldlang.h (struct lang_definedness_hash_entry)
(lang_statement_iteration, lang_track_definedness)
(lang_symbol_definition_iteration, lang_update_definedness):
Declare.
Diffstat (limited to 'ld/ldexp.c')
-rw-r--r-- | ld/ldexp.c | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/ld/ldexp.c b/ld/ldexp.c index cce0cdfc6d..80d79cf193 100644 --- a/ld/ldexp.c +++ b/ld/ldexp.c @@ -485,10 +485,15 @@ fold_name (etree_type *tree, break; case DEFINED: if (allocation_done == lang_first_phase_enum) - result.valid_p = FALSE; + { + lang_track_definedness (tree->name.name); + result.valid_p = FALSE; + } else { struct bfd_link_hash_entry *h; + int def_iteration + = lang_symbol_definition_iteration (tree->name.name); h = bfd_wrapped_link_hash_lookup (output_bfd, &link_info, tree->name.name, @@ -496,7 +501,9 @@ fold_name (etree_type *tree, result.value = (h != NULL && (h->type == bfd_link_hash_defined || h->type == bfd_link_hash_defweak - || h->type == bfd_link_hash_common)); + || h->type == bfd_link_hash_common) + && (def_iteration == lang_statement_iteration + || def_iteration == -1)); result.section = abs_output_section; result.valid_p = TRUE; } @@ -738,6 +745,7 @@ exp_fold_tree (etree_type *tree, { /* FIXME: Should we worry if the symbol is already defined? */ + lang_update_definedness (tree->assign.dst, h); h->type = bfd_link_hash_defined; h->u.def.value = result.value; h->u.def.section = result.section->bfd_section; |