From 92757bc91688685a680cc6c6cd03324b894c4501 Mon Sep 17 00:00:00 2001 From: Jan Beulich Date: Thu, 17 Nov 2005 07:29:28 +0000 Subject: [PATCH] gas/ 2005-11-17 Jan Beulich * 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 * 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. --- gas/ChangeLog | 15 +++++++++++++ gas/cond.c | 2 +- gas/doc/internals.texi | 29 ++++++++++++++++++++++++ gas/read.c | 40 +++++++++++++++++++++++++--------- gas/symbols.c | 24 ++++++++++++++++++-- gas/symbols.h | 1 + gas/testsuite/ChangeLog | 16 ++++++++++++++ gas/testsuite/gas/all/cond.l | 6 +++++ gas/testsuite/gas/all/cond.s | 8 +++++++ gas/testsuite/gas/all/gas.exp | 17 ++++++++++++--- gas/testsuite/gas/all/redef2.d | 6 +++-- gas/testsuite/gas/all/redef2.s | 2 ++ gas/testsuite/gas/all/redef3.d | 15 +++++++++++++ gas/testsuite/gas/all/redef3.s | 12 ++++++++++ gas/testsuite/gas/all/redef4.s | 3 +++ gas/testsuite/gas/all/redef5.s | 2 ++ gas/testsuite/gas/elf/redef.d | 1 - gas/testsuite/gas/elf/redef.s | 10 +++++++++ 18 files changed, 190 insertions(+), 19 deletions(-) create mode 100644 gas/testsuite/gas/all/redef3.d create mode 100644 gas/testsuite/gas/all/redef3.s create mode 100644 gas/testsuite/gas/all/redef4.s create mode 100644 gas/testsuite/gas/all/redef5.s create mode 100644 gas/testsuite/gas/elf/redef.s diff --git a/gas/ChangeLog b/gas/ChangeLog index 6dc58086de..531391959f 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,18 @@ +2005-11-17 Jan Beulich + + + * 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. + 2005-11-16 Alan Modra * config/tc-hppa.c (pa_comm): Set bfd_com_section segment. diff --git a/gas/cond.c b/gas/cond.c index e791b11881..d6c32acc25 100644 --- a/gas/cond.c +++ b/gas/cond.c @@ -102,7 +102,7 @@ s_ifdef (int test_defined) considered to be undefined. */ is_defined = symbolP != NULL - && S_IS_DEFINED (symbolP) + && (S_IS_DEFINED (symbolP) || symbol_equated_p (symbolP)) && S_GET_SEGMENT (symbolP) != reg_section; cframe.ignoring = ! (test_defined ^ is_defined); diff --git a/gas/doc/internals.texi b/gas/doc/internals.texi index 51b4061030..dffdb1e04f 100644 --- a/gas/doc/internals.texi +++ b/gas/doc/internals.texi @@ -93,6 +93,12 @@ responsible for setting it when a symbol is used in backend routines. Whether the symbol is an MRI common symbol created by the @code{COMMON} pseudo-op when assembling in MRI mode. +@item sy_volatile +Whether the symbol can be re-defined. + +@item sy_forward_ref +Whether the symbol's value must only be evaluated upon use. + @item sy_weakrefr Whether the symbol is a @code{weakref} alias to another symbol. @@ -165,6 +171,16 @@ Return non-zero if the symbol is a @code{weakref} alias. Return non-zero if the symbol was aliased by a @code{weakref} alias and has not had any strong references. +@item S_IS_VOLATILE +@cindex S_IS_VOLATILE +Return non-zero if the symbol may be re-defined. Such symbols get created by +the @code{=} operator, @code{equ}, or @code{set}. + +@item S_IS_FORWARD_REF +@cindex S_IS_FORWARD_REF +Return non-zero if the symbol is a forward reference, that is its value must +only be determined upon use. + @item S_IS_COMMON @cindex S_IS_COMMON Return non-zero if this is a common symbol. Common symbols are sometimes @@ -222,6 +238,19 @@ Clear the @code{weakref} aliased status of a symbol. This is implicitly called whenever the symbol is looked up, as part of a direct reference or a definition, but not as part of a @code{weakref} directive. +@item S_SET_VOLATILE +@cindex S_SET_VOLATILE +Indicate that the symbol may be re-defined. + +@item S_CLEAR_VOLATILE +@cindex S_CLEAR_VOLATILE +Indicate that the symbol may no longer be re-defined. + +@item S_SET_FORWARD_REF +@cindex S_SET_FORWARD_REF +Indicate that the symbol is a forward reference, that is its value must only +be determined upon use. + @item S_GET_TYPE @item S_GET_DESC @item S_GET_OTHER diff --git a/gas/read.c b/gas/read.c index 84ca9fa47c..0485d72dec 100644 --- a/gas/read.c +++ b/gas/read.c @@ -1467,13 +1467,25 @@ s_comm_internal (int param, *p = 0; symbolP = symbol_find_or_make (name); - if (S_IS_DEFINED (symbolP) && !S_IS_COMMON (symbolP)) + if ((S_IS_DEFINED (symbolP) || symbol_equated_p (symbolP)) + && !S_IS_COMMON (symbolP)) { - symbolP = NULL; - as_bad (_("symbol `%s' is already defined"), name); - *p = c; - ignore_rest_of_line (); - goto out; + if (!S_IS_VOLATILE (symbolP)) + { + symbolP = NULL; + as_bad (_("symbol `%s' is already defined"), name); + *p = c; + ignore_rest_of_line (); + goto out; + } + /* 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. */ + if (1 || !symbol_used_p (symbolP)) + symbolP = symbol_clone (symbolP, 1); + S_SET_SEGMENT (symbolP, undefined_section); + S_SET_VALUE (symbolP, 0); + symbol_set_frag (symbolP, &zero_address_frag); + S_CLEAR_VOLATILE (symbolP); } size = S_GET_VALUE (symbolP); @@ -3174,10 +3186,18 @@ s_weakref (int ignore ATTRIBUTE_UNUSED) if (S_IS_DEFINED (symbolP) || symbol_equated_p (symbolP)) { - as_bad (_("symbol `%s' is already defined"), name); - *end_name = delim; - ignore_rest_of_line (); - return; + if(!S_IS_VOLATILE (symbolP)) + { + as_bad (_("symbol `%s' is already defined"), name); + *end_name = delim; + ignore_rest_of_line (); + return; + } + /* 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. */ + if (1 || !symbol_used_p (symbolP)) + symbolP = symbol_clone (symbolP, 1); + S_CLEAR_VOLATILE (symbolP); } *end_name = delim; diff --git a/gas/symbols.c b/gas/symbols.c index f781a3574b..f6dafcd86b 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); + } } } @@ -2186,6 +2199,13 @@ S_SET_VOLATILE (symbolS *s) s->sy_volatile = 1; } +void +S_CLEAR_VOLATILE (symbolS *s) +{ + if (!LOCAL_SYMBOL_CHECK (s)) + s->sy_volatile = 0; +} + void S_SET_FORWARD_REF (symbolS *s) { diff --git a/gas/symbols.h b/gas/symbols.h index 99fa3c3c47..d4e56fb996 100644 --- a/gas/symbols.h +++ b/gas/symbols.h @@ -108,6 +108,7 @@ extern void S_SET_WEAKREFD (symbolS *); extern void S_CLEAR_WEAKREFD (symbolS *); extern void S_SET_THREAD_LOCAL (symbolS *); extern void S_SET_VOLATILE (symbolS *); +extern void S_CLEAR_VOLATILE (symbolS *); extern void S_SET_FORWARD_REF (symbolS *); #ifndef WORKING_DOT_WORD diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog index 059cc50b90..dafe7047ed 100644 --- a/gas/testsuite/ChangeLog +++ b/gas/testsuite/ChangeLog @@ -1,3 +1,19 @@ +2005-11-17 Jan Beulich + + * 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. + 2005-11-16 Richard Henderson * gas/all/weakref1.s: Use "=" instead of ".set" for equivalence. diff --git a/gas/testsuite/gas/all/cond.l b/gas/testsuite/gas/all/cond.l index a103d8dae7..6939ee8508 100644 --- a/gas/testsuite/gas/all/cond.l +++ b/gas/testsuite/gas/all/cond.l @@ -24,7 +24,13 @@ 29[ ]+.else 31[ ]+.endif [ ]*[1-9][0-9]*[ ]+ +[ ]*[1-9][0-9]*[ ]+\.comm[ ]+c,[ ]*1[ ]* +[ ]*[1-9][0-9]*[ ]+\.ifndef[ ]+c[ ]* +[ ]*[1-9][0-9]*[ ]+\.endif[ ]* +[ ]*[1-9][0-9]*[ ]+ [ ]*[1-9][0-9]*[ ]+\.equiv[ ]+x,[ ]*y[ ]* +[ ]*[1-9][0-9]*[ ]+\.ifndef[ ]+x[ ]* +[ ]*[1-9][0-9]*[ ]+\.endif[ ]* [ ]*[1-9][0-9]*[ ]+\.equiv[ ]+y,[ ]*0[ ]* [ ]*[1-9][0-9]*[ ]+\.if[ ]+x[ ]* [ ]*[1-9][0-9]*[ ]+\.elseif[ ]+x[ ]* diff --git a/gas/testsuite/gas/all/cond.s b/gas/testsuite/gas/all/cond.s index 2737d1ff29..94136acb23 100644 --- a/gas/testsuite/gas/all/cond.s +++ b/gas/testsuite/gas/all/cond.s @@ -30,7 +30,15 @@ .long 9 .endif + .comm c, 1 + .ifndef c + .err + .endif + .equiv x, y + .ifndef x + .err + .endif .equiv y, 0 .if x .err diff --git a/gas/testsuite/gas/all/gas.exp b/gas/testsuite/gas/all/gas.exp index d92ede8450..c97a7301a1 100644 --- a/gas/testsuite/gas/all/gas.exp +++ b/gas/testsuite/gas/all/gas.exp @@ -74,16 +74,24 @@ case $target_triplet in { # .set works differently on some targets. case $target_triplet in { { alpha*-*-* } { } - { iq2000*-*-* } { } { mips*-*-* } { } { *c54x*-*-* } { } { z80-*-* } { } default { setup_xfail "*c30*-*-*" "*c4x*-*-*" "pdp11-*-*" run_dump_test redef - setup_xfail "*c30*-*-*" "*c4x*-*-*" "*arm*-*-coff" "arm*-*-pe*" "crx*-*-*" - setup_xfail "h8300*-*-*" "m68hc*-*-*" "maxq-*-*" "pdp11-*-*" "vax*-*-*" "z8k-*-*" + setup_xfail "*c30*-*-*" "*c4x*-*-*" "*arm*-*-*aout*" "*arm*-*-*coff" \ + "*arm*-*-pe" "crx*-*-*" "h8300*-*-*" "m68hc*-*-*" "maxq-*-*" \ + "pdp11-*-*" "vax*-*-*" "z8k-*-*" run_dump_test redef2 + setup_xfail "*-*-aix*" "*-*-coff" "*-*-cygwin" "*-*-mingw*" "*-*-pe*" \ + "bfin-*-*" "*c4x*-*-*" "crx*-*-*" "h8300*-*-*" "m68hc*-*-*" \ + "maxq-*-*" "or32-*-*" "pdp11-*-*" "vax*-*-*" "z8k-*-*" + run_dump_test redef3 + setup_xfail "*c4x*-*-*" + gas_test_error "redef4.s" "" ".set for symbol already used as label" + setup_xfail "*c4x*-*-*" + gas_test_error "redef5.s" "" ".set for symbol already defined through .comm" } } @@ -256,6 +264,9 @@ if { ![istarget "i960-*-*"] } { # .set works differently on some targets. case $target_triplet in { + { alpha*-*-* } { } + { mips*-*-* } { } + { *c54x*-*-* } { } { z80-*-* } { } default { run_dump_test weakref1 diff --git a/gas/testsuite/gas/all/redef2.d b/gas/testsuite/gas/all/redef2.d index 452d610beb..d53efa5e0e 100644 --- a/gas/testsuite/gas/all/redef2.d +++ b/gas/testsuite/gas/all/redef2.d @@ -5,9 +5,11 @@ RELOCATION RECORDS FOR .* .* -0+0.*(here|\.data) -0+8.*xtrn +0+00.*(here|\.data) +0+08.*xtrn +0+10.*(sym|\.data(\+0x0+10)?) #... Contents of section \.data: 0000 00000000 11111111 00000000 22222222[ ]+................[ ]* + 0010 [01]00000[01]0 .* #pass diff --git a/gas/testsuite/gas/all/redef2.s b/gas/testsuite/gas/all/redef2.s index 3e975e1372..89a29ac138 100644 --- a/gas/testsuite/gas/all/redef2.s +++ b/gas/testsuite/gas/all/redef2.s @@ -8,3 +8,5 @@ here: .long sym .set sym, 0x22222222 .long sym +sym: + .long sym diff --git a/gas/testsuite/gas/all/redef3.d b/gas/testsuite/gas/all/redef3.d new file mode 100644 index 0000000000..85843bb02e --- /dev/null +++ b/gas/testsuite/gas/all/redef3.d @@ -0,0 +1,15 @@ +#objdump: -rsj .data +#name: .equ redefinitions (3) + +.*: .* + +RELOCATION RECORDS FOR .* +.* +0+00.*(here|\.data) +0+08.*xtrn +0+10.*sym +#... +Contents of section \.data: + 0000 00000000 11111111 00000000 22222222[ ]+................[ ]* + 0010 00000000 .* +#pass diff --git a/gas/testsuite/gas/all/redef3.s b/gas/testsuite/gas/all/redef3.s new file mode 100644 index 0000000000..2296d744ab --- /dev/null +++ b/gas/testsuite/gas/all/redef3.s @@ -0,0 +1,12 @@ + .data +here: + .set sym, here + .long sym + .set sym, 0x11111111 + .long sym + .set sym, xtrn + .long sym + .set sym, 0x22222222 + .long sym + .comm sym, 1 + .long sym diff --git a/gas/testsuite/gas/all/redef4.s b/gas/testsuite/gas/all/redef4.s new file mode 100644 index 0000000000..8bd39438a9 --- /dev/null +++ b/gas/testsuite/gas/all/redef4.s @@ -0,0 +1,3 @@ + .data +sym: + .set sym, 0 diff --git a/gas/testsuite/gas/all/redef5.s b/gas/testsuite/gas/all/redef5.s new file mode 100644 index 0000000000..8a3a67a1ec --- /dev/null +++ b/gas/testsuite/gas/all/redef5.s @@ -0,0 +1,2 @@ + .comm sym, 1 + .set sym, 0 diff --git a/gas/testsuite/gas/elf/redef.d b/gas/testsuite/gas/elf/redef.d index d62e302d52..6e5daeabc3 100644 --- a/gas/testsuite/gas/elf/redef.d +++ b/gas/testsuite/gas/elf/redef.d @@ -1,6 +1,5 @@ #objdump: -t #name: .equ redefinitions (ELF) -#source: ../all/redef2.s .*: .* diff --git a/gas/testsuite/gas/elf/redef.s b/gas/testsuite/gas/elf/redef.s new file mode 100644 index 0000000000..3e975e1372 --- /dev/null +++ b/gas/testsuite/gas/elf/redef.s @@ -0,0 +1,10 @@ + .data +here: + .set sym, here + .long sym + .set sym, 0x11111111 + .long sym + .set sym, xtrn + .long sym + .set sym, 0x22222222 + .long sym