From 60938e80e69ba5182cdd924b757d783c43637104 Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Tue, 26 Apr 2005 17:15:22 +0000 Subject: [PATCH] gas/ 2005-04-26 H.J. Lu * config/obj-multi.h (FAKE_LABEL_NAME): Defined. * read.c (pseudo_set): Disallow symbol set to common symbol. PR 857 * write.c (write_object_file): Report common symbol name when disallowing local symbol set to common symbol. (adjust_reloc_syms): Disallow local symbol set to undefined symbol. gas/testsuite/ 2005-04-26 H.J. Lu * gas/all/assign.s: Make `x' and `y' global. --- gas/ChangeLog | 12 ++++++++++++ gas/config/obj-multi.h | 2 ++ gas/read.c | 4 ++++ gas/testsuite/ChangeLog | 4 ++++ gas/testsuite/gas/all/assign.s | 2 ++ gas/write.c | 26 ++++++++++++++++++++------ 6 files changed, 44 insertions(+), 6 deletions(-) diff --git a/gas/ChangeLog b/gas/ChangeLog index 3f06e7a6c46..28cf35e7a8c 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,15 @@ +2005-04-26 H.J. Lu + + * config/obj-multi.h (FAKE_LABEL_NAME): Defined. + + * read.c (pseudo_set): Disallow symbol set to common symbol. + + PR 857 + * write.c (write_object_file): Report common symbol name when + disallowing local symbol set to common symbol. + (adjust_reloc_syms): Disallow local symbol set to undefined + symbol. + 2005-04-25 Jan Beulich * macro.c (macro_expand_body): Replace locals indicator parameters diff --git a/gas/config/obj-multi.h b/gas/config/obj-multi.h index 0e1190b87e5..2cca674e15b 100644 --- a/gas/config/obj-multi.h +++ b/gas/config/obj-multi.h @@ -146,6 +146,8 @@ #define EMIT_SECTION_SYMBOLS (this_format->emit_section_symbols) +#define FAKE_LABEL_NAME (this_emulation->fake_label_name) + #ifdef OBJ_MAYBE_ELF /* We need OBJ_SYMFIELD_TYPE so that symbol_get_obj is defined in symbol.c We also need various STAB defines for stab.c */ diff --git a/gas/read.c b/gas/read.c index b83f14017f5..54ac8448637 100644 --- a/gas/read.c +++ b/gas/read.c @@ -3301,6 +3301,10 @@ pseudo_set (symbolS *symbolP) { symbolS *s = exp.X_add_symbol; + if (S_IS_COMMON (s)) + as_bad (_("`%s' can't be equated to common symbol '%s'"), + S_GET_NAME (symbolP), S_GET_NAME (s)); + S_SET_SEGMENT (symbolP, seg); S_SET_VALUE (symbolP, exp.X_add_number + S_GET_VALUE (s)); symbol_set_frag (symbolP, symbol_get_frag (s)); diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog index 887cd03efc7..2504e0cad4e 100644 --- a/gas/testsuite/ChangeLog +++ b/gas/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2005-04-26 H.J. Lu + + * gas/all/assign.s: Make `x' and `y' global. + 2005-04-25 Jan Beulich * gas/macros/badarg.s: Add tests for collisions between/among macro diff --git a/gas/testsuite/gas/all/assign.s b/gas/testsuite/gas/all/assign.s index 1a414066f69..5f94392dc9a 100644 --- a/gas/testsuite/gas/all/assign.s +++ b/gas/testsuite/gas/all/assign.s @@ -1,7 +1,9 @@ + .global x x = zzz x = x+1 .long x + .global y y = 1 y = y+zzz .long y diff --git a/gas/write.c b/gas/write.c index e154cda4277..417e0e971ea 100644 --- a/gas/write.c +++ b/gas/write.c @@ -787,12 +787,20 @@ adjust_reloc_syms (bfd *abfd ATTRIBUTE_UNUSED, if (fixp->fx_subsy != NULL) resolve_symbol_value (fixp->fx_subsy); - /* If this symbol is equated to an undefined symbol, convert - the fixup to being against that symbol. */ + /* If this symbol is equated to an undefined or common symbol, + convert the fixup to being against that symbol. */ if (symbol_equated_reloc_p (sym)) { + symbolS *new_sym + = symbol_get_value_expression (sym)->X_add_symbol; + const char *name = S_GET_NAME (sym); + if (!S_IS_COMMON (new_sym) + && strcmp (name, FAKE_LABEL_NAME) + && (!S_IS_EXTERNAL (sym) || S_IS_LOCAL (sym))) + as_bad (_("Local symbol `%s' can't be equated to undefined symbol `%s'"), + name, S_GET_NAME (new_sym)); fixp->fx_offset += symbol_get_value_expression (sym)->X_add_number; - sym = symbol_get_value_expression (sym)->X_add_symbol; + sym = new_sym; fixp->fx_addsy = sym; } @@ -1927,9 +1935,15 @@ write_object_file (void) symbols. */ if (symbol_equated_reloc_p (symp)) { - if (S_IS_COMMON (symp)) - as_bad (_("`%s' can't be equated to common symbol"), - S_GET_NAME (symp)); + const char *name = S_GET_NAME (symp); + if (S_IS_COMMON (symp) + && strcmp (name, FAKE_LABEL_NAME) + && (!S_IS_EXTERNAL (symp) || S_IS_LOCAL (symp))) + { + expressionS *e = symbol_get_value_expression (symp); + as_bad (_("Local symbol `%s' can't be equated to common symbol `%s'"), + name, S_GET_NAME (e->X_add_symbol)); + } symbol_remove (symp, &symbol_rootP, &symbol_lastP); continue; } -- 2.30.2