summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
b9c3a42)
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.
+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.
2006-11-12 Mark Shinwell <shinwell@codesourcery.com>
* config/tc-arm.c (do_t_czb): Rename to do_t_cbz.
symbol_lastP = newsymP;
else if (orgsymP->sy_next)
orgsymP->sy_next->sy_previous = newsymP;
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);
}
debug_verify_symchain (symbol_rootP, symbol_lastP);
symbol_table_insert (newsymP);
}
+ else
+ newsymP->sy_previous = newsymP->sy_next = newsymP;
symp->sy_resolving = 0;
goto exit_dont_set_value;
}
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
{
/* If the symbol is an expression symbol, do similarly
as for undefined and common syms above. Handles
return s->sy_value.X_op == O_constant;
}
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 *
/* Return the BFD symbol for a symbol. */
asymbol *
extern int symbol_equated_p (symbolS *);
extern int symbol_equated_reloc_p (symbolS *);
extern int symbol_constant_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 *);
extern asymbol *symbol_get_bfdsym (symbolS *);
extern void symbol_set_bfdsym (symbolS *, asymbol *);
+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
2006-11-10 H.J. Lu <hongjiu.lu@intel.com>
* gas/i386/merom.d: Use "#pass" instead of "#..." to skip the
{ *c54x*-*-* } { }
default {
run_dump_test redef
{ *c54x*-*-* } { }
default {
run_dump_test redef
+ run_dump_test equ-reloc
}
}
run_dump_test "section0"
}
}
run_dump_test "section0"
--- /dev/null
+#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
--- /dev/null
+ .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