From: Jan Beulich Date: Thu, 27 Oct 2005 07:40:07 +0000 (+0000) Subject: gas/ X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=6a2b6326c21eb3e45d366676e81935ad660a7101;p=binutils-gdb.git gas/ 2005-10-27 Jan Beulich * read.c (assign_symbol): Also consider equates already defined. * symbols.c (symbol_clone): Also clone the underlying BFD symbol. * config/obj-coff.h (obj_symbol_clone_hook): New. (coff_obj_symbol_clone_hook): Declare. * config/obj-coff.c (coff_obj_symbol_clone_hook): New. gas/testsuite/ 2005-10-27 Jan Beulich * gas/all/gas.exp: Don't xfail equiv1 test anymore. --- diff --git a/gas/ChangeLog b/gas/ChangeLog index 488cbcb4b86..a4fcec42927 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,11 @@ +2005-10-27 Jan Beulich + + * read.c (assign_symbol): Also consider equates already defined. + * symbols.c (symbol_clone): Also clone the underlying BFD symbol. + * config/obj-coff.h (obj_symbol_clone_hook): New. + (coff_obj_symbol_clone_hook): Declare. + * config/obj-coff.c (coff_obj_symbol_clone_hook): New. + 2005-10-26 DJ Delorie * config/tc-m32c.c (md_relax_table, subtype_mappings, diff --git a/gas/config/obj-coff.c b/gas/config/obj-coff.c index f1446c02348..ce4d6f5fcc7 100644 --- a/gas/config/obj-coff.c +++ b/gas/config/obj-coff.c @@ -329,6 +329,18 @@ coff_obj_symbol_new_hook (symbolS *symbolP) SF_SET_LOCAL (symbolP); } +void +coff_obj_symbol_clone_hook (symbolS *newsymP, symbolS *orgsymP) +{ + long sz = (OBJ_COFF_MAX_AUXENTRIES + 1) * sizeof (combined_entry_type); + combined_entry_type * s = xmalloc (sz); + + memcpy (s, coffsymbol (symbol_get_bfdsym (orgsymP))->native, sz); + coffsymbol (symbol_get_bfdsym (newsymP))->native = s; + + SF_SET (newsymP, SF_GET (orgsymP)); +} + /* Handle .ln directives. */ diff --git a/gas/config/obj-coff.h b/gas/config/obj-coff.h index 4c7c68d77a7..6fcbc9f06cb 100644 --- a/gas/config/obj-coff.h +++ b/gas/config/obj-coff.h @@ -172,6 +172,7 @@ #endif #define obj_symbol_new_hook coff_obj_symbol_new_hook +#define obj_symbol_clone_hook coff_obj_symbol_clone_hook #define obj_read_begin_hook coff_obj_read_begin_hook #include "bfd/libcoff.h" @@ -391,6 +392,7 @@ extern void coff_frob_section (segT); extern void coff_adjust_section_syms (bfd *, asection *, void *); extern void coff_frob_file_after_relocs (void); extern void coff_obj_symbol_new_hook (symbolS *); +extern void coff_obj_symbol_clone_hook (symbolS *, symbolS *); extern void coff_obj_read_begin_hook (void); #ifdef TE_PE extern void pecoff_obj_set_weak_hook (symbolS *); diff --git a/gas/read.c b/gas/read.c index 9381735e8dd..c85ca5fac5d 100644 --- a/gas/read.c +++ b/gas/read.c @@ -2794,7 +2794,7 @@ assign_symbol (char *name, int mode) #endif } - if (S_IS_DEFINED (symbolP)) + if (S_IS_DEFINED (symbolP) || symbol_equated_p (symbolP)) { /* Permit register names to be redefined. */ if ((mode != 0 || !S_IS_VOLATILE (symbolP)) diff --git a/gas/symbols.c b/gas/symbols.c index 0110f4204d9..c42cd7c03ca 100644 --- a/gas/symbols.c +++ b/gas/symbols.c @@ -542,6 +542,7 @@ symbolS * symbol_clone (symbolS *orgsymP, int replace) { symbolS *newsymP; + asymbol *bsymorg, *bsymnew; /* Running local_symbol_convert on a clone that's not the one currently in local_hash would incorrectly replace the hash entry. Thus the @@ -549,11 +550,30 @@ symbol_clone (symbolS *orgsymP, int replace) depends on not encountering an unconverted symbol. */ if (LOCAL_SYMBOL_CHECK (orgsymP)) orgsymP = local_symbol_convert ((struct local_symbol *) orgsymP); + bsymorg = orgsymP->bsym; know (S_IS_DEFINED (orgsymP)); newsymP = obstack_alloc (¬es, sizeof (*newsymP)); *newsymP = *orgsymP; + bsymnew = bfd_make_empty_symbol (bfd_asymbol_bfd (bsymorg)); + if (bsymnew == NULL) + as_perror ("%s", "bfd_make_empty_symbol"); + newsymP->bsym = bsymnew; + bsymnew->name = bsymorg->name; + bsymnew->flags = bsymorg->flags; + bsymnew->section = bsymorg->section; + bsymnew->udata.p = (PTR) newsymP; + bfd_copy_private_symbol_data (bfd_asymbol_bfd (bsymorg), bsymorg, + bfd_asymbol_bfd (bsymnew), bsymnew); + +#ifdef obj_symbol_clone_hook + obj_symbol_clone_hook (newsymP, orgsymP); +#endif + +#ifdef tc_symbol_clone_hook + tc_symbol_clone_hook (newsymP, orgsymP); +#endif if (replace) { diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog index 127e6a76eb1..821653da8d2 100644 --- a/gas/testsuite/ChangeLog +++ b/gas/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2005-10-27 Jan Beulich + + * gas/all/gas.exp: Don't xfail equiv1 test anymore. + 2005-10-26 Paul Brook * gas/arm/archv6.d: Adjust expected output. diff --git a/gas/testsuite/gas/all/gas.exp b/gas/testsuite/gas/all/gas.exp index 5c52e9e3d7f..b67b23791c7 100644 --- a/gas/testsuite/gas/all/gas.exp +++ b/gas/testsuite/gas/all/gas.exp @@ -35,8 +35,6 @@ if ![istarget hppa*-*-*] then { gas_test_error "diff1.s" "" "difference of two undefined symbols" } -# PR/1387 -setup_xfail "*-*-*" gas_test_error "equiv1.s" "" ".equiv for symbol already set to another one" gas_test_error "equiv2.s" "" ".equiv for symbol already set to an expression"