This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
Other format: | [Raw text] |
>>> Alan Modra <amodra@bigpond.net.au> 16.11.05 10:59:43 >>> >On Wed, Nov 16, 2005 at 10:10:22AM +0100, Jan Beulich wrote: >> >> Actually, with the section set correctly on common symbols using >> S_IS_COMMON here and in the other two places you pointed out shouldn't >> be necessary anymore; S_IS_DEFINED should now take care of this. I'm > >True. This is the final patch. Re-built and re-tested on i686-pc-linux-gnu, x86_64-unknown-linux-gnu, and for a large number of cross targets. Jan gas/ 2005-11-16 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-16 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. --- /home/jbeulich/src/binutils/mainline/2005-11-16/gas/cond.c 2005-10-11 14:31:18.000000000 +0200 +++ 2005-11-16/gas/cond.c 2005-11-16 09:59:11.969665664 +0100 @@ -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); --- /home/jbeulich/src/binutils/mainline/2005-11-16/gas/doc/internals.texi 2005-10-26 14:26:28.000000000 +0200 +++ 2005-11-16/gas/doc/internals.texi 2005-11-10 11:20:47.000000000 +0100 @@ -93,6 +93,12 @@ responsible for setting it when a symbol 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 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 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 --- /home/jbeulich/src/binutils/mainline/2005-11-16/gas/read.c 2005-11-16 08:52:46.000000000 +0100 +++ 2005-11-16/gas/read.c 2005-11-16 10:00:24.869583192 +0100 @@ -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; --- /home/jbeulich/src/binutils/mainline/2005-11-16/gas/symbols.c 2005-11-15 09:30:28.000000000 +0100 +++ 2005-11-16/gas/symbols.c 2005-11-16 09:44:48.856878752 +0100 @@ -333,8 +333,18 @@ colon (/* Just seen "x:" - rattle symbol 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 symbol 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)) --- /home/jbeulich/src/binutils/mainline/2005-11-16/gas/symbols.h 2005-10-26 14:26:28.000000000 +0200 +++ 2005-11-16/gas/symbols.h 2005-11-10 10:53:51.000000000 +0100 @@ -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 --- /home/jbeulich/src/binutils/mainline/2005-11-16/gas/testsuite/gas/all/cond.l 2005-10-11 13:16:17.000000000 +0200 +++ 2005-11-16/gas/testsuite/gas/all/cond.l 2005-11-11 13:44:02.000000000 +0100 @@ -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[ ]* --- /home/jbeulich/src/binutils/mainline/2005-11-16/gas/testsuite/gas/all/cond.s 2005-10-11 14:31:18.000000000 +0200 +++ 2005-11-16/gas/testsuite/gas/all/cond.s 2005-11-11 13:40:54.000000000 +0100 @@ -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 --- /home/jbeulich/src/binutils/mainline/2005-11-16/gas/testsuite/gas/all/gas.exp 2005-11-09 15:40:05.000000000 +0100 +++ 2005-11-16/gas/testsuite/gas/all/gas.exp 2005-11-11 16:22:14.000000000 +0100 @@ -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 --- /home/jbeulich/src/binutils/mainline/2005-11-16/gas/testsuite/gas/all/redef2.d 2005-10-20 17:29:25.000000000 +0200 +++ 2005-11-16/gas/testsuite/gas/all/redef2.d 2005-11-10 17:27:22.000000000 +0100 @@ -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 --- /home/jbeulich/src/binutils/mainline/2005-11-16/gas/testsuite/gas/all/redef2.s 2005-10-20 16:22:58.000000000 +0200 +++ 2005-11-16/gas/testsuite/gas/all/redef2.s 2005-11-10 10:43:48.000000000 +0100 @@ -8,3 +8,5 @@ here: .long sym .set sym, 0x22222222 .long sym +sym: + .long sym --- /home/jbeulich/src/binutils/mainline/2005-11-16/gas/testsuite/gas/all/redef3.d 1970-01-01 01:00:00.000000000 +0100 +++ 2005-11-16/gas/testsuite/gas/all/redef3.d 2005-11-11 09:48:35.000000000 +0100 @@ -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 --- /home/jbeulich/src/binutils/mainline/2005-11-16/gas/testsuite/gas/all/redef3.s 1970-01-01 01:00:00.000000000 +0100 +++ 2005-11-16/gas/testsuite/gas/all/redef3.s 2005-11-10 11:55:40.000000000 +0100 @@ -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 --- /home/jbeulich/src/binutils/mainline/2005-11-16/gas/testsuite/gas/all/redef4.s 1970-01-01 01:00:00.000000000 +0100 +++ 2005-11-16/gas/testsuite/gas/all/redef4.s 2005-11-10 10:44:51.000000000 +0100 @@ -0,0 +1,3 @@ + .data +sym: + .set sym, 0 --- /home/jbeulich/src/binutils/mainline/2005-11-16/gas/testsuite/gas/all/redef5.s 1970-01-01 01:00:00.000000000 +0100 +++ 2005-11-16/gas/testsuite/gas/all/redef5.s 2005-11-10 11:53:00.000000000 +0100 @@ -0,0 +1,2 @@ + .comm sym, 1 + .set sym, 0 --- /home/jbeulich/src/binutils/mainline/2005-11-16/gas/testsuite/gas/elf/redef.d 2005-10-27 11:41:28.000000000 +0200 +++ 2005-11-16/gas/testsuite/gas/elf/redef.d 2005-11-10 11:08:19.000000000 +0100 @@ -1,6 +1,5 @@ #objdump: -t #name: .equ redefinitions (ELF) -#source: ../all/redef2.s .*: .* --- /home/jbeulich/src/binutils/mainline/2005-11-16/gas/testsuite/gas/elf/redef.s 1970-01-01 01:00:00.000000000 +0100 +++ 2005-11-16/gas/testsuite/gas/elf/redef.s 2005-11-10 11:07:10.000000000 +0100 @@ -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
Attachment:
binutils-mainline-equate-4.patch
Description: Text document
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |