aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gas/ChangeLog8
-rw-r--r--gas/config/obj-coff.c12
-rw-r--r--gas/config/obj-coff.h2
-rw-r--r--gas/read.c2
-rw-r--r--gas/symbols.c20
-rw-r--r--gas/testsuite/ChangeLog4
-rw-r--r--gas/testsuite/gas/all/gas.exp2
7 files changed, 47 insertions, 3 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog
index 488cbcb..a4fcec4 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,3 +1,11 @@
+2005-10-27 Jan Beulich <jbeulich@novell.com>
+
+ * 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 <dj@redhat.com>
* config/tc-m32c.c (md_relax_table, subtype_mappings,
diff --git a/gas/config/obj-coff.c b/gas/config/obj-coff.c
index f1446c0..ce4d6f5 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 4c7c68d..6fcbc9f 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 9381735..c85ca5f 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 0110f42..c42cd7c 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 (&notes, 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 127e6a7..821653d 100644
--- a/gas/testsuite/ChangeLog
+++ b/gas/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2005-10-27 Jan Beulich <jbeulich@novell.com>
+
+ * gas/all/gas.exp: Don't xfail equiv1 test anymore.
+
2005-10-26 Paul Brook <paul@codesourcery.com>
* gas/arm/archv6.d: Adjust expected output.
diff --git a/gas/testsuite/gas/all/gas.exp b/gas/testsuite/gas/all/gas.exp
index 5c52e9e..b67b237 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"