From: Jan Beulich Date: Mon, 20 Apr 2026 06:36:54 +0000 (+0200) Subject: gas: don't fail due to local register symbols X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e8086b69f6db02845769fb60895b652e670362f3;p=thirdparty%2Fbinutils-gdb.git gas: don't fail due to local register symbols The diagnostic text as well as its origin are pretty clear: This is about global symbols. This is further supported by S_IS_LOCAL() returning true for symbols in reg_section. Add the missing check, adjusting the testcase that was introduced back at the time (where the sole diagnostic originally issued was therefore wrong, while other diagnostics were missing, but got added thanks to work done elsewhere). Further drop the bogus trailing .equ in another testcase, which were apparently put there to avoid tripping this or some other undue check (albeit no error surfaced there already before the change here). While there also fully eliminate the redundant "sname": There's "name" already, getting set up a little earlier. --- diff --git a/gas/testsuite/gas/i386/equ.s b/gas/testsuite/gas/i386/equ.s index c7c4e604f03..30401ca9c1e 100644 --- a/gas/testsuite/gas/i386/equ.s +++ b/gas/testsuite/gas/i386/equ.s @@ -59,6 +59,3 @@ _start: .if s == x .err .endif - - .equ r, -3 - .equ s, -3 diff --git a/gas/testsuite/gas/i386/inval-equ-2.l b/gas/testsuite/gas/i386/inval-equ-2.l index 839bc8d3523..d4c7f171417 100644 --- a/gas/testsuite/gas/i386/inval-equ-2.l +++ b/gas/testsuite/gas/i386/inval-equ-2.l @@ -18,10 +18,13 @@ GAS LISTING .* [ ]*6[ ]+\.globl bar2 [ ]*7[ ]+\.set bar3,\(%eax\+1\) [ ]*8[ ]+\?\?\?\? A1...... mov bar3,%eax +[ ]*8[ ]+.. +[ ]*9[ ]+\.globl bar4 +[ ]*10[ ]+\.set bar4,\(%eax\+1\) +[ ]*11[ ]+\?\?\?\? 90 nop .* Error: invalid .* relocation against register .* Error: invalid .* relocation against register .* Error: invalid .* relocation against register .* Error: can't make global register symbol `bar1' .* Error: can't make global register symbol `bar2' -.* Error: can't make global register symbol `bar3' -[ ]*8[ ]+.. +.* Error: can't make global register symbol `bar4' diff --git a/gas/testsuite/gas/i386/inval-equ-2.s b/gas/testsuite/gas/i386/inval-equ-2.s index 90caa25df37..afc13eb86e8 100644 --- a/gas/testsuite/gas/i386/inval-equ-2.s +++ b/gas/testsuite/gas/i386/inval-equ-2.s @@ -6,3 +6,6 @@ .globl bar2 .set bar3,(%eax+1) mov bar3,%eax + .globl bar4 + .set bar4,(%eax+1) + nop diff --git a/gas/write.c b/gas/write.c index 9d0777051dd..9bb47857936 100644 --- a/gas/write.c +++ b/gas/write.c @@ -2396,24 +2396,22 @@ write_object_file (void) if (symbol_equated_reloc_p (symp) || S_IS_WEAKREFR (symp)) { - const char *sname = S_GET_NAME (symp); - if (S_IS_COMMON (symp) - && !TC_FAKE_LABEL (sname) + && !TC_FAKE_LABEL (name) && !S_IS_WEAKREFR (symp)) { expressionS *e = symbol_get_value_expression (symp); as_bad (_("`%s' can't be equated to common symbol `%s'"), - sname, S_GET_NAME (e->X_add_symbol)); + name, S_GET_NAME (e->X_add_symbol)); } - if (S_GET_SEGMENT (symp) == reg_section) - { + + if (S_GET_SEGMENT (symp) == reg_section + && S_IS_EXTERNAL (symp) /* Report error only if we know the symbol name. */ - if (S_GET_NAME (symp) != reg_section->name) - as_bad (_("can't make global register symbol `%s'"), - sname); - } + && name != reg_section->name) + as_bad (_("can't make global register symbol `%s'"), name); + symbol_remove (symp, &symbol_rootP, &symbol_lastP); continue; }