2006-11-15  Jan Beulich  <jbeulich@novell.com>

	PR/3469
	* symbols.c (symbol_clone): Mark symbol ending up not on symbol
	chain by linking it to itself.
	(resolve_symbol_value): Also check symbol_shadow_p().
	(symbol_shadow_p): New.
	* symbols.h (symbol_shadow_p): Declare.

gas/testsuite/
2006-11-15  Jan Beulich  <jbeulich@novell.com>

	* gas/elf/equ-reloc.[sd]: New.
	* gas/elf/elf.exp: Run new test.
This commit is contained in:
Jan Beulich 2006-11-15 15:59:26 +00:00
parent b9c3a42a93
commit bdf128d65b
7 changed files with 62 additions and 3 deletions

View File

@ -1,3 +1,12 @@
2006-11-15 Jan Beulich <jbeulich@novell.com>
PR/3469
* symbols.c (symbol_clone): Mark symbol ending up not on symbol
chain by linking it to itself.
(resolve_symbol_value): Also check symbol_shadow_p().
(symbol_shadow_p): New.
* symbols.h (symbol_shadow_p): Declare.
2006-11-12 Mark Shinwell <shinwell@codesourcery.com>
* config/tc-arm.c (do_t_czb): Rename to do_t_cbz.

View File

@ -598,11 +598,13 @@ symbol_clone (symbolS *orgsymP, int replace)
symbol_lastP = newsymP;
else if (orgsymP->sy_next)
orgsymP->sy_next->sy_previous = newsymP;
orgsymP->sy_next = NULL;
orgsymP->sy_previous = orgsymP->sy_next = orgsymP;
debug_verify_symchain (symbol_rootP, symbol_lastP);
symbol_table_insert (newsymP);
}
else
newsymP->sy_previous = newsymP->sy_next = newsymP;
return newsymP;
}
@ -1078,8 +1080,9 @@ resolve_symbol_value (symbolS *symp)
symp->sy_resolving = 0;
goto exit_dont_set_value;
}
else if (finalize_syms && final_seg == expr_section
&& seg_left != expr_section)
else if (finalize_syms &&
((final_seg == expr_section && seg_left != expr_section) ||
symbol_shadow_p (symp)))
{
/* If the symbol is an expression symbol, do similarly
as for undefined and common syms above. Handles
@ -2492,6 +2495,17 @@ symbol_constant_p (symbolS *s)
return s->sy_value.X_op == O_constant;
}
/* Return whether a symbol was cloned and thus removed from the global
symbol list. */
int
symbol_shadow_p (symbolS *s)
{
if (LOCAL_SYMBOL_CHECK (s))
return 0;
return s->sy_next == s;
}
/* Return the BFD symbol for a symbol. */
asymbol *

View File

@ -192,6 +192,7 @@ extern int symbol_section_p (symbolS *);
extern int symbol_equated_p (symbolS *);
extern int symbol_equated_reloc_p (symbolS *);
extern int symbol_constant_p (symbolS *);
extern int symbol_shadow_p (symbolS *);
extern asymbol *symbol_get_bfdsym (symbolS *);
extern void symbol_set_bfdsym (symbolS *, asymbol *);

View File

@ -1,3 +1,8 @@
2006-11-15 Jan Beulich <jbeulich@novell.com>
* gas/elf/equ-reloc.[sd]: New.
* gas/elf/elf.exp: Run new test.
2006-11-10 H.J. Lu <hongjiu.lu@intel.com>
* gas/i386/merom.d: Use "#pass" instead of "#..." to skip the

View File

@ -72,6 +72,7 @@ if { ([istarget "*-*-*elf*"]
{ *c54x*-*-* } { }
default {
run_dump_test redef
run_dump_test equ-reloc
}
}
run_dump_test "section0"

View File

@ -0,0 +1,13 @@
#objdump: -rsj .data
#name: elf equate relocs
.*: +file format .*
RELOCATION RECORDS FOR \[.*\]:
OFFSET *TYPE *VALUE
0*0 [^ ]+ +(\.bss(\+0x0*4)?|y1)
0*4 [^ ]+ +(\.bss(\+0x0*8)?|y2)
#...
Contents of section .data:
0000 0[04]00000[04] 0[08]00000[08].*
#pass

View File

@ -0,0 +1,16 @@
.data
.long x1, x2
.global x1, x2, z2
.set x1, y1
.set x2, y2
.set x2, z2
.section .bss, "aw", %nobits
x1:
.zero 4
y1:
.zero 4
y2:
.zero 4