diff options
author | Jan Beulich <jbeulich@novell.com> | 2005-11-17 07:29:28 +0000 |
---|---|---|
committer | Jan Beulich <jbeulich@novell.com> | 2005-11-17 07:29:28 +0000 |
commit | 92757bc91688685a680cc6c6cd03324b894c4501 (patch) | |
tree | af7f90015e9fa7a13331367da0e55c3fbe02b9b7 /gas/symbols.c | |
parent | 2be701a30fd949e7a486fcf6843fdb34f6bc00dc (diff) | |
download | gdb-92757bc91688685a680cc6c6cd03324b894c4501.zip gdb-92757bc91688685a680cc6c6cd03324b894c4501.tar.gz gdb-92757bc91688685a680cc6c6cd03324b894c4501.tar.bz2 |
gas/
2005-11-17 Jan Beulich <jbeulich@novell.com>
* symbols.h (S_CLEAR_VOLATILE): Declare.
* symbols.c (colon): Also accept redefinable symbols for
redefinition. Clone them before modifying.
(S_CLEAR_VOLATILE): Define.
* cond.c (s_ifdef): Also test for equated symbols.
* read.c (s_comm_internal): Also exclude non-redefinable
equated symbols. Clone redefinable ones before modifying.
(s_weakref): Clone redefinable symbols before modifying.
* doc/internals.texi: Document sy_volatile, sy_forward_ref,
S_IS_VOLATILE, S_SET_VOLATILE, S_CLEAR_VOLATILE,
S_IS_FORWARD_REF, and S_SET_FORWARD_REF.
gas/testsuite/
2005-11-17 Jan Beulich <jbeulich@novell.com>
* gas/all/cond.s: Also check ifdef works on equates and
commons.
* gas/all/cond.l: Adjust.
* gas/all/redef2.s: Also test redefining equate to label.
* gas/all/redef2.d: Adjust.
* gas/all/redef3.[sd]: New.
* gas/all/redef4.s: New.
* gas/all/redef5.s: New.
* gas/elf/redef.s: New, copied from original gas/all/redef2.s.
* gas/elf/redef.d: Remove #source.
* gas/all/gas.exp: Remove exclusion of iq2000-*-* from and
adjust xfails for redefinition tests. Run new tests. Exclude
alpha*-*-*, mips*-*-*, *c54x*-*-* from weakref tests.
Diffstat (limited to 'gas/symbols.c')
-rw-r--r-- | gas/symbols.c | 24 |
1 files changed, 22 insertions, 2 deletions
diff --git a/gas/symbols.c b/gas/symbols.c index f781a35..f6dafcd 100644 --- a/gas/symbols.c +++ b/gas/symbols.c @@ -333,8 +333,18 @@ colon (/* Just seen "x:" - rattle symbols & frags. */ locsym->lsy_value = frag_now_fix (); } else if (!(S_IS_DEFINED (symbolP) || symbol_equated_p (symbolP)) - || S_IS_COMMON (symbolP)) + || S_IS_COMMON (symbolP) + || S_IS_VOLATILE (symbolP)) { + if (S_IS_VOLATILE (symbolP) + /* This could be avoided when the symbol wasn't used so far, but + the comment in struc-symbol.h says this flag isn't reliable. */ + && (1 || !symbol_used_p (symbolP))) + { + symbolP = symbol_clone (symbolP, 1); + S_SET_VALUE (symbolP, 0); + S_CLEAR_VOLATILE (symbolP); + } if (S_GET_VALUE (symbolP) == 0) { symbolP->sy_frag = frag_now; @@ -421,7 +431,10 @@ colon (/* Just seen "x:" - rattle symbols & frags. */ if (!(frag_now == symbolP->sy_frag && S_GET_VALUE (symbolP) == frag_now_fix () && S_GET_SEGMENT (symbolP) == now_seg)) - as_bad (_("symbol `%s' is already defined"), sym_name); + { + as_bad (_("symbol `%s' is already defined"), sym_name); + symbolP = symbol_clone (symbolP, 0); + } } } @@ -2187,6 +2200,13 @@ S_SET_VOLATILE (symbolS *s) } void +S_CLEAR_VOLATILE (symbolS *s) +{ + if (!LOCAL_SYMBOL_CHECK (s)) + s->sy_volatile = 0; +} + +void S_SET_FORWARD_REF (symbolS *s) { if (LOCAL_SYMBOL_CHECK (s)) |