« Return to Thread: RE: PR 6848: Not all targets generate relocs against kept symbols.

Re: PR gas/5543 broke mmix: "can't equate global symbol foo with register name"

by H.J. Lu-30 :: Rate this Message:

Reply to Author | View in Thread

On Sat, Oct 04, 2008 at 08:41:29PM -0400, Hans-Peter Nilsson wrote:

> I see:
> Running /home/hp/binutils/src/ld/testsuite/ld-mmix/mmix.exp ...
> ...
> FAIL: ld-mmix/bpo-13
> FAIL: ld-mmix/bpo-13m
> FAIL: ld-mmix/local1
> FAIL: ld-mmix/local1m
> FAIL: ld-mmix/local2
> FAIL: ld-mmix/local2m
> FAIL: ld-mmix/local5
> FAIL: ld-mmix/local5m
> FAIL: ld-mmix/reg-1
> FAIL: ld-mmix/reg-1m
>
> where entries in ld.log say e.g.:
> binutils/src/ld/testsuite/ld-mmix/areg-256.s:2: Error: can't equate global symbol `areg' with register name
>
> This used to work.  cvs ann read.c shows you added the error
> message above around March 3 to fix PR gas/5543.  Please fix the fix.
>

MMIX has

/* Symbol attributes.  */
/* A symbol with this section-index is a register.  */
#define SHN_REGISTER SHN_LOPROC

This patch allows global register symbol if GLOBAL_REGISTER_SYMBOL_OK
is defined.  OK to install?

Thanks.


H.J.
----
2008-10-05  H.J. Lu  <hongjiu.lu@...>

        * read.c (pseudo_set): Don't allow global register symbol only
        if GLOBAL_REGISTER_SYMBOL_OK is undefined.
        * symbols.c (S_SET_EXTERNAL): Likewise.

        * config/tc-mmix.h (GLOBAL_REGISTER_SYMBOL_OK): Defined.

--- gas/config/tc-mmix.h.reg 2007-07-03 06:45:21.000000000 -0700
+++ gas/config/tc-mmix.h 2008-10-05 12:26:54.000000000 -0700
@@ -224,3 +224,6 @@ extern void mmix_md_do_align (int, char
 
 /* This target is buggy, and sets fix size too large.  */
 #define TC_FX_SIZE_SLACK(FIX) 6
+
+/* MMIX has global register symbols.  */
+#define GLOBAL_REGISTER_SYMBOL_OK
--- gas/read.c.reg 2008-10-05 11:10:28.000000000 -0700
+++ gas/read.c 2008-10-05 12:26:40.000000000 -0700
@@ -3604,12 +3604,14 @@ pseudo_set (symbolS *symbolP)
       break;
 
     case O_register:
+#ifndef GLOBAL_REGISTER_SYMBOL_OK
       if (S_IS_EXTERNAL (symbolP))
  {
   as_bad ("can't equate global symbol `%s' with register name",
   S_GET_NAME (symbolP));
   return;
  }
+#endif
       S_SET_SEGMENT (symbolP, reg_section);
       S_SET_VALUE (symbolP, (valueT) exp.X_add_number);
       set_zero_frag (symbolP);
--- gas/symbols.c.reg 2008-03-03 07:29:13.000000000 -0800
+++ gas/symbols.c 2008-10-05 12:26:45.000000000 -0700
@@ -2184,12 +2184,14 @@ S_SET_EXTERNAL (symbolS *s)
      _("section symbols are already global"));
       return;
     }
+#ifndef GLOBAL_REGISTER_SYMBOL_OK
   if (S_GET_SEGMENT (s) == reg_section)
     {
       as_bad ("can't make register symbol `%s' global",
       S_GET_NAME (s));
       return;
     }
+#endif
   s->bsym->flags |= BSF_GLOBAL;
   s->bsym->flags &= ~(BSF_LOCAL | BSF_WEAK);
 

 « Return to Thread: RE: PR 6848: Not all targets generate relocs against kept symbols.