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.
This commit is contained in:
parent
2be701a30f
commit
92757bc916
@ -1,3 +1,18 @@
|
||||
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.
|
||||
|
||||
2005-11-16 Alan Modra <amodra@bigpond.net.au>
|
||||
|
||||
* config/tc-hppa.c (pa_comm): Set bfd_com_section segment.
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
|
40
gas/read.c
40
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;
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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
|
||||
|
@ -1,3 +1,19 @@
|
||||
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.
|
||||
|
||||
2005-11-16 Richard Henderson <rth@redhat.com>
|
||||
|
||||
* gas/all/weakref1.s: Use "=" instead of ".set" for equivalence.
|
||||
|
@ -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[ ]*
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -8,3 +8,5 @@ here:
|
||||
.long sym
|
||||
.set sym, 0x22222222
|
||||
.long sym
|
||||
sym:
|
||||
.long sym
|
||||
|
15
gas/testsuite/gas/all/redef3.d
Normal file
15
gas/testsuite/gas/all/redef3.d
Normal file
@ -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
|
12
gas/testsuite/gas/all/redef3.s
Normal file
12
gas/testsuite/gas/all/redef3.s
Normal file
@ -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
|
3
gas/testsuite/gas/all/redef4.s
Normal file
3
gas/testsuite/gas/all/redef4.s
Normal file
@ -0,0 +1,3 @@
|
||||
.data
|
||||
sym:
|
||||
.set sym, 0
|
2
gas/testsuite/gas/all/redef5.s
Normal file
2
gas/testsuite/gas/all/redef5.s
Normal file
@ -0,0 +1,2 @@
|
||||
.comm sym, 1
|
||||
.set sym, 0
|
@ -1,6 +1,5 @@
|
||||
#objdump: -t
|
||||
#name: .equ redefinitions (ELF)
|
||||
#source: ../all/redef2.s
|
||||
|
||||
.*: .*
|
||||
|
||||
|
10
gas/testsuite/gas/elf/redef.s
Normal file
10
gas/testsuite/gas/elf/redef.s
Normal file
@ -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
|
Loading…
Reference in New Issue
Block a user