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] | |
>>> Khem Raj <kraj@mvista.com> 08.11.05 20:00:47 >>>
>This will cause glibc build failure. I am attaching the preprocessed
>sourcefile from glibc which
>shows this problem. It comes from some equates defined in glibc
>sysdeps/wordsize-32/symbol-hacks.c
This patch eliminates the problem, and addresses several other similar
ones:
- re-defining a re-definable symbol to a persistent one now properly
clears the re-definable state
- .ifdef now also recognizes equates to undefined symbols as well as
common symbols
- definition of weakrefs and commons now properly check whether the
to-be-defined symbol was already defined
- definitions of labels, commons, and weakrefs now properly clone pre-
existing re-definable symbols
Additionally, it adds documentation for previously added fields/
functions.
Built and tested on i686-pc-linux-gnu, x86_64-unknown-linux-gnu,
ia64-unknown-linux-gnu, and for a large number of cross targets.
Jan
gas/
2005-11-14 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 and common symbols.
* read.c (s_comm_internal): Also exclude non-redefinable
equated symbols. Clone redefinable ones before modifying.
(assign_symbol): Also exclude common symbols from
redefinition.
(s_weakref): Likewise. 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-14 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-09/gas/cond.c 2005-10-11
14:31:18.000000000 +0200
+++ 2005-11-09/gas/cond.c 2005-11-11 13:48:42.000000000 +0100
@@ -102,7 +102,9 @@ 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_VALUE (symbolP))
&& S_GET_SEGMENT (symbolP) != reg_section;
cframe.ignoring = ! (test_defined ^ is_defined);
---
/home/jbeulich/src/binutils/mainline/2005-11-09/gas/doc/internals.texi 2005-10-26
14:26:28.000000000 +0200
+++ 2005-11-09/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-09/gas/read.c 2005-11-07
08:48:26.000000000 +0100
+++ 2005-11-09/gas/read.c 2005-11-11 16:32:52.000000000 +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);
@@ -2794,7 +2806,11 @@ assign_symbol (char *name, int mode)
#endif
}
- if (S_IS_DEFINED (symbolP) || symbol_equated_p (symbolP))
+ if (S_IS_DEFINED (symbolP)
+ || symbol_equated_p (symbolP)
+ /* This detects common symbols not put in bfd_com_section,
which
+ S_IS_COMMON doesn't recognize. */
+ || S_GET_VALUE (symbolP))
{
/* Permit register names to be redefined. */
if ((mode != 0 || !S_IS_VOLATILE (symbolP))
@@ -3178,12 +3194,22 @@ s_weakref (int ignore ATTRIBUTE_UNUSED)
symbolP = symbol_find_or_make (name);
- if (S_IS_DEFINED (symbolP) || symbol_equated_p (symbolP))
+ if (S_IS_DEFINED (symbolP)
+ || symbol_equated_p (symbolP)
+ || S_GET_VALUE (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-09/gas/symbols.c 2005-11-07
08:48:26.000000000 +0100
+++ 2005-11-09/gas/symbols.c 2005-11-10 12:18:53.000000000 +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);
+ }
}
}
@@ -2196,6 +2209,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-09/gas/symbols.h 2005-10-26
14:26:28.000000000 +0200
+++ 2005-11-09/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-09/gas/testsuite/gas/all/cond.l 2005-10-11
13:16:17.000000000 +0200
+++ 2005-11-09/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-09/gas/testsuite/gas/all/cond.s 2005-10-11
14:31:18.000000000 +0200
+++ 2005-11-09/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-09/gas/testsuite/gas/all/gas.exp 2005-11-09
15:40:05.000000000 +0100
+++ 2005-11-09/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-09/gas/testsuite/gas/all/redef2.d 2005-10-20
17:29:25.000000000 +0200
+++ 2005-11-09/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-09/gas/testsuite/gas/all/redef2.s 2005-10-20
16:22:58.000000000 +0200
+++ 2005-11-09/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-09/gas/testsuite/gas/all/redef3.d 1970-01-01
01:00:00.000000000 +0100
+++ 2005-11-09/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-09/gas/testsuite/gas/all/redef3.s 1970-01-01
01:00:00.000000000 +0100
+++ 2005-11-09/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-09/gas/testsuite/gas/all/redef4.s 1970-01-01
01:00:00.000000000 +0100
+++ 2005-11-09/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-09/gas/testsuite/gas/all/redef5.s 1970-01-01
01:00:00.000000000 +0100
+++ 2005-11-09/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-09/gas/testsuite/gas/elf/redef.d 2005-10-27
11:41:28.000000000 +0200
+++ 2005-11-09/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-09/gas/testsuite/gas/elf/redef.s 1970-01-01
01:00:00.000000000 +0100
+++ 2005-11-09/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] |