Home | History | Annotate | Line # | Download | only in gas
symbols.c revision 1.1
      1  1.1  skrll /* symbols.c -symbol table-
      2  1.1  skrll    Copyright 1987, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
      3  1.1  skrll    1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
      4  1.1  skrll    Free Software Foundation, Inc.
      5  1.1  skrll 
      6  1.1  skrll    This file is part of GAS, the GNU Assembler.
      7  1.1  skrll 
      8  1.1  skrll    GAS is free software; you can redistribute it and/or modify
      9  1.1  skrll    it under the terms of the GNU General Public License as published by
     10  1.1  skrll    the Free Software Foundation; either version 3, or (at your option)
     11  1.1  skrll    any later version.
     12  1.1  skrll 
     13  1.1  skrll    GAS is distributed in the hope that it will be useful,
     14  1.1  skrll    but WITHOUT ANY WARRANTY; without even the implied warranty of
     15  1.1  skrll    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     16  1.1  skrll    GNU General Public License for more details.
     17  1.1  skrll 
     18  1.1  skrll    You should have received a copy of the GNU General Public License
     19  1.1  skrll    along with GAS; see the file COPYING.  If not, write to the Free
     20  1.1  skrll    Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
     21  1.1  skrll    02110-1301, USA.  */
     22  1.1  skrll 
     23  1.1  skrll /* #define DEBUG_SYMS / * to debug symbol list maintenance.  */
     24  1.1  skrll 
     25  1.1  skrll #include "as.h"
     26  1.1  skrll 
     27  1.1  skrll #include "safe-ctype.h"
     28  1.1  skrll #include "obstack.h"		/* For "symbols.h" */
     29  1.1  skrll #include "subsegs.h"
     30  1.1  skrll 
     31  1.1  skrll #include "struc-symbol.h"
     32  1.1  skrll 
     33  1.1  skrll /* This is non-zero if symbols are case sensitive, which is the
     34  1.1  skrll    default.  */
     35  1.1  skrll int symbols_case_sensitive = 1;
     36  1.1  skrll 
     37  1.1  skrll #ifndef WORKING_DOT_WORD
     38  1.1  skrll extern int new_broken_words;
     39  1.1  skrll #endif
     40  1.1  skrll 
     41  1.1  skrll /* symbol-name => struct symbol pointer */
     42  1.1  skrll static struct hash_control *sy_hash;
     43  1.1  skrll 
     44  1.1  skrll /* Table of local symbols.  */
     45  1.1  skrll static struct hash_control *local_hash;
     46  1.1  skrll 
     47  1.1  skrll /* Below are commented in "symbols.h".  */
     48  1.1  skrll symbolS *symbol_rootP;
     49  1.1  skrll symbolS *symbol_lastP;
     50  1.1  skrll symbolS abs_symbol;
     51  1.1  skrll 
     52  1.1  skrll #ifdef DEBUG_SYMS
     53  1.1  skrll #define debug_verify_symchain verify_symbol_chain
     54  1.1  skrll #else
     55  1.1  skrll #define debug_verify_symchain(root, last) ((void) 0)
     56  1.1  skrll #endif
     57  1.1  skrll 
     58  1.1  skrll #define DOLLAR_LABEL_CHAR	'\001'
     59  1.1  skrll #define LOCAL_LABEL_CHAR	'\002'
     60  1.1  skrll 
     61  1.1  skrll struct obstack notes;
     62  1.1  skrll #ifdef USE_UNIQUE
     63  1.1  skrll /* The name of an external symbol which is
     64  1.1  skrll    used to make weak PE symbol names unique.  */
     65  1.1  skrll const char * an_external_name;
     66  1.1  skrll #endif
     67  1.1  skrll 
     68  1.1  skrll static char *save_symbol_name (const char *);
     69  1.1  skrll static void fb_label_init (void);
     70  1.1  skrll static long dollar_label_instance (long);
     71  1.1  skrll static long fb_label_instance (long);
     72  1.1  skrll 
     73  1.1  skrll static void print_binary (FILE *, const char *, expressionS *);
     74  1.1  skrll static void report_op_error (symbolS *, symbolS *, symbolS *);
     75  1.1  skrll 
     76  1.1  skrll /* Return a pointer to a new symbol.  Die if we can't make a new
     77  1.1  skrll    symbol.  Fill in the symbol's values.  Add symbol to end of symbol
     78  1.1  skrll    chain.
     79  1.1  skrll 
     80  1.1  skrll    This function should be called in the general case of creating a
     81  1.1  skrll    symbol.  However, if the output file symbol table has already been
     82  1.1  skrll    set, and you are certain that this symbol won't be wanted in the
     83  1.1  skrll    output file, you can call symbol_create.  */
     84  1.1  skrll 
     85  1.1  skrll symbolS *
     86  1.1  skrll symbol_new (const char *name, segT segment, valueT valu, fragS *frag)
     87  1.1  skrll {
     88  1.1  skrll   symbolS *symbolP = symbol_create (name, segment, valu, frag);
     89  1.1  skrll 
     90  1.1  skrll   /* Link to end of symbol chain.  */
     91  1.1  skrll   {
     92  1.1  skrll     extern int symbol_table_frozen;
     93  1.1  skrll     if (symbol_table_frozen)
     94  1.1  skrll       abort ();
     95  1.1  skrll   }
     96  1.1  skrll   symbol_append (symbolP, symbol_lastP, &symbol_rootP, &symbol_lastP);
     97  1.1  skrll 
     98  1.1  skrll   return symbolP;
     99  1.1  skrll }
    100  1.1  skrll 
    101  1.1  skrll /* Save a symbol name on a permanent obstack, and convert it according
    102  1.1  skrll    to the object file format.  */
    103  1.1  skrll 
    104  1.1  skrll static char *
    105  1.1  skrll save_symbol_name (const char *name)
    106  1.1  skrll {
    107  1.1  skrll   unsigned int name_length;
    108  1.1  skrll   char *ret;
    109  1.1  skrll 
    110  1.1  skrll   name_length = strlen (name) + 1;	/* +1 for \0.  */
    111  1.1  skrll   obstack_grow (&notes, name, name_length);
    112  1.1  skrll   ret = obstack_finish (&notes);
    113  1.1  skrll 
    114  1.1  skrll #ifdef tc_canonicalize_symbol_name
    115  1.1  skrll   ret = tc_canonicalize_symbol_name (ret);
    116  1.1  skrll #endif
    117  1.1  skrll 
    118  1.1  skrll   if (! symbols_case_sensitive)
    119  1.1  skrll     {
    120  1.1  skrll       char *s;
    121  1.1  skrll 
    122  1.1  skrll       for (s = ret; *s != '\0'; s++)
    123  1.1  skrll 	*s = TOUPPER (*s);
    124  1.1  skrll     }
    125  1.1  skrll 
    126  1.1  skrll   return ret;
    127  1.1  skrll }
    128  1.1  skrll 
    129  1.1  skrll symbolS *
    130  1.1  skrll symbol_create (const char *name, /* It is copied, the caller can destroy/modify.  */
    131  1.1  skrll 	       segT segment,	/* Segment identifier (SEG_<something>).  */
    132  1.1  skrll 	       valueT valu,	/* Symbol value.  */
    133  1.1  skrll 	       fragS *frag	/* Associated fragment.  */)
    134  1.1  skrll {
    135  1.1  skrll   char *preserved_copy_of_name;
    136  1.1  skrll   symbolS *symbolP;
    137  1.1  skrll 
    138  1.1  skrll   preserved_copy_of_name = save_symbol_name (name);
    139  1.1  skrll 
    140  1.1  skrll   symbolP = (symbolS *) obstack_alloc (&notes, sizeof (symbolS));
    141  1.1  skrll 
    142  1.1  skrll   /* symbol must be born in some fixed state.  This seems as good as any.  */
    143  1.1  skrll   memset (symbolP, 0, sizeof (symbolS));
    144  1.1  skrll 
    145  1.1  skrll   symbolP->bsym = bfd_make_empty_symbol (stdoutput);
    146  1.1  skrll   if (symbolP->bsym == NULL)
    147  1.1  skrll     as_fatal ("bfd_make_empty_symbol: %s", bfd_errmsg (bfd_get_error ()));
    148  1.1  skrll   S_SET_NAME (symbolP, preserved_copy_of_name);
    149  1.1  skrll 
    150  1.1  skrll   S_SET_SEGMENT (symbolP, segment);
    151  1.1  skrll   S_SET_VALUE (symbolP, valu);
    152  1.1  skrll   symbol_clear_list_pointers (symbolP);
    153  1.1  skrll 
    154  1.1  skrll   symbolP->sy_frag = frag;
    155  1.1  skrll 
    156  1.1  skrll   obj_symbol_new_hook (symbolP);
    157  1.1  skrll 
    158  1.1  skrll #ifdef tc_symbol_new_hook
    159  1.1  skrll   tc_symbol_new_hook (symbolP);
    160  1.1  skrll #endif
    161  1.1  skrll 
    162  1.1  skrll   return symbolP;
    163  1.1  skrll }
    164  1.1  skrll 
    165  1.1  skrll 
    167  1.1  skrll /* Local symbol support.  If we can get away with it, we keep only a
    168  1.1  skrll    small amount of information for local symbols.  */
    169  1.1  skrll 
    170  1.1  skrll static symbolS *local_symbol_convert (struct local_symbol *);
    171  1.1  skrll 
    172  1.1  skrll /* Used for statistics.  */
    173  1.1  skrll 
    174  1.1  skrll static unsigned long local_symbol_count;
    175  1.1  skrll static unsigned long local_symbol_conversion_count;
    176  1.1  skrll 
    177  1.1  skrll /* This macro is called with a symbol argument passed by reference.
    178  1.1  skrll    It returns whether this is a local symbol.  If necessary, it
    179  1.1  skrll    changes its argument to the real symbol.  */
    180  1.1  skrll 
    181  1.1  skrll #define LOCAL_SYMBOL_CHECK(s)						\
    182  1.1  skrll   (s->bsym == NULL							\
    183  1.1  skrll    ? (local_symbol_converted_p ((struct local_symbol *) s)		\
    184  1.1  skrll       ? (s = local_symbol_get_real_symbol ((struct local_symbol *) s),	\
    185  1.1  skrll 	 0)								\
    186  1.1  skrll       : 1)								\
    187  1.1  skrll    : 0)
    188  1.1  skrll 
    189  1.1  skrll /* Create a local symbol and insert it into the local hash table.  */
    190  1.1  skrll 
    191  1.1  skrll static struct local_symbol *
    192  1.1  skrll local_symbol_make (const char *name, segT section, valueT value, fragS *frag)
    193  1.1  skrll {
    194  1.1  skrll   char *name_copy;
    195  1.1  skrll   struct local_symbol *ret;
    196  1.1  skrll 
    197  1.1  skrll   ++local_symbol_count;
    198  1.1  skrll 
    199  1.1  skrll   name_copy = save_symbol_name (name);
    200  1.1  skrll 
    201  1.1  skrll   ret = (struct local_symbol *) obstack_alloc (&notes, sizeof *ret);
    202  1.1  skrll   ret->lsy_marker = NULL;
    203  1.1  skrll   ret->lsy_name = name_copy;
    204  1.1  skrll   ret->lsy_section = section;
    205  1.1  skrll   local_symbol_set_frag (ret, frag);
    206  1.1  skrll   ret->lsy_value = value;
    207  1.1  skrll 
    208  1.1  skrll   hash_jam (local_hash, name_copy, (void *) ret);
    209  1.1  skrll 
    210  1.1  skrll   return ret;
    211  1.1  skrll }
    212  1.1  skrll 
    213  1.1  skrll /* Convert a local symbol into a real symbol.  Note that we do not
    214  1.1  skrll    reclaim the space used by the local symbol.  */
    215  1.1  skrll 
    216  1.1  skrll static symbolS *
    217  1.1  skrll local_symbol_convert (struct local_symbol *locsym)
    218  1.1  skrll {
    219  1.1  skrll   symbolS *ret;
    220  1.1  skrll 
    221  1.1  skrll   assert (locsym->lsy_marker == NULL);
    222  1.1  skrll   if (local_symbol_converted_p (locsym))
    223  1.1  skrll     return local_symbol_get_real_symbol (locsym);
    224  1.1  skrll 
    225  1.1  skrll   ++local_symbol_conversion_count;
    226  1.1  skrll 
    227  1.1  skrll   ret = symbol_new (locsym->lsy_name, locsym->lsy_section, locsym->lsy_value,
    228  1.1  skrll 		    local_symbol_get_frag (locsym));
    229  1.1  skrll 
    230  1.1  skrll   if (local_symbol_resolved_p (locsym))
    231  1.1  skrll     ret->sy_resolved = 1;
    232  1.1  skrll 
    233  1.1  skrll   /* Local symbols are always either defined or used.  */
    234  1.1  skrll   ret->sy_used = 1;
    235  1.1  skrll 
    236  1.1  skrll #ifdef TC_LOCAL_SYMFIELD_CONVERT
    237  1.1  skrll   TC_LOCAL_SYMFIELD_CONVERT (locsym, ret);
    238  1.1  skrll #endif
    239  1.1  skrll 
    240  1.1  skrll   symbol_table_insert (ret);
    241  1.1  skrll 
    242  1.1  skrll   local_symbol_mark_converted (locsym);
    243  1.1  skrll   local_symbol_set_real_symbol (locsym, ret);
    244  1.1  skrll 
    245  1.1  skrll   hash_jam (local_hash, locsym->lsy_name, NULL);
    246  1.1  skrll 
    247  1.1  skrll   return ret;
    248  1.1  skrll }
    249  1.1  skrll 
    250  1.1  skrll /* We have just seen "<name>:".
    252  1.1  skrll    Creates a struct symbol unless it already exists.
    253  1.1  skrll 
    254  1.1  skrll    Gripes if we are redefining a symbol incompatibly (and ignores it).  */
    255  1.1  skrll 
    256  1.1  skrll symbolS *
    257  1.1  skrll colon (/* Just seen "x:" - rattle symbols & frags.  */
    258  1.1  skrll        const char *sym_name	/* Symbol name, as a cannonical string.  */
    259  1.1  skrll        /* We copy this string: OK to alter later.  */)
    260  1.1  skrll {
    261  1.1  skrll   register symbolS *symbolP;	/* Symbol we are working with.  */
    262  1.1  skrll 
    263  1.1  skrll   /* Sun local labels go out of scope whenever a non-local symbol is
    264  1.1  skrll      defined.  */
    265  1.1  skrll   if (LOCAL_LABELS_DOLLAR
    266  1.1  skrll       && !bfd_is_local_label_name (stdoutput, sym_name))
    267  1.1  skrll     dollar_label_clear ();
    268  1.1  skrll 
    269  1.1  skrll #ifndef WORKING_DOT_WORD
    270  1.1  skrll   if (new_broken_words)
    271  1.1  skrll     {
    272  1.1  skrll       struct broken_word *a;
    273  1.1  skrll       int possible_bytes;
    274  1.1  skrll       fragS *frag_tmp;
    275  1.1  skrll       char *frag_opcode;
    276  1.1  skrll 
    277  1.1  skrll       if (now_seg == absolute_section)
    278  1.1  skrll 	{
    279  1.1  skrll 	  as_bad (_("cannot define symbol `%s' in absolute section"), sym_name);
    280  1.1  skrll 	  return NULL;
    281  1.1  skrll 	}
    282  1.1  skrll 
    283  1.1  skrll       possible_bytes = (md_short_jump_size
    284  1.1  skrll 			+ new_broken_words * md_long_jump_size);
    285  1.1  skrll 
    286  1.1  skrll       frag_tmp = frag_now;
    287  1.1  skrll       frag_opcode = frag_var (rs_broken_word,
    288  1.1  skrll 			      possible_bytes,
    289  1.1  skrll 			      possible_bytes,
    290  1.1  skrll 			      (relax_substateT) 0,
    291  1.1  skrll 			      (symbolS *) broken_words,
    292  1.1  skrll 			      (offsetT) 0,
    293  1.1  skrll 			      NULL);
    294  1.1  skrll 
    295  1.1  skrll       /* We want to store the pointer to where to insert the jump
    296  1.1  skrll 	 table in the fr_opcode of the rs_broken_word frag.  This
    297  1.1  skrll 	 requires a little hackery.  */
    298  1.1  skrll       while (frag_tmp
    299  1.1  skrll 	     && (frag_tmp->fr_type != rs_broken_word
    300  1.1  skrll 		 || frag_tmp->fr_opcode))
    301  1.1  skrll 	frag_tmp = frag_tmp->fr_next;
    302  1.1  skrll       know (frag_tmp);
    303  1.1  skrll       frag_tmp->fr_opcode = frag_opcode;
    304  1.1  skrll       new_broken_words = 0;
    305  1.1  skrll 
    306  1.1  skrll       for (a = broken_words; a && a->dispfrag == 0; a = a->next_broken_word)
    307  1.1  skrll 	a->dispfrag = frag_tmp;
    308  1.1  skrll     }
    309  1.1  skrll #endif /* WORKING_DOT_WORD */
    310  1.1  skrll 
    311  1.1  skrll   if ((symbolP = symbol_find (sym_name)) != 0)
    312  1.1  skrll     {
    313  1.1  skrll       S_CLEAR_WEAKREFR (symbolP);
    314  1.1  skrll #ifdef RESOLVE_SYMBOL_REDEFINITION
    315  1.1  skrll       if (RESOLVE_SYMBOL_REDEFINITION (symbolP))
    316  1.1  skrll 	return symbolP;
    317  1.1  skrll #endif
    318  1.1  skrll       /* Now check for undefined symbols.  */
    319  1.1  skrll       if (LOCAL_SYMBOL_CHECK (symbolP))
    320  1.1  skrll 	{
    321  1.1  skrll 	  struct local_symbol *locsym = (struct local_symbol *) symbolP;
    322  1.1  skrll 
    323  1.1  skrll 	  if (locsym->lsy_section != undefined_section
    324  1.1  skrll 	      && (local_symbol_get_frag (locsym) != frag_now
    325  1.1  skrll 		  || locsym->lsy_section != now_seg
    326  1.1  skrll 		  || locsym->lsy_value != frag_now_fix ()))
    327  1.1  skrll 	    {
    328  1.1  skrll 	      as_bad (_("symbol `%s' is already defined"), sym_name);
    329  1.1  skrll 	      return symbolP;
    330  1.1  skrll 	    }
    331  1.1  skrll 
    332  1.1  skrll 	  locsym->lsy_section = now_seg;
    333  1.1  skrll 	  local_symbol_set_frag (locsym, frag_now);
    334  1.1  skrll 	  locsym->lsy_value = frag_now_fix ();
    335  1.1  skrll 	}
    336  1.1  skrll       else if (!(S_IS_DEFINED (symbolP) || symbol_equated_p (symbolP))
    337  1.1  skrll 	       || S_IS_COMMON (symbolP)
    338  1.1  skrll 	       || S_IS_VOLATILE (symbolP))
    339  1.1  skrll 	{
    340  1.1  skrll 	  if (S_IS_VOLATILE (symbolP))
    341  1.1  skrll 	    {
    342  1.1  skrll 	      symbolP = symbol_clone (symbolP, 1);
    343  1.1  skrll 	      S_SET_VALUE (symbolP, 0);
    344  1.1  skrll 	      S_CLEAR_VOLATILE (symbolP);
    345  1.1  skrll 	    }
    346  1.1  skrll 	  if (S_GET_VALUE (symbolP) == 0)
    347  1.1  skrll 	    {
    348  1.1  skrll 	      symbolP->sy_frag = frag_now;
    349  1.1  skrll #ifdef OBJ_VMS
    350  1.1  skrll 	      S_SET_OTHER (symbolP, const_flag);
    351  1.1  skrll #endif
    352  1.1  skrll 	      S_SET_VALUE (symbolP, (valueT) frag_now_fix ());
    353  1.1  skrll 	      S_SET_SEGMENT (symbolP, now_seg);
    354  1.1  skrll #ifdef N_UNDF
    355  1.1  skrll 	      know (N_UNDF == 0);
    356  1.1  skrll #endif /* if we have one, it better be zero.  */
    357  1.1  skrll 
    358  1.1  skrll 	    }
    359  1.1  skrll 	  else
    360  1.1  skrll 	    {
    361  1.1  skrll 	      /* There are still several cases to check:
    362  1.1  skrll 
    363  1.1  skrll 		 A .comm/.lcomm symbol being redefined as initialized
    364  1.1  skrll 		 data is OK
    365  1.1  skrll 
    366  1.1  skrll 		 A .comm/.lcomm symbol being redefined with a larger
    367  1.1  skrll 		 size is also OK
    368  1.1  skrll 
    369  1.1  skrll 		 This only used to be allowed on VMS gas, but Sun cc
    370  1.1  skrll 		 on the sparc also depends on it.  */
    371  1.1  skrll 
    372  1.1  skrll 	      if (((!S_IS_DEBUG (symbolP)
    373  1.1  skrll 		    && (!S_IS_DEFINED (symbolP) || S_IS_COMMON (symbolP))
    374  1.1  skrll 		    && S_IS_EXTERNAL (symbolP))
    375  1.1  skrll 		   || S_GET_SEGMENT (symbolP) == bss_section)
    376  1.1  skrll 		  && (now_seg == data_section
    377  1.1  skrll 		      || now_seg == bss_section
    378  1.1  skrll 		      || now_seg == S_GET_SEGMENT (symbolP)))
    379  1.1  skrll 		{
    380  1.1  skrll 		  /* Select which of the 2 cases this is.  */
    381  1.1  skrll 		  if (now_seg != data_section)
    382  1.1  skrll 		    {
    383  1.1  skrll 		      /* New .comm for prev .comm symbol.
    384  1.1  skrll 
    385  1.1  skrll 			 If the new size is larger we just change its
    386  1.1  skrll 			 value.  If the new size is smaller, we ignore
    387  1.1  skrll 			 this symbol.  */
    388  1.1  skrll 		      if (S_GET_VALUE (symbolP)
    389  1.1  skrll 			  < ((unsigned) frag_now_fix ()))
    390  1.1  skrll 			{
    391  1.1  skrll 			  S_SET_VALUE (symbolP, (valueT) frag_now_fix ());
    392  1.1  skrll 			}
    393  1.1  skrll 		    }
    394  1.1  skrll 		  else
    395  1.1  skrll 		    {
    396  1.1  skrll 		      /* It is a .comm/.lcomm being converted to initialized
    397  1.1  skrll 			 data.  */
    398  1.1  skrll 		      symbolP->sy_frag = frag_now;
    399  1.1  skrll #ifdef OBJ_VMS
    400  1.1  skrll 		      S_SET_OTHER (symbolP, const_flag);
    401  1.1  skrll #endif
    402  1.1  skrll 		      S_SET_VALUE (symbolP, (valueT) frag_now_fix ());
    403  1.1  skrll 		      S_SET_SEGMENT (symbolP, now_seg);	/* Keep N_EXT bit.  */
    404  1.1  skrll 		    }
    405  1.1  skrll 		}
    406  1.1  skrll 	      else
    407  1.1  skrll 		{
    408  1.1  skrll #if (!defined (OBJ_AOUT) && !defined (OBJ_MAYBE_AOUT) \
    409  1.1  skrll      && !defined (OBJ_BOUT) && !defined (OBJ_MAYBE_BOUT))
    410  1.1  skrll 		  static const char *od_buf = "";
    411  1.1  skrll #else
    412  1.1  skrll 		  char od_buf[100];
    413  1.1  skrll 		  od_buf[0] = '\0';
    414  1.1  skrll 		  if (OUTPUT_FLAVOR == bfd_target_aout_flavour)
    415  1.1  skrll 		    sprintf (od_buf, "%d.%d.",
    416  1.1  skrll 			     S_GET_OTHER (symbolP),
    417  1.1  skrll 			     S_GET_DESC (symbolP));
    418  1.1  skrll #endif
    419  1.1  skrll 		  as_bad (_("symbol `%s' is already defined as \"%s\"/%s%ld"),
    420  1.1  skrll 			    sym_name,
    421  1.1  skrll 			    segment_name (S_GET_SEGMENT (symbolP)),
    422  1.1  skrll 			    od_buf,
    423  1.1  skrll 			    (long) S_GET_VALUE (symbolP));
    424  1.1  skrll 		}
    425  1.1  skrll 	    }			/* if the undefined symbol has no value  */
    426  1.1  skrll 	}
    427  1.1  skrll       else
    428  1.1  skrll 	{
    429  1.1  skrll 	  /* Don't blow up if the definition is the same.  */
    430  1.1  skrll 	  if (!(frag_now == symbolP->sy_frag
    431  1.1  skrll 		&& S_GET_VALUE (symbolP) == frag_now_fix ()
    432  1.1  skrll 		&& S_GET_SEGMENT (symbolP) == now_seg))
    433  1.1  skrll 	    {
    434  1.1  skrll 	      as_bad (_("symbol `%s' is already defined"), sym_name);
    435  1.1  skrll 	      symbolP = symbol_clone (symbolP, 0);
    436  1.1  skrll 	    }
    437  1.1  skrll 	}
    438  1.1  skrll 
    439  1.1  skrll     }
    440  1.1  skrll   else if (! flag_keep_locals && bfd_is_local_label_name (stdoutput, sym_name))
    441  1.1  skrll     {
    442  1.1  skrll       symbolP = (symbolS *) local_symbol_make (sym_name, now_seg,
    443  1.1  skrll 					       (valueT) frag_now_fix (),
    444  1.1  skrll 					       frag_now);
    445  1.1  skrll     }
    446  1.1  skrll   else
    447  1.1  skrll     {
    448  1.1  skrll       symbolP = symbol_new (sym_name, now_seg, (valueT) frag_now_fix (),
    449  1.1  skrll 			    frag_now);
    450  1.1  skrll #ifdef OBJ_VMS
    451  1.1  skrll       S_SET_OTHER (symbolP, const_flag);
    452  1.1  skrll #endif /* OBJ_VMS */
    453  1.1  skrll 
    454  1.1  skrll       symbol_table_insert (symbolP);
    455  1.1  skrll     }
    456  1.1  skrll 
    457  1.1  skrll   if (mri_common_symbol != NULL)
    458  1.1  skrll     {
    459  1.1  skrll       /* This symbol is actually being defined within an MRI common
    460  1.1  skrll 	 section.  This requires special handling.  */
    461  1.1  skrll       if (LOCAL_SYMBOL_CHECK (symbolP))
    462  1.1  skrll 	symbolP = local_symbol_convert ((struct local_symbol *) symbolP);
    463  1.1  skrll       symbolP->sy_value.X_op = O_symbol;
    464  1.1  skrll       symbolP->sy_value.X_add_symbol = mri_common_symbol;
    465  1.1  skrll       symbolP->sy_value.X_add_number = S_GET_VALUE (mri_common_symbol);
    466  1.1  skrll       symbolP->sy_frag = &zero_address_frag;
    467  1.1  skrll       S_SET_SEGMENT (symbolP, expr_section);
    468  1.1  skrll       symbolP->sy_mri_common = 1;
    469  1.1  skrll     }
    470  1.1  skrll 
    471  1.1  skrll #ifdef tc_frob_label
    472  1.1  skrll   tc_frob_label (symbolP);
    473  1.1  skrll #endif
    474  1.1  skrll #ifdef obj_frob_label
    475  1.1  skrll   obj_frob_label (symbolP);
    476  1.1  skrll #endif
    477  1.1  skrll 
    478  1.1  skrll   return symbolP;
    479  1.1  skrll }
    480  1.1  skrll 
    481  1.1  skrll /* Die if we can't insert the symbol.  */
    483  1.1  skrll 
    484  1.1  skrll void
    485  1.1  skrll symbol_table_insert (symbolS *symbolP)
    486  1.1  skrll {
    487  1.1  skrll   register const char *error_string;
    488  1.1  skrll 
    489  1.1  skrll   know (symbolP);
    490  1.1  skrll   know (S_GET_NAME (symbolP));
    491  1.1  skrll 
    492  1.1  skrll   if (LOCAL_SYMBOL_CHECK (symbolP))
    493  1.1  skrll     {
    494  1.1  skrll       error_string = hash_jam (local_hash, S_GET_NAME (symbolP),
    495  1.1  skrll 			       (void *) symbolP);
    496  1.1  skrll       if (error_string != NULL)
    497  1.1  skrll 	as_fatal (_("inserting \"%s\" into symbol table failed: %s"),
    498  1.1  skrll 		  S_GET_NAME (symbolP), error_string);
    499  1.1  skrll       return;
    500  1.1  skrll     }
    501  1.1  skrll 
    502  1.1  skrll   if ((error_string = hash_jam (sy_hash, S_GET_NAME (symbolP), (void *) symbolP)))
    503  1.1  skrll     {
    504  1.1  skrll       as_fatal (_("inserting \"%s\" into symbol table failed: %s"),
    505  1.1  skrll 		S_GET_NAME (symbolP), error_string);
    506  1.1  skrll     }				/* on error  */
    507  1.1  skrll }
    508  1.1  skrll 
    509  1.1  skrll /* If a symbol name does not exist, create it as undefined, and insert
    511  1.1  skrll    it into the symbol table.  Return a pointer to it.  */
    512  1.1  skrll 
    513  1.1  skrll symbolS *
    514  1.1  skrll symbol_find_or_make (const char *name)
    515  1.1  skrll {
    516  1.1  skrll   register symbolS *symbolP;
    517  1.1  skrll 
    518  1.1  skrll   symbolP = symbol_find (name);
    519  1.1  skrll 
    520  1.1  skrll   if (symbolP == NULL)
    521  1.1  skrll     {
    522  1.1  skrll       if (! flag_keep_locals && bfd_is_local_label_name (stdoutput, name))
    523  1.1  skrll 	{
    524  1.1  skrll 	  symbolP = md_undefined_symbol ((char *) name);
    525  1.1  skrll 	  if (symbolP != NULL)
    526  1.1  skrll 	    return symbolP;
    527  1.1  skrll 
    528  1.1  skrll 	  symbolP = (symbolS *) local_symbol_make (name, undefined_section,
    529  1.1  skrll 						   (valueT) 0,
    530  1.1  skrll 						   &zero_address_frag);
    531  1.1  skrll 	  return symbolP;
    532  1.1  skrll 	}
    533  1.1  skrll 
    534  1.1  skrll       symbolP = symbol_make (name);
    535  1.1  skrll 
    536  1.1  skrll       symbol_table_insert (symbolP);
    537  1.1  skrll     }				/* if symbol wasn't found */
    538  1.1  skrll 
    539  1.1  skrll   return (symbolP);
    540  1.1  skrll }
    541  1.1  skrll 
    542  1.1  skrll symbolS *
    543  1.1  skrll symbol_make (const char *name)
    544  1.1  skrll {
    545  1.1  skrll   symbolS *symbolP;
    546  1.1  skrll 
    547  1.1  skrll   /* Let the machine description default it, e.g. for register names.  */
    548  1.1  skrll   symbolP = md_undefined_symbol ((char *) name);
    549  1.1  skrll 
    550  1.1  skrll   if (!symbolP)
    551  1.1  skrll     symbolP = symbol_new (name, undefined_section, (valueT) 0, &zero_address_frag);
    552  1.1  skrll 
    553  1.1  skrll   return (symbolP);
    554  1.1  skrll }
    555  1.1  skrll 
    556  1.1  skrll symbolS *
    557  1.1  skrll symbol_clone (symbolS *orgsymP, int replace)
    558  1.1  skrll {
    559  1.1  skrll   symbolS *newsymP;
    560  1.1  skrll   asymbol *bsymorg, *bsymnew;
    561  1.1  skrll 
    562  1.1  skrll   /* Running local_symbol_convert on a clone that's not the one currently
    563  1.1  skrll      in local_hash would incorrectly replace the hash entry.  Thus the
    564  1.1  skrll      symbol must be converted here.  Note that the rest of the function
    565  1.1  skrll      depends on not encountering an unconverted symbol.  */
    566  1.1  skrll   if (LOCAL_SYMBOL_CHECK (orgsymP))
    567  1.1  skrll     orgsymP = local_symbol_convert ((struct local_symbol *) orgsymP);
    568  1.1  skrll   bsymorg = orgsymP->bsym;
    569  1.1  skrll 
    570  1.1  skrll   newsymP = obstack_alloc (&notes, sizeof (*newsymP));
    571  1.1  skrll   *newsymP = *orgsymP;
    572  1.1  skrll   bsymnew = bfd_make_empty_symbol (bfd_asymbol_bfd (bsymorg));
    573  1.1  skrll   if (bsymnew == NULL)
    574  1.1  skrll     as_fatal ("bfd_make_empty_symbol: %s", bfd_errmsg (bfd_get_error ()));
    575  1.1  skrll   newsymP->bsym = bsymnew;
    576  1.1  skrll   bsymnew->name = bsymorg->name;
    577  1.1  skrll   bsymnew->flags =  bsymorg->flags;
    578  1.1  skrll   bsymnew->section =  bsymorg->section;
    579  1.1  skrll   bfd_copy_private_symbol_data (bfd_asymbol_bfd (bsymorg), bsymorg,
    580  1.1  skrll 				bfd_asymbol_bfd (bsymnew), bsymnew);
    581  1.1  skrll 
    582  1.1  skrll #ifdef obj_symbol_clone_hook
    583  1.1  skrll   obj_symbol_clone_hook (newsymP, orgsymP);
    584  1.1  skrll #endif
    585  1.1  skrll 
    586  1.1  skrll #ifdef tc_symbol_clone_hook
    587  1.1  skrll   tc_symbol_clone_hook (newsymP, orgsymP);
    588  1.1  skrll #endif
    589  1.1  skrll 
    590  1.1  skrll   if (replace)
    591  1.1  skrll     {
    592  1.1  skrll       if (symbol_rootP == orgsymP)
    593  1.1  skrll 	symbol_rootP = newsymP;
    594  1.1  skrll       else if (orgsymP->sy_previous)
    595  1.1  skrll 	{
    596  1.1  skrll 	  orgsymP->sy_previous->sy_next = newsymP;
    597  1.1  skrll 	  orgsymP->sy_previous = NULL;
    598  1.1  skrll 	}
    599  1.1  skrll       if (symbol_lastP == orgsymP)
    600  1.1  skrll 	symbol_lastP = newsymP;
    601  1.1  skrll       else if (orgsymP->sy_next)
    602  1.1  skrll 	orgsymP->sy_next->sy_previous = newsymP;
    603  1.1  skrll 
    604  1.1  skrll       /* Symbols that won't be output can't be external.  */
    605  1.1  skrll       S_CLEAR_EXTERNAL (orgsymP);
    606  1.1  skrll       orgsymP->sy_previous = orgsymP->sy_next = orgsymP;
    607  1.1  skrll       debug_verify_symchain (symbol_rootP, symbol_lastP);
    608  1.1  skrll 
    609  1.1  skrll       symbol_table_insert (newsymP);
    610  1.1  skrll     }
    611  1.1  skrll   else
    612  1.1  skrll     {
    613  1.1  skrll       /* Symbols that won't be output can't be external.  */
    614  1.1  skrll       S_CLEAR_EXTERNAL (newsymP);
    615  1.1  skrll       newsymP->sy_previous = newsymP->sy_next = newsymP;
    616  1.1  skrll     }
    617  1.1  skrll 
    618  1.1  skrll   return newsymP;
    619  1.1  skrll }
    620  1.1  skrll 
    621  1.1  skrll /* Referenced symbols, if they are forward references, need to be cloned
    622  1.1  skrll    (without replacing the original) so that the value of the referenced
    623  1.1  skrll    symbols at the point of use .  */
    624  1.1  skrll 
    625  1.1  skrll #undef symbol_clone_if_forward_ref
    626  1.1  skrll symbolS *
    627  1.1  skrll symbol_clone_if_forward_ref (symbolS *symbolP, int is_forward)
    628  1.1  skrll {
    629  1.1  skrll   if (symbolP && !LOCAL_SYMBOL_CHECK (symbolP))
    630  1.1  skrll     {
    631  1.1  skrll       symbolS *add_symbol = symbolP->sy_value.X_add_symbol;
    632  1.1  skrll       symbolS *op_symbol = symbolP->sy_value.X_op_symbol;
    633  1.1  skrll 
    634  1.1  skrll       if (symbolP->sy_forward_ref)
    635  1.1  skrll 	is_forward = 1;
    636  1.1  skrll 
    637  1.1  skrll       if (is_forward)
    638  1.1  skrll 	{
    639  1.1  skrll 	  /* assign_symbol() clones volatile symbols; pre-existing expressions
    640  1.1  skrll 	     hold references to the original instance, but want the current
    641  1.1  skrll 	     value.  Just repeat the lookup.  */
    642  1.1  skrll 	  if (add_symbol && S_IS_VOLATILE (add_symbol))
    643  1.1  skrll 	    add_symbol = symbol_find_exact (S_GET_NAME (add_symbol));
    644  1.1  skrll 	  if (op_symbol && S_IS_VOLATILE (op_symbol))
    645  1.1  skrll 	    op_symbol = symbol_find_exact (S_GET_NAME (op_symbol));
    646  1.1  skrll 	}
    647  1.1  skrll 
    648  1.1  skrll       /* Re-using sy_resolving here, as this routine cannot get called from
    649  1.1  skrll 	 symbol resolution code.  */
    650  1.1  skrll       if (symbolP->bsym->section == expr_section && !symbolP->sy_resolving)
    651  1.1  skrll 	{
    652  1.1  skrll 	  symbolP->sy_resolving = 1;
    653  1.1  skrll 	  add_symbol = symbol_clone_if_forward_ref (add_symbol, is_forward);
    654  1.1  skrll 	  op_symbol = symbol_clone_if_forward_ref (op_symbol, is_forward);
    655  1.1  skrll 	  symbolP->sy_resolving = 0;
    656  1.1  skrll 	}
    657  1.1  skrll 
    658  1.1  skrll       if (symbolP->sy_forward_ref
    659  1.1  skrll 	  || add_symbol != symbolP->sy_value.X_add_symbol
    660  1.1  skrll 	  || op_symbol != symbolP->sy_value.X_op_symbol)
    661  1.1  skrll 	symbolP = symbol_clone (symbolP, 0);
    662  1.1  skrll 
    663  1.1  skrll       symbolP->sy_value.X_add_symbol = add_symbol;
    664  1.1  skrll       symbolP->sy_value.X_op_symbol = op_symbol;
    665  1.1  skrll     }
    666  1.1  skrll 
    667  1.1  skrll   return symbolP;
    668  1.1  skrll }
    669  1.1  skrll 
    670  1.1  skrll symbolS *
    671  1.1  skrll symbol_temp_new (segT seg, valueT ofs, fragS *frag)
    672  1.1  skrll {
    673  1.1  skrll   return symbol_new (FAKE_LABEL_NAME, seg, ofs, frag);
    674  1.1  skrll }
    675  1.1  skrll 
    676  1.1  skrll symbolS *
    677  1.1  skrll symbol_temp_new_now (void)
    678  1.1  skrll {
    679  1.1  skrll   return symbol_temp_new (now_seg, frag_now_fix (), frag_now);
    680  1.1  skrll }
    681  1.1  skrll 
    682  1.1  skrll symbolS *
    683  1.1  skrll symbol_temp_make (void)
    684  1.1  skrll {
    685  1.1  skrll   return symbol_make (FAKE_LABEL_NAME);
    686  1.1  skrll }
    687  1.1  skrll 
    688  1.1  skrll /* Implement symbol table lookup.
    689  1.1  skrll    In:	A symbol's name as a string: '\0' can't be part of a symbol name.
    690  1.1  skrll    Out:	NULL if the name was not in the symbol table, else the address
    691  1.1  skrll    of a struct symbol associated with that name.  */
    692  1.1  skrll 
    693  1.1  skrll symbolS *
    694  1.1  skrll symbol_find_exact (const char *name)
    695  1.1  skrll {
    696  1.1  skrll   return symbol_find_exact_noref (name, 0);
    697  1.1  skrll }
    698  1.1  skrll 
    699  1.1  skrll symbolS *
    700  1.1  skrll symbol_find_exact_noref (const char *name, int noref)
    701  1.1  skrll {
    702  1.1  skrll   struct local_symbol *locsym;
    703  1.1  skrll   symbolS* sym;
    704  1.1  skrll 
    705  1.1  skrll   locsym = (struct local_symbol *) hash_find (local_hash, name);
    706  1.1  skrll   if (locsym != NULL)
    707  1.1  skrll     return (symbolS *) locsym;
    708  1.1  skrll 
    709  1.1  skrll   sym = ((symbolS *) hash_find (sy_hash, name));
    710  1.1  skrll 
    711  1.1  skrll   /* Any references to the symbol, except for the reference in
    712  1.1  skrll      .weakref, must clear this flag, such that the symbol does not
    713  1.1  skrll      turn into a weak symbol.  Note that we don't have to handle the
    714  1.1  skrll      local_symbol case, since a weakrefd is always promoted out of the
    715  1.1  skrll      local_symbol table when it is turned into a weak symbol.  */
    716  1.1  skrll   if (sym && ! noref)
    717  1.1  skrll     S_CLEAR_WEAKREFD (sym);
    718  1.1  skrll 
    719  1.1  skrll   return sym;
    720  1.1  skrll }
    721  1.1  skrll 
    722  1.1  skrll symbolS *
    723  1.1  skrll symbol_find (const char *name)
    724  1.1  skrll {
    725  1.1  skrll   return symbol_find_noref (name, 0);
    726  1.1  skrll }
    727  1.1  skrll 
    728  1.1  skrll symbolS *
    729  1.1  skrll symbol_find_noref (const char *name, int noref)
    730  1.1  skrll {
    731  1.1  skrll #ifdef tc_canonicalize_symbol_name
    732  1.1  skrll   {
    733  1.1  skrll     char *copy;
    734  1.1  skrll     size_t len = strlen (name) + 1;
    735  1.1  skrll 
    736  1.1  skrll     copy = (char *) alloca (len);
    737  1.1  skrll     memcpy (copy, name, len);
    738  1.1  skrll     name = tc_canonicalize_symbol_name (copy);
    739  1.1  skrll   }
    740  1.1  skrll #endif
    741  1.1  skrll 
    742  1.1  skrll   if (! symbols_case_sensitive)
    743  1.1  skrll     {
    744  1.1  skrll       char *copy;
    745  1.1  skrll       const char *orig;
    746  1.1  skrll       unsigned char c;
    747  1.1  skrll 
    748  1.1  skrll       orig = name;
    749  1.1  skrll       name = copy = (char *) alloca (strlen (name) + 1);
    750  1.1  skrll 
    751  1.1  skrll       while ((c = *orig++) != '\0')
    752  1.1  skrll 	{
    753  1.1  skrll 	  *copy++ = TOUPPER (c);
    754  1.1  skrll 	}
    755  1.1  skrll       *copy = '\0';
    756  1.1  skrll     }
    757  1.1  skrll 
    758  1.1  skrll   return symbol_find_exact_noref (name, noref);
    759  1.1  skrll }
    760  1.1  skrll 
    761  1.1  skrll /* Once upon a time, symbols were kept in a singly linked list.  At
    762  1.1  skrll    least coff needs to be able to rearrange them from time to time, for
    763  1.1  skrll    which a doubly linked list is much more convenient.  Loic did these
    764  1.1  skrll    as macros which seemed dangerous to me so they're now functions.
    765  1.1  skrll    xoxorich.  */
    766  1.1  skrll 
    767  1.1  skrll /* Link symbol ADDME after symbol TARGET in the chain.  */
    768  1.1  skrll 
    769  1.1  skrll void
    770  1.1  skrll symbol_append (symbolS *addme, symbolS *target,
    771  1.1  skrll 	       symbolS **rootPP, symbolS **lastPP)
    772  1.1  skrll {
    773  1.1  skrll   if (LOCAL_SYMBOL_CHECK (addme))
    774  1.1  skrll     abort ();
    775  1.1  skrll   if (target != NULL && LOCAL_SYMBOL_CHECK (target))
    776  1.1  skrll     abort ();
    777  1.1  skrll 
    778  1.1  skrll   if (target == NULL)
    779  1.1  skrll     {
    780  1.1  skrll       know (*rootPP == NULL);
    781  1.1  skrll       know (*lastPP == NULL);
    782  1.1  skrll       addme->sy_next = NULL;
    783  1.1  skrll       addme->sy_previous = NULL;
    784  1.1  skrll       *rootPP = addme;
    785  1.1  skrll       *lastPP = addme;
    786  1.1  skrll       return;
    787  1.1  skrll     }				/* if the list is empty  */
    788  1.1  skrll 
    789  1.1  skrll   if (target->sy_next != NULL)
    790  1.1  skrll     {
    791  1.1  skrll       target->sy_next->sy_previous = addme;
    792  1.1  skrll     }
    793  1.1  skrll   else
    794  1.1  skrll     {
    795  1.1  skrll       know (*lastPP == target);
    796  1.1  skrll       *lastPP = addme;
    797  1.1  skrll     }				/* if we have a next  */
    798  1.1  skrll 
    799  1.1  skrll   addme->sy_next = target->sy_next;
    800  1.1  skrll   target->sy_next = addme;
    801  1.1  skrll   addme->sy_previous = target;
    802  1.1  skrll 
    803  1.1  skrll   debug_verify_symchain (symbol_rootP, symbol_lastP);
    804  1.1  skrll }
    805  1.1  skrll 
    806  1.1  skrll /* Set the chain pointers of SYMBOL to null.  */
    807  1.1  skrll 
    808  1.1  skrll void
    809  1.1  skrll symbol_clear_list_pointers (symbolS *symbolP)
    810  1.1  skrll {
    811  1.1  skrll   if (LOCAL_SYMBOL_CHECK (symbolP))
    812  1.1  skrll     abort ();
    813  1.1  skrll   symbolP->sy_next = NULL;
    814  1.1  skrll   symbolP->sy_previous = NULL;
    815  1.1  skrll }
    816  1.1  skrll 
    817  1.1  skrll /* Remove SYMBOLP from the list.  */
    818  1.1  skrll 
    819  1.1  skrll void
    820  1.1  skrll symbol_remove (symbolS *symbolP, symbolS **rootPP, symbolS **lastPP)
    821  1.1  skrll {
    822  1.1  skrll   if (LOCAL_SYMBOL_CHECK (symbolP))
    823  1.1  skrll     abort ();
    824  1.1  skrll 
    825  1.1  skrll   if (symbolP == *rootPP)
    826  1.1  skrll     {
    827  1.1  skrll       *rootPP = symbolP->sy_next;
    828  1.1  skrll     }				/* if it was the root  */
    829  1.1  skrll 
    830  1.1  skrll   if (symbolP == *lastPP)
    831  1.1  skrll     {
    832  1.1  skrll       *lastPP = symbolP->sy_previous;
    833  1.1  skrll     }				/* if it was the tail  */
    834  1.1  skrll 
    835  1.1  skrll   if (symbolP->sy_next != NULL)
    836  1.1  skrll     {
    837  1.1  skrll       symbolP->sy_next->sy_previous = symbolP->sy_previous;
    838  1.1  skrll     }				/* if not last  */
    839  1.1  skrll 
    840  1.1  skrll   if (symbolP->sy_previous != NULL)
    841  1.1  skrll     {
    842  1.1  skrll       symbolP->sy_previous->sy_next = symbolP->sy_next;
    843  1.1  skrll     }				/* if not first  */
    844  1.1  skrll 
    845  1.1  skrll   debug_verify_symchain (*rootPP, *lastPP);
    846  1.1  skrll }
    847  1.1  skrll 
    848  1.1  skrll /* Link symbol ADDME before symbol TARGET in the chain.  */
    849  1.1  skrll 
    850  1.1  skrll void
    851  1.1  skrll symbol_insert (symbolS *addme, symbolS *target,
    852  1.1  skrll 	       symbolS **rootPP, symbolS **lastPP ATTRIBUTE_UNUSED)
    853  1.1  skrll {
    854  1.1  skrll   if (LOCAL_SYMBOL_CHECK (addme))
    855  1.1  skrll     abort ();
    856  1.1  skrll   if (LOCAL_SYMBOL_CHECK (target))
    857  1.1  skrll     abort ();
    858  1.1  skrll 
    859  1.1  skrll   if (target->sy_previous != NULL)
    860  1.1  skrll     {
    861  1.1  skrll       target->sy_previous->sy_next = addme;
    862  1.1  skrll     }
    863  1.1  skrll   else
    864  1.1  skrll     {
    865  1.1  skrll       know (*rootPP == target);
    866  1.1  skrll       *rootPP = addme;
    867  1.1  skrll     }				/* if not first  */
    868  1.1  skrll 
    869  1.1  skrll   addme->sy_previous = target->sy_previous;
    870  1.1  skrll   target->sy_previous = addme;
    871  1.1  skrll   addme->sy_next = target;
    872  1.1  skrll 
    873  1.1  skrll   debug_verify_symchain (*rootPP, *lastPP);
    874  1.1  skrll }
    875  1.1  skrll 
    876  1.1  skrll void
    877  1.1  skrll verify_symbol_chain (symbolS *rootP, symbolS *lastP)
    878  1.1  skrll {
    879  1.1  skrll   symbolS *symbolP = rootP;
    880  1.1  skrll 
    881  1.1  skrll   if (symbolP == NULL)
    882  1.1  skrll     return;
    883  1.1  skrll 
    884  1.1  skrll   for (; symbol_next (symbolP) != NULL; symbolP = symbol_next (symbolP))
    885  1.1  skrll     {
    886  1.1  skrll       assert (symbolP->bsym != NULL);
    887  1.1  skrll       assert (symbolP->sy_next->sy_previous == symbolP);
    888  1.1  skrll     }
    889  1.1  skrll 
    890  1.1  skrll   assert (lastP == symbolP);
    891  1.1  skrll }
    892  1.1  skrll 
    893  1.1  skrll #ifdef OBJ_COMPLEX_RELC
    894  1.1  skrll 
    895  1.1  skrll static int
    896  1.1  skrll use_complex_relocs_for (symbolS * symp)
    897  1.1  skrll {
    898  1.1  skrll   switch (symp->sy_value.X_op)
    899  1.1  skrll     {
    900  1.1  skrll     case O_constant:
    901  1.1  skrll       return 0;
    902  1.1  skrll 
    903  1.1  skrll     case O_symbol:
    904  1.1  skrll     case O_symbol_rva:
    905  1.1  skrll     case O_uminus:
    906  1.1  skrll     case O_bit_not:
    907  1.1  skrll     case O_logical_not:
    908  1.1  skrll       if (  (S_IS_COMMON (symp->sy_value.X_add_symbol)
    909  1.1  skrll 	   || S_IS_LOCAL (symp->sy_value.X_add_symbol))
    910  1.1  skrll 	  &&
    911  1.1  skrll 	      (S_IS_DEFINED (symp->sy_value.X_add_symbol)
    912  1.1  skrll 	   && S_GET_SEGMENT (symp->sy_value.X_add_symbol) != expr_section))
    913  1.1  skrll 	return 0;
    914  1.1  skrll       break;
    915  1.1  skrll 
    916  1.1  skrll     case O_multiply:
    917  1.1  skrll     case O_divide:
    918  1.1  skrll     case O_modulus:
    919  1.1  skrll     case O_left_shift:
    920  1.1  skrll     case O_right_shift:
    921  1.1  skrll     case O_bit_inclusive_or:
    922  1.1  skrll     case O_bit_or_not:
    923  1.1  skrll     case O_bit_exclusive_or:
    924  1.1  skrll     case O_bit_and:
    925  1.1  skrll     case O_add:
    926  1.1  skrll     case O_subtract:
    927  1.1  skrll     case O_eq:
    928  1.1  skrll     case O_ne:
    929  1.1  skrll     case O_lt:
    930  1.1  skrll     case O_le:
    931  1.1  skrll     case O_ge:
    932  1.1  skrll     case O_gt:
    933  1.1  skrll     case O_logical_and:
    934  1.1  skrll     case O_logical_or:
    935  1.1  skrll 
    936  1.1  skrll       if (  (S_IS_COMMON (symp->sy_value.X_add_symbol)
    937  1.1  skrll 	   || S_IS_LOCAL (symp->sy_value.X_add_symbol))
    938  1.1  skrll 	  &&
    939  1.1  skrll 	    (S_IS_COMMON (symp->sy_value.X_op_symbol)
    940  1.1  skrll 	   || S_IS_LOCAL (symp->sy_value.X_op_symbol))
    941  1.1  skrll 
    942  1.1  skrll 	  && S_IS_DEFINED (symp->sy_value.X_add_symbol)
    943  1.1  skrll 	  && S_IS_DEFINED (symp->sy_value.X_op_symbol)
    944  1.1  skrll 	  && S_GET_SEGMENT (symp->sy_value.X_add_symbol) != expr_section
    945  1.1  skrll 	  && S_GET_SEGMENT (symp->sy_value.X_op_symbol) != expr_section)
    946  1.1  skrll 	return 0;
    947  1.1  skrll       break;
    948  1.1  skrll 
    949  1.1  skrll     default:
    950  1.1  skrll       break;
    951  1.1  skrll     }
    952  1.1  skrll   return 1;
    953  1.1  skrll }
    954  1.1  skrll #endif
    955  1.1  skrll 
    956  1.1  skrll static void
    957  1.1  skrll report_op_error (symbolS *symp, symbolS *left, symbolS *right)
    958  1.1  skrll {
    959  1.1  skrll   char *file;
    960  1.1  skrll   unsigned int line;
    961  1.1  skrll   segT seg_left = S_GET_SEGMENT (left);
    962  1.1  skrll   segT seg_right = right ? S_GET_SEGMENT (right) : 0;
    963  1.1  skrll 
    964  1.1  skrll   if (expr_symbol_where (symp, &file, &line))
    965  1.1  skrll     {
    966  1.1  skrll       if (seg_left == undefined_section)
    967  1.1  skrll 	as_bad_where (file, line,
    968  1.1  skrll 		      _("undefined symbol `%s' in operation"),
    969  1.1  skrll 		      S_GET_NAME (left));
    970  1.1  skrll       if (seg_right == undefined_section)
    971  1.1  skrll 	as_bad_where (file, line,
    972  1.1  skrll 		      _("undefined symbol `%s' in operation"),
    973  1.1  skrll 		      S_GET_NAME (right));
    974  1.1  skrll       if (seg_left != undefined_section
    975  1.1  skrll 	  && seg_right != undefined_section)
    976  1.1  skrll 	{
    977  1.1  skrll 	  if (right)
    978  1.1  skrll 	    as_bad_where (file, line,
    979  1.1  skrll 			  _("invalid sections for operation on `%s' and `%s'"),
    980  1.1  skrll 			  S_GET_NAME (left), S_GET_NAME (right));
    981  1.1  skrll 	  else
    982  1.1  skrll 	    as_bad_where (file, line,
    983  1.1  skrll 			  _("invalid section for operation on `%s'"),
    984  1.1  skrll 			  S_GET_NAME (left));
    985  1.1  skrll 	}
    986  1.1  skrll 
    987  1.1  skrll     }
    988  1.1  skrll   else
    989  1.1  skrll     {
    990  1.1  skrll       if (seg_left == undefined_section)
    991  1.1  skrll 	as_bad (_("undefined symbol `%s' in operation setting `%s'"),
    992  1.1  skrll 		S_GET_NAME (left), S_GET_NAME (symp));
    993  1.1  skrll       if (seg_right == undefined_section)
    994  1.1  skrll 	as_bad (_("undefined symbol `%s' in operation setting `%s'"),
    995  1.1  skrll 		S_GET_NAME (right), S_GET_NAME (symp));
    996  1.1  skrll       if (seg_left != undefined_section
    997  1.1  skrll 	  && seg_right != undefined_section)
    998  1.1  skrll 	{
    999  1.1  skrll 	  if (right)
   1000  1.1  skrll 	    as_bad (_("invalid sections for operation on `%s' and `%s' setting `%s'"),
   1001  1.1  skrll 		    S_GET_NAME (left), S_GET_NAME (right), S_GET_NAME (symp));
   1002  1.1  skrll 	  else
   1003  1.1  skrll 	    as_bad (_("invalid section for operation on `%s' setting `%s'"),
   1004  1.1  skrll 		    S_GET_NAME (left), S_GET_NAME (symp));
   1005  1.1  skrll 	}
   1006  1.1  skrll     }
   1007  1.1  skrll }
   1008  1.1  skrll 
   1009  1.1  skrll /* Resolve the value of a symbol.  This is called during the final
   1010  1.1  skrll    pass over the symbol table to resolve any symbols with complex
   1011  1.1  skrll    values.  */
   1012  1.1  skrll 
   1013  1.1  skrll valueT
   1014  1.1  skrll resolve_symbol_value (symbolS *symp)
   1015  1.1  skrll {
   1016  1.1  skrll   int resolved;
   1017  1.1  skrll   valueT final_val = 0;
   1018  1.1  skrll   segT final_seg;
   1019  1.1  skrll 
   1020  1.1  skrll   if (LOCAL_SYMBOL_CHECK (symp))
   1021  1.1  skrll     {
   1022  1.1  skrll       struct local_symbol *locsym = (struct local_symbol *) symp;
   1023  1.1  skrll 
   1024  1.1  skrll       final_val = locsym->lsy_value;
   1025  1.1  skrll       if (local_symbol_resolved_p (locsym))
   1026  1.1  skrll 	return final_val;
   1027  1.1  skrll 
   1028  1.1  skrll       final_val += local_symbol_get_frag (locsym)->fr_address / OCTETS_PER_BYTE;
   1029  1.1  skrll 
   1030  1.1  skrll       if (finalize_syms)
   1031  1.1  skrll 	{
   1032  1.1  skrll 	  locsym->lsy_value = final_val;
   1033  1.1  skrll 	  local_symbol_mark_resolved (locsym);
   1034  1.1  skrll 	}
   1035  1.1  skrll 
   1036  1.1  skrll       return final_val;
   1037  1.1  skrll     }
   1038  1.1  skrll 
   1039  1.1  skrll   if (symp->sy_resolved)
   1040  1.1  skrll     {
   1041  1.1  skrll       if (symp->sy_value.X_op == O_constant)
   1042  1.1  skrll 	return (valueT) symp->sy_value.X_add_number;
   1043  1.1  skrll       else
   1044  1.1  skrll 	return 0;
   1045  1.1  skrll     }
   1046  1.1  skrll 
   1047  1.1  skrll   resolved = 0;
   1048  1.1  skrll   final_seg = S_GET_SEGMENT (symp);
   1049  1.1  skrll 
   1050  1.1  skrll   if (symp->sy_resolving)
   1051  1.1  skrll     {
   1052  1.1  skrll       if (finalize_syms)
   1053  1.1  skrll 	as_bad (_("symbol definition loop encountered at `%s'"),
   1054  1.1  skrll 		S_GET_NAME (symp));
   1055  1.1  skrll       final_val = 0;
   1056  1.1  skrll       resolved = 1;
   1057  1.1  skrll     }
   1058  1.1  skrll #ifdef OBJ_COMPLEX_RELC
   1059  1.1  skrll   else if (final_seg == expr_section
   1060  1.1  skrll 	   && use_complex_relocs_for (symp))
   1061  1.1  skrll     {
   1062  1.1  skrll       symbolS * relc_symbol = NULL;
   1063  1.1  skrll       char * relc_symbol_name = NULL;
   1064  1.1  skrll 
   1065  1.1  skrll       relc_symbol_name = symbol_relc_make_expr (& symp->sy_value);
   1066  1.1  skrll 
   1067  1.1  skrll       /* For debugging, print out conversion input & output.  */
   1068  1.1  skrll #ifdef DEBUG_SYMS
   1069  1.1  skrll       print_expr (& symp->sy_value);
   1070  1.1  skrll       if (relc_symbol_name)
   1071  1.1  skrll 	fprintf (stderr, "-> relc symbol: %s\n", relc_symbol_name);
   1072  1.1  skrll #endif
   1073  1.1  skrll 
   1074  1.1  skrll       if (relc_symbol_name != NULL)
   1075  1.1  skrll 	relc_symbol = symbol_new (relc_symbol_name, undefined_section,
   1076  1.1  skrll 				  0, & zero_address_frag);
   1077  1.1  skrll 
   1078  1.1  skrll       if (relc_symbol == NULL)
   1079  1.1  skrll 	{
   1080  1.1  skrll 	  as_bad (_("cannot convert expression symbol %s to complex relocation"),
   1081  1.1  skrll 		  S_GET_NAME (symp));
   1082  1.1  skrll 	  resolved = 0;
   1083  1.1  skrll 	}
   1084  1.1  skrll       else
   1085  1.1  skrll 	{
   1086  1.1  skrll 	  symbol_table_insert (relc_symbol);
   1087  1.1  skrll 
   1088  1.1  skrll  	  /* S_CLEAR_EXTERNAL (relc_symbol); */
   1089  1.1  skrll 	  if (symp->bsym->flags & BSF_SRELC)
   1090  1.1  skrll 	    relc_symbol->bsym->flags |= BSF_SRELC;
   1091  1.1  skrll 	  else
   1092  1.1  skrll 	    relc_symbol->bsym->flags |= BSF_RELC;
   1093  1.1  skrll 	  /* symp->bsym->flags |= BSF_RELC; */
   1094  1.1  skrll 	  copy_symbol_attributes (symp, relc_symbol);
   1095  1.1  skrll 	  symp->sy_value.X_op = O_symbol;
   1096  1.1  skrll 	  symp->sy_value.X_add_symbol = relc_symbol;
   1097  1.1  skrll 	  symp->sy_value.X_add_number = 0;
   1098  1.1  skrll 	  resolved = 1;
   1099  1.1  skrll 	}
   1100  1.1  skrll 
   1101  1.1  skrll       final_seg = undefined_section;
   1102  1.1  skrll       goto exit_dont_set_value;
   1103  1.1  skrll     }
   1104  1.1  skrll #endif
   1105  1.1  skrll   else
   1106  1.1  skrll     {
   1107  1.1  skrll       symbolS *add_symbol, *op_symbol;
   1108  1.1  skrll       offsetT left, right;
   1109  1.1  skrll       segT seg_left, seg_right;
   1110  1.1  skrll       operatorT op;
   1111  1.1  skrll       int move_seg_ok;
   1112  1.1  skrll 
   1113  1.1  skrll       symp->sy_resolving = 1;
   1114  1.1  skrll 
   1115  1.1  skrll       /* Help out with CSE.  */
   1116  1.1  skrll       add_symbol = symp->sy_value.X_add_symbol;
   1117  1.1  skrll       op_symbol = symp->sy_value.X_op_symbol;
   1118  1.1  skrll       final_val = symp->sy_value.X_add_number;
   1119  1.1  skrll       op = symp->sy_value.X_op;
   1120  1.1  skrll 
   1121  1.1  skrll       switch (op)
   1122  1.1  skrll 	{
   1123  1.1  skrll 	default:
   1124  1.1  skrll 	  BAD_CASE (op);
   1125  1.1  skrll 	  break;
   1126  1.1  skrll 
   1127  1.1  skrll 	case O_absent:
   1128  1.1  skrll 	  final_val = 0;
   1129  1.1  skrll 	  /* Fall through.  */
   1130  1.1  skrll 
   1131  1.1  skrll 	case O_constant:
   1132  1.1  skrll 	  final_val += symp->sy_frag->fr_address / OCTETS_PER_BYTE;
   1133  1.1  skrll 	  if (final_seg == expr_section)
   1134  1.1  skrll 	    final_seg = absolute_section;
   1135  1.1  skrll 	  /* Fall through.  */
   1136  1.1  skrll 
   1137  1.1  skrll 	case O_register:
   1138  1.1  skrll 	  resolved = 1;
   1139  1.1  skrll 	  break;
   1140  1.1  skrll 
   1141  1.1  skrll 	case O_symbol:
   1142  1.1  skrll 	case O_symbol_rva:
   1143  1.1  skrll 	  left = resolve_symbol_value (add_symbol);
   1144  1.1  skrll 	  seg_left = S_GET_SEGMENT (add_symbol);
   1145  1.1  skrll 	  if (finalize_syms)
   1146  1.1  skrll 	    symp->sy_value.X_op_symbol = NULL;
   1147  1.1  skrll 
   1148  1.1  skrll 	do_symbol:
   1149  1.1  skrll 	  if (S_IS_WEAKREFR (symp))
   1150  1.1  skrll 	    {
   1151  1.1  skrll 	      assert (final_val == 0);
   1152  1.1  skrll 	      if (S_IS_WEAKREFR (add_symbol))
   1153  1.1  skrll 		{
   1154  1.1  skrll 		  assert (add_symbol->sy_value.X_op == O_symbol
   1155  1.1  skrll 			  && add_symbol->sy_value.X_add_number == 0);
   1156  1.1  skrll 		  add_symbol = add_symbol->sy_value.X_add_symbol;
   1157  1.1  skrll 		  assert (! S_IS_WEAKREFR (add_symbol));
   1158  1.1  skrll 		  symp->sy_value.X_add_symbol = add_symbol;
   1159  1.1  skrll 		}
   1160  1.1  skrll 	    }
   1161  1.1  skrll 
   1162  1.1  skrll 	  if (symp->sy_mri_common)
   1163  1.1  skrll 	    {
   1164  1.1  skrll 	      /* This is a symbol inside an MRI common section.  The
   1165  1.1  skrll 		 relocation routines are going to handle it specially.
   1166  1.1  skrll 		 Don't change the value.  */
   1167  1.1  skrll 	      resolved = symbol_resolved_p (add_symbol);
   1168  1.1  skrll 	      break;
   1169  1.1  skrll 	    }
   1170  1.1  skrll 
   1171  1.1  skrll 	  if (finalize_syms && final_val == 0)
   1172  1.1  skrll 	    {
   1173  1.1  skrll 	      if (LOCAL_SYMBOL_CHECK (add_symbol))
   1174  1.1  skrll 		add_symbol = local_symbol_convert ((struct local_symbol *)
   1175  1.1  skrll 						   add_symbol);
   1176  1.1  skrll 	      copy_symbol_attributes (symp, add_symbol);
   1177  1.1  skrll 	    }
   1178  1.1  skrll 
   1179  1.1  skrll 	  /* If we have equated this symbol to an undefined or common
   1180  1.1  skrll 	     symbol, keep X_op set to O_symbol, and don't change
   1181  1.1  skrll 	     X_add_number.  This permits the routine which writes out
   1182  1.1  skrll 	     relocation to detect this case, and convert the
   1183  1.1  skrll 	     relocation to be against the symbol to which this symbol
   1184  1.1  skrll 	     is equated.  */
   1185  1.1  skrll 	  if (! S_IS_DEFINED (add_symbol)
   1186  1.1  skrll #if defined (OBJ_COFF) && defined (TE_PE)
   1187  1.1  skrll 	      || S_IS_WEAK (add_symbol)
   1188  1.1  skrll #endif
   1189  1.1  skrll 	      || S_IS_COMMON (add_symbol))
   1190  1.1  skrll 	    {
   1191  1.1  skrll 	      if (finalize_syms)
   1192  1.1  skrll 		{
   1193  1.1  skrll 		  symp->sy_value.X_op = O_symbol;
   1194  1.1  skrll 		  symp->sy_value.X_add_symbol = add_symbol;
   1195  1.1  skrll 		  symp->sy_value.X_add_number = final_val;
   1196  1.1  skrll 		  /* Use X_op_symbol as a flag.  */
   1197  1.1  skrll 		  symp->sy_value.X_op_symbol = add_symbol;
   1198  1.1  skrll 		  final_seg = seg_left;
   1199  1.1  skrll 		}
   1200  1.1  skrll 	      final_val = 0;
   1201  1.1  skrll 	      resolved = symbol_resolved_p (add_symbol);
   1202  1.1  skrll 	      symp->sy_resolving = 0;
   1203  1.1  skrll 	      goto exit_dont_set_value;
   1204  1.1  skrll 	    }
   1205  1.1  skrll 	  else if (finalize_syms
   1206  1.1  skrll 		   && ((final_seg == expr_section && seg_left != expr_section)
   1207  1.1  skrll 		       || symbol_shadow_p (symp)))
   1208  1.1  skrll 	    {
   1209  1.1  skrll 	      /* If the symbol is an expression symbol, do similarly
   1210  1.1  skrll 		 as for undefined and common syms above.  Handles
   1211  1.1  skrll 		 "sym +/- expr" where "expr" cannot be evaluated
   1212  1.1  skrll 		 immediately, and we want relocations to be against
   1213  1.1  skrll 		 "sym", eg. because it is weak.  */
   1214  1.1  skrll 	      symp->sy_value.X_op = O_symbol;
   1215  1.1  skrll 	      symp->sy_value.X_add_symbol = add_symbol;
   1216  1.1  skrll 	      symp->sy_value.X_add_number = final_val;
   1217  1.1  skrll 	      symp->sy_value.X_op_symbol = add_symbol;
   1218  1.1  skrll 	      final_seg = seg_left;
   1219  1.1  skrll 	      final_val += symp->sy_frag->fr_address + left;
   1220  1.1  skrll 	      resolved = symbol_resolved_p (add_symbol);
   1221  1.1  skrll 	      symp->sy_resolving = 0;
   1222  1.1  skrll 	      goto exit_dont_set_value;
   1223  1.1  skrll 	    }
   1224  1.1  skrll 	  else
   1225  1.1  skrll 	    {
   1226  1.1  skrll 	      final_val += symp->sy_frag->fr_address + left;
   1227  1.1  skrll 	      if (final_seg == expr_section || final_seg == undefined_section)
   1228  1.1  skrll 		final_seg = seg_left;
   1229  1.1  skrll 	    }
   1230  1.1  skrll 
   1231  1.1  skrll 	  resolved = symbol_resolved_p (add_symbol);
   1232  1.1  skrll 	  if (S_IS_WEAKREFR (symp))
   1233  1.1  skrll 	    goto exit_dont_set_value;
   1234  1.1  skrll 	  break;
   1235  1.1  skrll 
   1236  1.1  skrll 	case O_uminus:
   1237  1.1  skrll 	case O_bit_not:
   1238  1.1  skrll 	case O_logical_not:
   1239  1.1  skrll 	  left = resolve_symbol_value (add_symbol);
   1240  1.1  skrll 	  seg_left = S_GET_SEGMENT (add_symbol);
   1241  1.1  skrll 
   1242  1.1  skrll 	  /* By reducing these to the relevant dyadic operator, we get
   1243  1.1  skrll 	     	!S -> S == 0 	permitted on anything,
   1244  1.1  skrll 		-S -> 0 - S 	only permitted on absolute
   1245  1.1  skrll 		~S -> S ^ ~0 	only permitted on absolute  */
   1246  1.1  skrll 	  if (op != O_logical_not && seg_left != absolute_section
   1247  1.1  skrll 	      && finalize_syms)
   1248  1.1  skrll 	    report_op_error (symp, add_symbol, NULL);
   1249  1.1  skrll 
   1250  1.1  skrll 	  if (final_seg == expr_section || final_seg == undefined_section)
   1251  1.1  skrll 	    final_seg = absolute_section;
   1252  1.1  skrll 
   1253  1.1  skrll 	  if (op == O_uminus)
   1254  1.1  skrll 	    left = -left;
   1255  1.1  skrll 	  else if (op == O_logical_not)
   1256  1.1  skrll 	    left = !left;
   1257  1.1  skrll 	  else
   1258  1.1  skrll 	    left = ~left;
   1259  1.1  skrll 
   1260  1.1  skrll 	  final_val += left + symp->sy_frag->fr_address;
   1261  1.1  skrll 
   1262  1.1  skrll 	  resolved = symbol_resolved_p (add_symbol);
   1263  1.1  skrll 	  break;
   1264  1.1  skrll 
   1265  1.1  skrll 	case O_multiply:
   1266  1.1  skrll 	case O_divide:
   1267  1.1  skrll 	case O_modulus:
   1268  1.1  skrll 	case O_left_shift:
   1269  1.1  skrll 	case O_right_shift:
   1270  1.1  skrll 	case O_bit_inclusive_or:
   1271  1.1  skrll 	case O_bit_or_not:
   1272  1.1  skrll 	case O_bit_exclusive_or:
   1273  1.1  skrll 	case O_bit_and:
   1274  1.1  skrll 	case O_add:
   1275  1.1  skrll 	case O_subtract:
   1276  1.1  skrll 	case O_eq:
   1277  1.1  skrll 	case O_ne:
   1278  1.1  skrll 	case O_lt:
   1279  1.1  skrll 	case O_le:
   1280  1.1  skrll 	case O_ge:
   1281  1.1  skrll 	case O_gt:
   1282  1.1  skrll 	case O_logical_and:
   1283  1.1  skrll 	case O_logical_or:
   1284  1.1  skrll 	  left = resolve_symbol_value (add_symbol);
   1285  1.1  skrll 	  right = resolve_symbol_value (op_symbol);
   1286  1.1  skrll 	  seg_left = S_GET_SEGMENT (add_symbol);
   1287  1.1  skrll 	  seg_right = S_GET_SEGMENT (op_symbol);
   1288  1.1  skrll 
   1289  1.1  skrll 	  /* Simplify addition or subtraction of a constant by folding the
   1290  1.1  skrll 	     constant into X_add_number.  */
   1291  1.1  skrll 	  if (op == O_add)
   1292  1.1  skrll 	    {
   1293  1.1  skrll 	      if (seg_right == absolute_section)
   1294  1.1  skrll 		{
   1295  1.1  skrll 		  final_val += right;
   1296  1.1  skrll 		  goto do_symbol;
   1297  1.1  skrll 		}
   1298  1.1  skrll 	      else if (seg_left == absolute_section)
   1299  1.1  skrll 		{
   1300  1.1  skrll 		  final_val += left;
   1301  1.1  skrll 		  add_symbol = op_symbol;
   1302  1.1  skrll 		  left = right;
   1303  1.1  skrll 		  seg_left = seg_right;
   1304  1.1  skrll 		  goto do_symbol;
   1305  1.1  skrll 		}
   1306  1.1  skrll 	    }
   1307  1.1  skrll 	  else if (op == O_subtract)
   1308  1.1  skrll 	    {
   1309  1.1  skrll 	      if (seg_right == absolute_section)
   1310  1.1  skrll 		{
   1311  1.1  skrll 		  final_val -= right;
   1312  1.1  skrll 		  goto do_symbol;
   1313  1.1  skrll 		}
   1314  1.1  skrll 	    }
   1315  1.1  skrll 
   1316  1.1  skrll 	  move_seg_ok = 1;
   1317  1.1  skrll 	  /* Equality and non-equality tests are permitted on anything.
   1318  1.1  skrll 	     Subtraction, and other comparison operators are permitted if
   1319  1.1  skrll 	     both operands are in the same section.  Otherwise, both
   1320  1.1  skrll 	     operands must be absolute.  We already handled the case of
   1321  1.1  skrll 	     addition or subtraction of a constant above.  This will
   1322  1.1  skrll 	     probably need to be changed for an object file format which
   1323  1.1  skrll 	     supports arbitrary expressions, such as IEEE-695.  */
   1324  1.1  skrll 	  if (!(seg_left == absolute_section
   1325  1.1  skrll 		   && seg_right == absolute_section)
   1326  1.1  skrll 	      && !(op == O_eq || op == O_ne)
   1327  1.1  skrll 	      && !((op == O_subtract
   1328  1.1  skrll 		    || op == O_lt || op == O_le || op == O_ge || op == O_gt)
   1329  1.1  skrll 		   && seg_left == seg_right
   1330  1.1  skrll 		   && (seg_left != undefined_section
   1331  1.1  skrll 		       || add_symbol == op_symbol)))
   1332  1.1  skrll 	    {
   1333  1.1  skrll 	      /* Don't emit messages unless we're finalizing the symbol value,
   1334  1.1  skrll 		 otherwise we may get the same message multiple times.  */
   1335  1.1  skrll 	      if (finalize_syms)
   1336  1.1  skrll 		report_op_error (symp, add_symbol, op_symbol);
   1337  1.1  skrll 	      /* However do not move the symbol into the absolute section
   1338  1.1  skrll 		 if it cannot currently be resolved - this would confuse
   1339  1.1  skrll 		 other parts of the assembler into believing that the
   1340  1.1  skrll 		 expression had been evaluated to zero.  */
   1341  1.1  skrll 	      else
   1342  1.1  skrll 		move_seg_ok = 0;
   1343  1.1  skrll 	    }
   1344  1.1  skrll 
   1345  1.1  skrll 	  if (move_seg_ok
   1346  1.1  skrll 	      && (final_seg == expr_section || final_seg == undefined_section))
   1347  1.1  skrll 	    final_seg = absolute_section;
   1348  1.1  skrll 
   1349  1.1  skrll 	  /* Check for division by zero.  */
   1350  1.1  skrll 	  if ((op == O_divide || op == O_modulus) && right == 0)
   1351  1.1  skrll 	    {
   1352  1.1  skrll 	      /* If seg_right is not absolute_section, then we've
   1353  1.1  skrll 		 already issued a warning about using a bad symbol.  */
   1354  1.1  skrll 	      if (seg_right == absolute_section && finalize_syms)
   1355  1.1  skrll 		{
   1356  1.1  skrll 		  char *file;
   1357  1.1  skrll 		  unsigned int line;
   1358  1.1  skrll 
   1359  1.1  skrll 		  if (expr_symbol_where (symp, &file, &line))
   1360  1.1  skrll 		    as_bad_where (file, line, _("division by zero"));
   1361  1.1  skrll 		  else
   1362  1.1  skrll 		    as_bad (_("division by zero when setting `%s'"),
   1363  1.1  skrll 			    S_GET_NAME (symp));
   1364  1.1  skrll 		}
   1365  1.1  skrll 
   1366  1.1  skrll 	      right = 1;
   1367  1.1  skrll 	    }
   1368  1.1  skrll 
   1369  1.1  skrll 	  switch (symp->sy_value.X_op)
   1370  1.1  skrll 	    {
   1371  1.1  skrll 	    case O_multiply:		left *= right; break;
   1372  1.1  skrll 	    case O_divide:		left /= right; break;
   1373  1.1  skrll 	    case O_modulus:		left %= right; break;
   1374  1.1  skrll 	    case O_left_shift:		left <<= right; break;
   1375  1.1  skrll 	    case O_right_shift:		left >>= right; break;
   1376  1.1  skrll 	    case O_bit_inclusive_or:	left |= right; break;
   1377  1.1  skrll 	    case O_bit_or_not:		left |= ~right; break;
   1378  1.1  skrll 	    case O_bit_exclusive_or:	left ^= right; break;
   1379  1.1  skrll 	    case O_bit_and:		left &= right; break;
   1380  1.1  skrll 	    case O_add:			left += right; break;
   1381  1.1  skrll 	    case O_subtract:		left -= right; break;
   1382  1.1  skrll 	    case O_eq:
   1383  1.1  skrll 	    case O_ne:
   1384  1.1  skrll 	      left = (left == right && seg_left == seg_right
   1385  1.1  skrll 		      && (seg_left != undefined_section
   1386  1.1  skrll 			  || add_symbol == op_symbol)
   1387  1.1  skrll 		      ? ~ (offsetT) 0 : 0);
   1388  1.1  skrll 	      if (symp->sy_value.X_op == O_ne)
   1389  1.1  skrll 		left = ~left;
   1390  1.1  skrll 	      break;
   1391  1.1  skrll 	    case O_lt:	left = left <  right ? ~ (offsetT) 0 : 0; break;
   1392  1.1  skrll 	    case O_le:	left = left <= right ? ~ (offsetT) 0 : 0; break;
   1393  1.1  skrll 	    case O_ge:	left = left >= right ? ~ (offsetT) 0 : 0; break;
   1394  1.1  skrll 	    case O_gt:	left = left >  right ? ~ (offsetT) 0 : 0; break;
   1395  1.1  skrll 	    case O_logical_and:	left = left && right; break;
   1396  1.1  skrll 	    case O_logical_or:	left = left || right; break;
   1397  1.1  skrll 	    default:		abort ();
   1398  1.1  skrll 	    }
   1399  1.1  skrll 
   1400  1.1  skrll 	  final_val += symp->sy_frag->fr_address + left;
   1401  1.1  skrll 	  if (final_seg == expr_section || final_seg == undefined_section)
   1402  1.1  skrll 	    {
   1403  1.1  skrll 	      if (seg_left == undefined_section
   1404  1.1  skrll 		  || seg_right == undefined_section)
   1405  1.1  skrll 		final_seg = undefined_section;
   1406  1.1  skrll 	      else if (seg_left == absolute_section)
   1407  1.1  skrll 		final_seg = seg_right;
   1408  1.1  skrll 	      else
   1409  1.1  skrll 		final_seg = seg_left;
   1410  1.1  skrll 	    }
   1411  1.1  skrll 	  resolved = (symbol_resolved_p (add_symbol)
   1412  1.1  skrll 		      && symbol_resolved_p (op_symbol));
   1413  1.1  skrll 	  break;
   1414  1.1  skrll 
   1415  1.1  skrll 	case O_big:
   1416  1.1  skrll 	case O_illegal:
   1417  1.1  skrll 	  /* Give an error (below) if not in expr_section.  We don't
   1418  1.1  skrll 	     want to worry about expr_section symbols, because they
   1419  1.1  skrll 	     are fictional (they are created as part of expression
   1420  1.1  skrll 	     resolution), and any problems may not actually mean
   1421  1.1  skrll 	     anything.  */
   1422  1.1  skrll 	  break;
   1423  1.1  skrll 	}
   1424  1.1  skrll 
   1425  1.1  skrll       symp->sy_resolving = 0;
   1426  1.1  skrll     }
   1427  1.1  skrll 
   1428  1.1  skrll   if (finalize_syms)
   1429  1.1  skrll     S_SET_VALUE (symp, final_val);
   1430  1.1  skrll 
   1431  1.1  skrll exit_dont_set_value:
   1432  1.1  skrll   /* Always set the segment, even if not finalizing the value.
   1433  1.1  skrll      The segment is used to determine whether a symbol is defined.  */
   1434  1.1  skrll     S_SET_SEGMENT (symp, final_seg);
   1435  1.1  skrll 
   1436  1.1  skrll   /* Don't worry if we can't resolve an expr_section symbol.  */
   1437  1.1  skrll   if (finalize_syms)
   1438  1.1  skrll     {
   1439  1.1  skrll       if (resolved)
   1440  1.1  skrll 	symp->sy_resolved = 1;
   1441  1.1  skrll       else if (S_GET_SEGMENT (symp) != expr_section)
   1442  1.1  skrll 	{
   1443  1.1  skrll 	  as_bad (_("can't resolve value for symbol `%s'"),
   1444  1.1  skrll 		  S_GET_NAME (symp));
   1445  1.1  skrll 	  symp->sy_resolved = 1;
   1446  1.1  skrll 	}
   1447  1.1  skrll     }
   1448  1.1  skrll 
   1449  1.1  skrll   return final_val;
   1450  1.1  skrll }
   1451  1.1  skrll 
   1452  1.1  skrll static void resolve_local_symbol (const char *, void *);
   1453  1.1  skrll 
   1454  1.1  skrll /* A static function passed to hash_traverse.  */
   1455  1.1  skrll 
   1456  1.1  skrll static void
   1457  1.1  skrll resolve_local_symbol (const char *key ATTRIBUTE_UNUSED, void *value)
   1458  1.1  skrll {
   1459  1.1  skrll   if (value != NULL)
   1460  1.1  skrll     resolve_symbol_value (value);
   1461  1.1  skrll }
   1462  1.1  skrll 
   1463  1.1  skrll /* Resolve all local symbols.  */
   1464  1.1  skrll 
   1465  1.1  skrll void
   1466  1.1  skrll resolve_local_symbol_values (void)
   1467  1.1  skrll {
   1468  1.1  skrll   hash_traverse (local_hash, resolve_local_symbol);
   1469  1.1  skrll }
   1470  1.1  skrll 
   1471  1.1  skrll /* Obtain the current value of a symbol without changing any
   1472  1.1  skrll    sub-expressions used.  */
   1473  1.1  skrll 
   1474  1.1  skrll int
   1475  1.1  skrll snapshot_symbol (symbolS **symbolPP, valueT *valueP, segT *segP, fragS **fragPP)
   1476  1.1  skrll {
   1477  1.1  skrll   symbolS *symbolP = *symbolPP;
   1478  1.1  skrll 
   1479  1.1  skrll   if (LOCAL_SYMBOL_CHECK (symbolP))
   1480  1.1  skrll     {
   1481  1.1  skrll       struct local_symbol *locsym = (struct local_symbol *) symbolP;
   1482  1.1  skrll 
   1483  1.1  skrll       *valueP = locsym->lsy_value;
   1484  1.1  skrll       *segP = locsym->lsy_section;
   1485  1.1  skrll       *fragPP = local_symbol_get_frag (locsym);
   1486  1.1  skrll     }
   1487  1.1  skrll   else
   1488  1.1  skrll     {
   1489  1.1  skrll       expressionS expr = symbolP->sy_value;
   1490  1.1  skrll 
   1491  1.1  skrll       if (!symbolP->sy_resolved && expr.X_op != O_illegal)
   1492  1.1  skrll 	{
   1493  1.1  skrll 	  int resolved;
   1494  1.1  skrll 
   1495  1.1  skrll 	  if (symbolP->sy_resolving)
   1496  1.1  skrll 	    return 0;
   1497  1.1  skrll 	  symbolP->sy_resolving = 1;
   1498  1.1  skrll 	  resolved = resolve_expression (&expr);
   1499  1.1  skrll 	  symbolP->sy_resolving = 0;
   1500  1.1  skrll 	  if (!resolved)
   1501  1.1  skrll 	    return 0;
   1502  1.1  skrll 
   1503  1.1  skrll 	  switch (expr.X_op)
   1504  1.1  skrll 	    {
   1505  1.1  skrll 	    case O_constant:
   1506  1.1  skrll 	    case O_register:
   1507  1.1  skrll 	      if (!symbol_equated_p (symbolP))
   1508  1.1  skrll 		break;
   1509  1.1  skrll 	      /* Fall thru.  */
   1510  1.1  skrll 	    case O_symbol:
   1511  1.1  skrll 	    case O_symbol_rva:
   1512  1.1  skrll 	      symbolP = expr.X_add_symbol;
   1513  1.1  skrll 	      break;
   1514  1.1  skrll 	    default:
   1515  1.1  skrll 	      return 0;
   1516  1.1  skrll 	    }
   1517  1.1  skrll 	}
   1518  1.1  skrll 
   1519  1.1  skrll       /* Never change a defined symbol.  */
   1520  1.1  skrll       if (symbolP->bsym->section == undefined_section
   1521  1.1  skrll 	  || symbolP->bsym->section == expr_section)
   1522  1.1  skrll 	*symbolPP = symbolP;
   1523  1.1  skrll       *valueP = expr.X_add_number;
   1524  1.1  skrll       *segP = symbolP->bsym->section;
   1525  1.1  skrll       *fragPP = symbolP->sy_frag;
   1526  1.1  skrll 
   1527  1.1  skrll       if (*segP == expr_section)
   1528  1.1  skrll 	switch (expr.X_op)
   1529  1.1  skrll 	  {
   1530  1.1  skrll 	  case O_constant: *segP = absolute_section; break;
   1531  1.1  skrll 	  case O_register: *segP = reg_section; break;
   1532  1.1  skrll 	  default: break;
   1533  1.1  skrll 	  }
   1534  1.1  skrll     }
   1535  1.1  skrll 
   1536  1.1  skrll   return 1;
   1537  1.1  skrll }
   1538  1.1  skrll 
   1539  1.1  skrll /* Dollar labels look like a number followed by a dollar sign.  Eg, "42$".
   1540  1.1  skrll    They are *really* local.  That is, they go out of scope whenever we see a
   1541  1.1  skrll    label that isn't local.  Also, like fb labels, there can be multiple
   1542  1.1  skrll    instances of a dollar label.  Therefor, we name encode each instance with
   1543  1.1  skrll    the instance number, keep a list of defined symbols separate from the real
   1544  1.1  skrll    symbol table, and we treat these buggers as a sparse array.  */
   1545  1.1  skrll 
   1546  1.1  skrll static long *dollar_labels;
   1547  1.1  skrll static long *dollar_label_instances;
   1548  1.1  skrll static char *dollar_label_defines;
   1549  1.1  skrll static unsigned long dollar_label_count;
   1550  1.1  skrll static unsigned long dollar_label_max;
   1551  1.1  skrll 
   1552  1.1  skrll int
   1553  1.1  skrll dollar_label_defined (long label)
   1554  1.1  skrll {
   1555  1.1  skrll   long *i;
   1556  1.1  skrll 
   1557  1.1  skrll   know ((dollar_labels != NULL) || (dollar_label_count == 0));
   1558  1.1  skrll 
   1559  1.1  skrll   for (i = dollar_labels; i < dollar_labels + dollar_label_count; ++i)
   1560  1.1  skrll     if (*i == label)
   1561  1.1  skrll       return dollar_label_defines[i - dollar_labels];
   1562  1.1  skrll 
   1563  1.1  skrll   /* If we get here, label isn't defined.  */
   1564  1.1  skrll   return 0;
   1565  1.1  skrll }
   1566  1.1  skrll 
   1567  1.1  skrll static long
   1568  1.1  skrll dollar_label_instance (long label)
   1569  1.1  skrll {
   1570  1.1  skrll   long *i;
   1571  1.1  skrll 
   1572  1.1  skrll   know ((dollar_labels != NULL) || (dollar_label_count == 0));
   1573  1.1  skrll 
   1574  1.1  skrll   for (i = dollar_labels; i < dollar_labels + dollar_label_count; ++i)
   1575  1.1  skrll     if (*i == label)
   1576  1.1  skrll       return (dollar_label_instances[i - dollar_labels]);
   1577  1.1  skrll 
   1578  1.1  skrll   /* If we get here, we haven't seen the label before.
   1579  1.1  skrll      Therefore its instance count is zero.  */
   1580  1.1  skrll   return 0;
   1581  1.1  skrll }
   1582  1.1  skrll 
   1583  1.1  skrll void
   1584  1.1  skrll dollar_label_clear (void)
   1585  1.1  skrll {
   1586  1.1  skrll   memset (dollar_label_defines, '\0', (unsigned int) dollar_label_count);
   1587  1.1  skrll }
   1588  1.1  skrll 
   1589  1.1  skrll #define DOLLAR_LABEL_BUMP_BY 10
   1590  1.1  skrll 
   1591  1.1  skrll void
   1592  1.1  skrll define_dollar_label (long label)
   1593  1.1  skrll {
   1594  1.1  skrll   long *i;
   1595  1.1  skrll 
   1596  1.1  skrll   for (i = dollar_labels; i < dollar_labels + dollar_label_count; ++i)
   1597  1.1  skrll     if (*i == label)
   1598  1.1  skrll       {
   1599  1.1  skrll 	++dollar_label_instances[i - dollar_labels];
   1600  1.1  skrll 	dollar_label_defines[i - dollar_labels] = 1;
   1601  1.1  skrll 	return;
   1602  1.1  skrll       }
   1603  1.1  skrll 
   1604  1.1  skrll   /* If we get to here, we don't have label listed yet.  */
   1605  1.1  skrll 
   1606  1.1  skrll   if (dollar_labels == NULL)
   1607  1.1  skrll     {
   1608  1.1  skrll       dollar_labels = (long *) xmalloc (DOLLAR_LABEL_BUMP_BY * sizeof (long));
   1609  1.1  skrll       dollar_label_instances = (long *) xmalloc (DOLLAR_LABEL_BUMP_BY * sizeof (long));
   1610  1.1  skrll       dollar_label_defines = xmalloc (DOLLAR_LABEL_BUMP_BY);
   1611  1.1  skrll       dollar_label_max = DOLLAR_LABEL_BUMP_BY;
   1612  1.1  skrll       dollar_label_count = 0;
   1613  1.1  skrll     }
   1614  1.1  skrll   else if (dollar_label_count == dollar_label_max)
   1615  1.1  skrll     {
   1616  1.1  skrll       dollar_label_max += DOLLAR_LABEL_BUMP_BY;
   1617  1.1  skrll       dollar_labels = (long *) xrealloc ((char *) dollar_labels,
   1618  1.1  skrll 					 dollar_label_max * sizeof (long));
   1619  1.1  skrll       dollar_label_instances = (long *) xrealloc ((char *) dollar_label_instances,
   1620  1.1  skrll 					  dollar_label_max * sizeof (long));
   1621  1.1  skrll       dollar_label_defines = xrealloc (dollar_label_defines, dollar_label_max);
   1622  1.1  skrll     }				/* if we needed to grow  */
   1623  1.1  skrll 
   1624  1.1  skrll   dollar_labels[dollar_label_count] = label;
   1625  1.1  skrll   dollar_label_instances[dollar_label_count] = 1;
   1626  1.1  skrll   dollar_label_defines[dollar_label_count] = 1;
   1627  1.1  skrll   ++dollar_label_count;
   1628  1.1  skrll }
   1629  1.1  skrll 
   1630  1.1  skrll /* Caller must copy returned name: we re-use the area for the next name.
   1631  1.1  skrll 
   1632  1.1  skrll    The mth occurence of label n: is turned into the symbol "Ln^Am"
   1633  1.1  skrll    where n is the label number and m is the instance number. "L" makes
   1634  1.1  skrll    it a label discarded unless debugging and "^A"('\1') ensures no
   1635  1.1  skrll    ordinary symbol SHOULD get the same name as a local label
   1636  1.1  skrll    symbol. The first "4:" is "L4^A1" - the m numbers begin at 1.
   1637  1.1  skrll 
   1638  1.1  skrll    fb labels get the same treatment, except that ^B is used in place
   1639  1.1  skrll    of ^A.  */
   1640  1.1  skrll 
   1641  1.1  skrll char *				/* Return local label name.  */
   1642  1.1  skrll dollar_label_name (register long n,	/* we just saw "n$:" : n a number.  */
   1643  1.1  skrll 		   register int augend	/* 0 for current instance, 1 for new instance.  */)
   1644  1.1  skrll {
   1645  1.1  skrll   long i;
   1646  1.1  skrll   /* Returned to caller, then copied.  Used for created names ("4f").  */
   1647  1.1  skrll   static char symbol_name_build[24];
   1648  1.1  skrll   register char *p;
   1649  1.1  skrll   register char *q;
   1650  1.1  skrll   char symbol_name_temporary[20];	/* Build up a number, BACKWARDS.  */
   1651  1.1  skrll 
   1652  1.1  skrll   know (n >= 0);
   1653  1.1  skrll   know (augend == 0 || augend == 1);
   1654  1.1  skrll   p = symbol_name_build;
   1655  1.1  skrll #ifdef LOCAL_LABEL_PREFIX
   1656  1.1  skrll   *p++ = LOCAL_LABEL_PREFIX;
   1657  1.1  skrll #endif
   1658  1.1  skrll   *p++ = 'L';
   1659  1.1  skrll 
   1660  1.1  skrll   /* Next code just does sprintf( {}, "%d", n);  */
   1661  1.1  skrll   /* Label number.  */
   1662  1.1  skrll   q = symbol_name_temporary;
   1663  1.1  skrll   for (*q++ = 0, i = n; i; ++q)
   1664  1.1  skrll     {
   1665  1.1  skrll       *q = i % 10 + '0';
   1666  1.1  skrll       i /= 10;
   1667  1.1  skrll     }
   1668  1.1  skrll   while ((*p = *--q) != '\0')
   1669  1.1  skrll     ++p;
   1670  1.1  skrll 
   1671  1.1  skrll   *p++ = DOLLAR_LABEL_CHAR;		/* ^A  */
   1672  1.1  skrll 
   1673  1.1  skrll   /* Instance number.  */
   1674  1.1  skrll   q = symbol_name_temporary;
   1675  1.1  skrll   for (*q++ = 0, i = dollar_label_instance (n) + augend; i; ++q)
   1676  1.1  skrll     {
   1677  1.1  skrll       *q = i % 10 + '0';
   1678  1.1  skrll       i /= 10;
   1679  1.1  skrll     }
   1680  1.1  skrll   while ((*p++ = *--q) != '\0');;
   1681  1.1  skrll 
   1682  1.1  skrll   /* The label, as a '\0' ended string, starts at symbol_name_build.  */
   1683  1.1  skrll   return symbol_name_build;
   1684  1.1  skrll }
   1685  1.1  skrll 
   1686  1.1  skrll /* Somebody else's idea of local labels. They are made by "n:" where n
   1687  1.1  skrll    is any decimal digit. Refer to them with
   1688  1.1  skrll     "nb" for previous (backward) n:
   1689  1.1  skrll    or "nf" for next (forward) n:.
   1690  1.1  skrll 
   1691  1.1  skrll    We do a little better and let n be any number, not just a single digit, but
   1692  1.1  skrll    since the other guy's assembler only does ten, we treat the first ten
   1693  1.1  skrll    specially.
   1694  1.1  skrll 
   1695  1.1  skrll    Like someone else's assembler, we have one set of local label counters for
   1696  1.1  skrll    entire assembly, not one set per (sub)segment like in most assemblers. This
   1697  1.1  skrll    implies that one can refer to a label in another segment, and indeed some
   1698  1.1  skrll    crufty compilers have done just that.
   1699  1.1  skrll 
   1700  1.1  skrll    Since there could be a LOT of these things, treat them as a sparse
   1701  1.1  skrll    array.  */
   1702  1.1  skrll 
   1703  1.1  skrll #define FB_LABEL_SPECIAL (10)
   1704  1.1  skrll 
   1705  1.1  skrll static long fb_low_counter[FB_LABEL_SPECIAL];
   1706  1.1  skrll static long *fb_labels;
   1707  1.1  skrll static long *fb_label_instances;
   1708  1.1  skrll static long fb_label_count;
   1709  1.1  skrll static long fb_label_max;
   1710  1.1  skrll 
   1711  1.1  skrll /* This must be more than FB_LABEL_SPECIAL.  */
   1712  1.1  skrll #define FB_LABEL_BUMP_BY (FB_LABEL_SPECIAL + 6)
   1713  1.1  skrll 
   1714  1.1  skrll static void
   1715  1.1  skrll fb_label_init (void)
   1716  1.1  skrll {
   1717  1.1  skrll   memset ((void *) fb_low_counter, '\0', sizeof (fb_low_counter));
   1718  1.1  skrll }
   1719  1.1  skrll 
   1720  1.1  skrll /* Add one to the instance number of this fb label.  */
   1721  1.1  skrll 
   1722  1.1  skrll void
   1723  1.1  skrll fb_label_instance_inc (long label)
   1724  1.1  skrll {
   1725  1.1  skrll   long *i;
   1726  1.1  skrll 
   1727  1.1  skrll   if (label < FB_LABEL_SPECIAL)
   1728  1.1  skrll     {
   1729  1.1  skrll       ++fb_low_counter[label];
   1730  1.1  skrll       return;
   1731  1.1  skrll     }
   1732  1.1  skrll 
   1733  1.1  skrll   if (fb_labels != NULL)
   1734  1.1  skrll     {
   1735  1.1  skrll       for (i = fb_labels + FB_LABEL_SPECIAL;
   1736  1.1  skrll 	   i < fb_labels + fb_label_count; ++i)
   1737  1.1  skrll 	{
   1738  1.1  skrll 	  if (*i == label)
   1739  1.1  skrll 	    {
   1740  1.1  skrll 	      ++fb_label_instances[i - fb_labels];
   1741  1.1  skrll 	      return;
   1742  1.1  skrll 	    }			/* if we find it  */
   1743  1.1  skrll 	}			/* for each existing label  */
   1744  1.1  skrll     }
   1745  1.1  skrll 
   1746  1.1  skrll   /* If we get to here, we don't have label listed yet.  */
   1747  1.1  skrll 
   1748  1.1  skrll   if (fb_labels == NULL)
   1749  1.1  skrll     {
   1750  1.1  skrll       fb_labels = (long *) xmalloc (FB_LABEL_BUMP_BY * sizeof (long));
   1751  1.1  skrll       fb_label_instances = (long *) xmalloc (FB_LABEL_BUMP_BY * sizeof (long));
   1752  1.1  skrll       fb_label_max = FB_LABEL_BUMP_BY;
   1753  1.1  skrll       fb_label_count = FB_LABEL_SPECIAL;
   1754  1.1  skrll 
   1755  1.1  skrll     }
   1756  1.1  skrll   else if (fb_label_count == fb_label_max)
   1757  1.1  skrll     {
   1758  1.1  skrll       fb_label_max += FB_LABEL_BUMP_BY;
   1759  1.1  skrll       fb_labels = (long *) xrealloc ((char *) fb_labels,
   1760  1.1  skrll 				     fb_label_max * sizeof (long));
   1761  1.1  skrll       fb_label_instances = (long *) xrealloc ((char *) fb_label_instances,
   1762  1.1  skrll 					      fb_label_max * sizeof (long));
   1763  1.1  skrll     }				/* if we needed to grow  */
   1764  1.1  skrll 
   1765  1.1  skrll   fb_labels[fb_label_count] = label;
   1766  1.1  skrll   fb_label_instances[fb_label_count] = 1;
   1767  1.1  skrll   ++fb_label_count;
   1768  1.1  skrll }
   1769  1.1  skrll 
   1770  1.1  skrll static long
   1771  1.1  skrll fb_label_instance (long label)
   1772  1.1  skrll {
   1773  1.1  skrll   long *i;
   1774  1.1  skrll 
   1775  1.1  skrll   if (label < FB_LABEL_SPECIAL)
   1776  1.1  skrll     {
   1777  1.1  skrll       return (fb_low_counter[label]);
   1778  1.1  skrll     }
   1779  1.1  skrll 
   1780  1.1  skrll   if (fb_labels != NULL)
   1781  1.1  skrll     {
   1782  1.1  skrll       for (i = fb_labels + FB_LABEL_SPECIAL;
   1783  1.1  skrll 	   i < fb_labels + fb_label_count; ++i)
   1784  1.1  skrll 	{
   1785  1.1  skrll 	  if (*i == label)
   1786  1.1  skrll 	    {
   1787  1.1  skrll 	      return (fb_label_instances[i - fb_labels]);
   1788  1.1  skrll 	    }			/* if we find it  */
   1789  1.1  skrll 	}			/* for each existing label  */
   1790  1.1  skrll     }
   1791  1.1  skrll 
   1792  1.1  skrll   /* We didn't find the label, so this must be a reference to the
   1793  1.1  skrll      first instance.  */
   1794  1.1  skrll   return 0;
   1795  1.1  skrll }
   1796  1.1  skrll 
   1797  1.1  skrll /* Caller must copy returned name: we re-use the area for the next name.
   1798  1.1  skrll 
   1799  1.1  skrll    The mth occurence of label n: is turned into the symbol "Ln^Bm"
   1800  1.1  skrll    where n is the label number and m is the instance number. "L" makes
   1801  1.1  skrll    it a label discarded unless debugging and "^B"('\2') ensures no
   1802  1.1  skrll    ordinary symbol SHOULD get the same name as a local label
   1803  1.1  skrll    symbol. The first "4:" is "L4^B1" - the m numbers begin at 1.
   1804  1.1  skrll 
   1805  1.1  skrll    dollar labels get the same treatment, except that ^A is used in
   1806  1.1  skrll    place of ^B.  */
   1807  1.1  skrll 
   1808  1.1  skrll char *				/* Return local label name.  */
   1809  1.1  skrll fb_label_name (long n,	/* We just saw "n:", "nf" or "nb" : n a number.  */
   1810  1.1  skrll 	       long augend	/* 0 for nb, 1 for n:, nf.  */)
   1811  1.1  skrll {
   1812  1.1  skrll   long i;
   1813  1.1  skrll   /* Returned to caller, then copied.  Used for created names ("4f").  */
   1814  1.1  skrll   static char symbol_name_build[24];
   1815  1.1  skrll   register char *p;
   1816  1.1  skrll   register char *q;
   1817  1.1  skrll   char symbol_name_temporary[20];	/* Build up a number, BACKWARDS.  */
   1818  1.1  skrll 
   1819  1.1  skrll   know (n >= 0);
   1820  1.1  skrll #ifdef TC_MMIX
   1821  1.1  skrll   know ((unsigned long) augend <= 2 /* See mmix_fb_label.  */);
   1822  1.1  skrll #else
   1823  1.1  skrll   know ((unsigned long) augend <= 1);
   1824  1.1  skrll #endif
   1825  1.1  skrll   p = symbol_name_build;
   1826  1.1  skrll #ifdef LOCAL_LABEL_PREFIX
   1827  1.1  skrll   *p++ = LOCAL_LABEL_PREFIX;
   1828  1.1  skrll #endif
   1829  1.1  skrll   *p++ = 'L';
   1830  1.1  skrll 
   1831  1.1  skrll   /* Next code just does sprintf( {}, "%d", n);  */
   1832  1.1  skrll   /* Label number.  */
   1833  1.1  skrll   q = symbol_name_temporary;
   1834  1.1  skrll   for (*q++ = 0, i = n; i; ++q)
   1835  1.1  skrll     {
   1836  1.1  skrll       *q = i % 10 + '0';
   1837  1.1  skrll       i /= 10;
   1838  1.1  skrll     }
   1839  1.1  skrll   while ((*p = *--q) != '\0')
   1840  1.1  skrll     ++p;
   1841  1.1  skrll 
   1842  1.1  skrll   *p++ = LOCAL_LABEL_CHAR;		/* ^B  */
   1843  1.1  skrll 
   1844  1.1  skrll   /* Instance number.  */
   1845  1.1  skrll   q = symbol_name_temporary;
   1846  1.1  skrll   for (*q++ = 0, i = fb_label_instance (n) + augend; i; ++q)
   1847  1.1  skrll     {
   1848  1.1  skrll       *q = i % 10 + '0';
   1849  1.1  skrll       i /= 10;
   1850  1.1  skrll     }
   1851  1.1  skrll   while ((*p++ = *--q) != '\0');;
   1852  1.1  skrll 
   1853  1.1  skrll   /* The label, as a '\0' ended string, starts at symbol_name_build.  */
   1854  1.1  skrll   return (symbol_name_build);
   1855  1.1  skrll }
   1856  1.1  skrll 
   1857  1.1  skrll /* Decode name that may have been generated by foo_label_name() above.
   1858  1.1  skrll    If the name wasn't generated by foo_label_name(), then return it
   1859  1.1  skrll    unaltered.  This is used for error messages.  */
   1860  1.1  skrll 
   1861  1.1  skrll char *
   1862  1.1  skrll decode_local_label_name (char *s)
   1863  1.1  skrll {
   1864  1.1  skrll   char *p;
   1865  1.1  skrll   char *symbol_decode;
   1866  1.1  skrll   int label_number;
   1867  1.1  skrll   int instance_number;
   1868  1.1  skrll   char *type;
   1869  1.1  skrll   const char *message_format;
   1870  1.1  skrll   int index = 0;
   1871  1.1  skrll 
   1872  1.1  skrll #ifdef LOCAL_LABEL_PREFIX
   1873  1.1  skrll   if (s[index] == LOCAL_LABEL_PREFIX)
   1874  1.1  skrll     ++index;
   1875  1.1  skrll #endif
   1876  1.1  skrll 
   1877  1.1  skrll   if (s[index] != 'L')
   1878  1.1  skrll     return s;
   1879  1.1  skrll 
   1880  1.1  skrll   for (label_number = 0, p = s + index + 1; ISDIGIT (*p); ++p)
   1881  1.1  skrll     label_number = (10 * label_number) + *p - '0';
   1882  1.1  skrll 
   1883  1.1  skrll   if (*p == DOLLAR_LABEL_CHAR)
   1884  1.1  skrll     type = "dollar";
   1885  1.1  skrll   else if (*p == LOCAL_LABEL_CHAR)
   1886  1.1  skrll     type = "fb";
   1887  1.1  skrll   else
   1888  1.1  skrll     return s;
   1889  1.1  skrll 
   1890  1.1  skrll   for (instance_number = 0, p++; ISDIGIT (*p); ++p)
   1891  1.1  skrll     instance_number = (10 * instance_number) + *p - '0';
   1892  1.1  skrll 
   1893  1.1  skrll   message_format = _("\"%d\" (instance number %d of a %s label)");
   1894  1.1  skrll   symbol_decode = obstack_alloc (&notes, strlen (message_format) + 30);
   1895  1.1  skrll   sprintf (symbol_decode, message_format, label_number, instance_number, type);
   1896  1.1  skrll 
   1897  1.1  skrll   return symbol_decode;
   1898  1.1  skrll }
   1899  1.1  skrll 
   1900  1.1  skrll /* Get the value of a symbol.  */
   1901  1.1  skrll 
   1902  1.1  skrll valueT
   1903  1.1  skrll S_GET_VALUE (symbolS *s)
   1904  1.1  skrll {
   1905  1.1  skrll   if (LOCAL_SYMBOL_CHECK (s))
   1906  1.1  skrll     return resolve_symbol_value (s);
   1907  1.1  skrll 
   1908  1.1  skrll   if (!s->sy_resolved)
   1909  1.1  skrll     {
   1910  1.1  skrll       valueT val = resolve_symbol_value (s);
   1911  1.1  skrll       if (!finalize_syms)
   1912  1.1  skrll 	return val;
   1913  1.1  skrll     }
   1914  1.1  skrll   if (S_IS_WEAKREFR (s))
   1915  1.1  skrll     return S_GET_VALUE (s->sy_value.X_add_symbol);
   1916  1.1  skrll 
   1917  1.1  skrll   if (s->sy_value.X_op != O_constant)
   1918  1.1  skrll     {
   1919  1.1  skrll       if (! s->sy_resolved
   1920  1.1  skrll 	  || s->sy_value.X_op != O_symbol
   1921  1.1  skrll 	  || (S_IS_DEFINED (s) && ! S_IS_COMMON (s)))
   1922  1.1  skrll 	as_bad (_("attempt to get value of unresolved symbol `%s'"),
   1923  1.1  skrll 		S_GET_NAME (s));
   1924  1.1  skrll     }
   1925  1.1  skrll   return (valueT) s->sy_value.X_add_number;
   1926  1.1  skrll }
   1927  1.1  skrll 
   1928  1.1  skrll /* Set the value of a symbol.  */
   1929  1.1  skrll 
   1930  1.1  skrll void
   1931  1.1  skrll S_SET_VALUE (symbolS *s, valueT val)
   1932  1.1  skrll {
   1933  1.1  skrll   if (LOCAL_SYMBOL_CHECK (s))
   1934  1.1  skrll     {
   1935  1.1  skrll       ((struct local_symbol *) s)->lsy_value = val;
   1936  1.1  skrll       return;
   1937  1.1  skrll     }
   1938  1.1  skrll 
   1939  1.1  skrll   s->sy_value.X_op = O_constant;
   1940  1.1  skrll   s->sy_value.X_add_number = (offsetT) val;
   1941  1.1  skrll   s->sy_value.X_unsigned = 0;
   1942  1.1  skrll   S_CLEAR_WEAKREFR (s);
   1943  1.1  skrll }
   1944  1.1  skrll 
   1945  1.1  skrll void
   1946  1.1  skrll copy_symbol_attributes (symbolS *dest, symbolS *src)
   1947  1.1  skrll {
   1948  1.1  skrll   if (LOCAL_SYMBOL_CHECK (dest))
   1949  1.1  skrll     dest = local_symbol_convert ((struct local_symbol *) dest);
   1950  1.1  skrll   if (LOCAL_SYMBOL_CHECK (src))
   1951  1.1  skrll     src = local_symbol_convert ((struct local_symbol *) src);
   1952  1.1  skrll 
   1953  1.1  skrll   /* In an expression, transfer the settings of these flags.
   1954  1.1  skrll      The user can override later, of course.  */
   1955  1.1  skrll #define COPIED_SYMFLAGS	(BSF_FUNCTION | BSF_OBJECT)
   1956  1.1  skrll   dest->bsym->flags |= src->bsym->flags & COPIED_SYMFLAGS;
   1957  1.1  skrll 
   1958  1.1  skrll #ifdef OBJ_COPY_SYMBOL_ATTRIBUTES
   1959  1.1  skrll   OBJ_COPY_SYMBOL_ATTRIBUTES (dest, src);
   1960  1.1  skrll #endif
   1961  1.1  skrll 
   1962  1.1  skrll #ifdef TC_COPY_SYMBOL_ATTRIBUTES
   1963  1.1  skrll   TC_COPY_SYMBOL_ATTRIBUTES (dest, src);
   1964  1.1  skrll #endif
   1965  1.1  skrll }
   1966  1.1  skrll 
   1967  1.1  skrll int
   1968  1.1  skrll S_IS_FUNCTION (symbolS *s)
   1969  1.1  skrll {
   1970  1.1  skrll   flagword flags;
   1971  1.1  skrll 
   1972  1.1  skrll   if (LOCAL_SYMBOL_CHECK (s))
   1973  1.1  skrll     return 0;
   1974  1.1  skrll 
   1975  1.1  skrll   flags = s->bsym->flags;
   1976  1.1  skrll 
   1977  1.1  skrll   return (flags & BSF_FUNCTION) != 0;
   1978  1.1  skrll }
   1979  1.1  skrll 
   1980  1.1  skrll int
   1981  1.1  skrll S_IS_EXTERNAL (symbolS *s)
   1982  1.1  skrll {
   1983  1.1  skrll   flagword flags;
   1984  1.1  skrll 
   1985  1.1  skrll   if (LOCAL_SYMBOL_CHECK (s))
   1986  1.1  skrll     return 0;
   1987  1.1  skrll 
   1988  1.1  skrll   flags = s->bsym->flags;
   1989  1.1  skrll 
   1990  1.1  skrll   /* Sanity check.  */
   1991  1.1  skrll   if ((flags & BSF_LOCAL) && (flags & BSF_GLOBAL))
   1992  1.1  skrll     abort ();
   1993  1.1  skrll 
   1994  1.1  skrll   return (flags & BSF_GLOBAL) != 0;
   1995  1.1  skrll }
   1996  1.1  skrll 
   1997  1.1  skrll int
   1998  1.1  skrll S_IS_WEAK (symbolS *s)
   1999  1.1  skrll {
   2000  1.1  skrll   if (LOCAL_SYMBOL_CHECK (s))
   2001  1.1  skrll     return 0;
   2002  1.1  skrll   /* Conceptually, a weakrefr is weak if the referenced symbol is.  We
   2003  1.1  skrll      could probably handle a WEAKREFR as always weak though.  E.g., if
   2004  1.1  skrll      the referenced symbol has lost its weak status, there's no reason
   2005  1.1  skrll      to keep handling the weakrefr as if it was weak.  */
   2006  1.1  skrll   if (S_IS_WEAKREFR (s))
   2007  1.1  skrll     return S_IS_WEAK (s->sy_value.X_add_symbol);
   2008  1.1  skrll   return (s->bsym->flags & BSF_WEAK) != 0;
   2009  1.1  skrll }
   2010  1.1  skrll 
   2011  1.1  skrll int
   2012  1.1  skrll S_IS_WEAKREFR (symbolS *s)
   2013  1.1  skrll {
   2014  1.1  skrll   if (LOCAL_SYMBOL_CHECK (s))
   2015  1.1  skrll     return 0;
   2016  1.1  skrll   return s->sy_weakrefr != 0;
   2017  1.1  skrll }
   2018  1.1  skrll 
   2019  1.1  skrll int
   2020  1.1  skrll S_IS_WEAKREFD (symbolS *s)
   2021  1.1  skrll {
   2022  1.1  skrll   if (LOCAL_SYMBOL_CHECK (s))
   2023  1.1  skrll     return 0;
   2024  1.1  skrll   return s->sy_weakrefd != 0;
   2025  1.1  skrll }
   2026  1.1  skrll 
   2027  1.1  skrll int
   2028  1.1  skrll S_IS_COMMON (symbolS *s)
   2029  1.1  skrll {
   2030  1.1  skrll   if (LOCAL_SYMBOL_CHECK (s))
   2031  1.1  skrll     return 0;
   2032  1.1  skrll   return bfd_is_com_section (s->bsym->section);
   2033  1.1  skrll }
   2034  1.1  skrll 
   2035  1.1  skrll int
   2036  1.1  skrll S_IS_DEFINED (symbolS *s)
   2037  1.1  skrll {
   2038  1.1  skrll   if (LOCAL_SYMBOL_CHECK (s))
   2039  1.1  skrll     return ((struct local_symbol *) s)->lsy_section != undefined_section;
   2040  1.1  skrll   return s->bsym->section != undefined_section;
   2041  1.1  skrll }
   2042  1.1  skrll 
   2043  1.1  skrll 
   2044  1.1  skrll #ifndef EXTERN_FORCE_RELOC
   2045  1.1  skrll #define EXTERN_FORCE_RELOC IS_ELF
   2046  1.1  skrll #endif
   2047  1.1  skrll 
   2048  1.1  skrll /* Return true for symbols that should not be reduced to section
   2049  1.1  skrll    symbols or eliminated from expressions, because they may be
   2050  1.1  skrll    overridden by the linker.  */
   2051  1.1  skrll int
   2052  1.1  skrll S_FORCE_RELOC (symbolS *s, int strict)
   2053  1.1  skrll {
   2054  1.1  skrll   if (LOCAL_SYMBOL_CHECK (s))
   2055  1.1  skrll     return ((struct local_symbol *) s)->lsy_section == undefined_section;
   2056  1.1  skrll 
   2057  1.1  skrll   return ((strict
   2058  1.1  skrll 	   && ((s->bsym->flags & BSF_WEAK) != 0
   2059  1.1  skrll 	       || (EXTERN_FORCE_RELOC
   2060  1.1  skrll 		   && (s->bsym->flags & BSF_GLOBAL) != 0)))
   2061  1.1  skrll 	  || s->bsym->section == undefined_section
   2062  1.1  skrll 	  || bfd_is_com_section (s->bsym->section));
   2063  1.1  skrll }
   2064  1.1  skrll 
   2065  1.1  skrll int
   2066  1.1  skrll S_IS_DEBUG (symbolS *s)
   2067  1.1  skrll {
   2068  1.1  skrll   if (LOCAL_SYMBOL_CHECK (s))
   2069  1.1  skrll     return 0;
   2070  1.1  skrll   if (s->bsym->flags & BSF_DEBUGGING)
   2071  1.1  skrll     return 1;
   2072  1.1  skrll   return 0;
   2073  1.1  skrll }
   2074  1.1  skrll 
   2075  1.1  skrll int
   2076  1.1  skrll S_IS_LOCAL (symbolS *s)
   2077  1.1  skrll {
   2078  1.1  skrll   flagword flags;
   2079  1.1  skrll   const char *name;
   2080  1.1  skrll 
   2081  1.1  skrll   if (LOCAL_SYMBOL_CHECK (s))
   2082  1.1  skrll     return 1;
   2083  1.1  skrll 
   2084  1.1  skrll   flags = s->bsym->flags;
   2085  1.1  skrll 
   2086  1.1  skrll   /* Sanity check.  */
   2087  1.1  skrll   if ((flags & BSF_LOCAL) && (flags & BSF_GLOBAL))
   2088  1.1  skrll     abort ();
   2089  1.1  skrll 
   2090  1.1  skrll   if (bfd_get_section (s->bsym) == reg_section)
   2091  1.1  skrll     return 1;
   2092  1.1  skrll 
   2093  1.1  skrll   if (flag_strip_local_absolute
   2094  1.1  skrll       /* Keep BSF_FILE symbols in order to allow debuggers to identify
   2095  1.1  skrll 	 the source file even when the object file is stripped.  */
   2096  1.1  skrll       && (flags & (BSF_GLOBAL | BSF_FILE)) == 0
   2097  1.1  skrll       && bfd_get_section (s->bsym) == absolute_section)
   2098  1.1  skrll     return 1;
   2099  1.1  skrll 
   2100  1.1  skrll   name = S_GET_NAME (s);
   2101  1.1  skrll   return (name != NULL
   2102  1.1  skrll 	  && ! S_IS_DEBUG (s)
   2103  1.1  skrll 	  && (strchr (name, DOLLAR_LABEL_CHAR)
   2104  1.1  skrll 	      || strchr (name, LOCAL_LABEL_CHAR)
   2105  1.1  skrll 	      || (! flag_keep_locals
   2106  1.1  skrll 		  && (bfd_is_local_label (stdoutput, s->bsym)
   2107  1.1  skrll 		      || (flag_mri
   2108  1.1  skrll 			  && name[0] == '?'
   2109  1.1  skrll 			  && name[1] == '?')))));
   2110  1.1  skrll }
   2111  1.1  skrll 
   2112  1.1  skrll int
   2113  1.1  skrll S_IS_STABD (symbolS *s)
   2114  1.1  skrll {
   2115  1.1  skrll   return S_GET_NAME (s) == 0;
   2116  1.1  skrll }
   2117  1.1  skrll 
   2118  1.1  skrll int
   2119  1.1  skrll S_IS_VOLATILE (const symbolS *s)
   2120  1.1  skrll {
   2121  1.1  skrll   if (LOCAL_SYMBOL_CHECK (s))
   2122  1.1  skrll     return 0;
   2123  1.1  skrll   return s->sy_volatile;
   2124  1.1  skrll }
   2125  1.1  skrll 
   2126  1.1  skrll int
   2127  1.1  skrll S_IS_FORWARD_REF (const symbolS *s)
   2128  1.1  skrll {
   2129  1.1  skrll   if (LOCAL_SYMBOL_CHECK (s))
   2130  1.1  skrll     return 0;
   2131  1.1  skrll   return s->sy_forward_ref;
   2132  1.1  skrll }
   2133  1.1  skrll 
   2134  1.1  skrll const char *
   2135  1.1  skrll S_GET_NAME (symbolS *s)
   2136  1.1  skrll {
   2137  1.1  skrll   if (LOCAL_SYMBOL_CHECK (s))
   2138  1.1  skrll     return ((struct local_symbol *) s)->lsy_name;
   2139  1.1  skrll   return s->bsym->name;
   2140  1.1  skrll }
   2141  1.1  skrll 
   2142  1.1  skrll segT
   2143  1.1  skrll S_GET_SEGMENT (symbolS *s)
   2144  1.1  skrll {
   2145  1.1  skrll   if (LOCAL_SYMBOL_CHECK (s))
   2146  1.1  skrll     return ((struct local_symbol *) s)->lsy_section;
   2147  1.1  skrll   return s->bsym->section;
   2148  1.1  skrll }
   2149  1.1  skrll 
   2150  1.1  skrll void
   2151  1.1  skrll S_SET_SEGMENT (symbolS *s, segT seg)
   2152  1.1  skrll {
   2153  1.1  skrll   /* Don't reassign section symbols.  The direct reason is to prevent seg
   2154  1.1  skrll      faults assigning back to const global symbols such as *ABS*, but it
   2155  1.1  skrll      shouldn't happen anyway.  */
   2156  1.1  skrll 
   2157  1.1  skrll   if (LOCAL_SYMBOL_CHECK (s))
   2158  1.1  skrll     {
   2159  1.1  skrll       if (seg == reg_section)
   2160  1.1  skrll 	s = local_symbol_convert ((struct local_symbol *) s);
   2161  1.1  skrll       else
   2162  1.1  skrll 	{
   2163  1.1  skrll 	  ((struct local_symbol *) s)->lsy_section = seg;
   2164  1.1  skrll 	  return;
   2165  1.1  skrll 	}
   2166  1.1  skrll     }
   2167  1.1  skrll 
   2168  1.1  skrll   if (s->bsym->flags & BSF_SECTION_SYM)
   2169  1.1  skrll     {
   2170  1.1  skrll       if (s->bsym->section != seg)
   2171  1.1  skrll 	abort ();
   2172  1.1  skrll     }
   2173  1.1  skrll   else
   2174  1.1  skrll     s->bsym->section = seg;
   2175  1.1  skrll }
   2176  1.1  skrll 
   2177  1.1  skrll void
   2178  1.1  skrll S_SET_EXTERNAL (symbolS *s)
   2179  1.1  skrll {
   2180  1.1  skrll   if (LOCAL_SYMBOL_CHECK (s))
   2181  1.1  skrll     s = local_symbol_convert ((struct local_symbol *) s);
   2182  1.1  skrll   if ((s->bsym->flags & BSF_WEAK) != 0)
   2183  1.1  skrll     {
   2184  1.1  skrll       /* Let .weak override .global.  */
   2185  1.1  skrll       return;
   2186  1.1  skrll     }
   2187  1.1  skrll   if (s->bsym->flags & BSF_SECTION_SYM)
   2188  1.1  skrll     {
   2189  1.1  skrll       char * file;
   2190  1.1  skrll       unsigned int line;
   2191  1.1  skrll 
   2192  1.1  skrll       /* Do not reassign section symbols.  */
   2193  1.1  skrll       as_where (& file, & line);
   2194  1.1  skrll       as_warn_where (file, line,
   2195  1.1  skrll 		     _("section symbols are already global"));
   2196  1.1  skrll       return;
   2197  1.1  skrll     }
   2198  1.1  skrll   if (S_GET_SEGMENT (s) == reg_section)
   2199  1.1  skrll     {
   2200  1.1  skrll       as_bad ("can't make register symbol `%s' global",
   2201  1.1  skrll 	      S_GET_NAME (s));
   2202  1.1  skrll       return;
   2203  1.1  skrll     }
   2204  1.1  skrll   s->bsym->flags |= BSF_GLOBAL;
   2205  1.1  skrll   s->bsym->flags &= ~(BSF_LOCAL | BSF_WEAK);
   2206  1.1  skrll 
   2207  1.1  skrll #ifdef USE_UNIQUE
   2208  1.1  skrll   if (! an_external_name && S_GET_NAME(s)[0] != '.')
   2209  1.1  skrll     an_external_name = S_GET_NAME (s);
   2210  1.1  skrll #endif
   2211  1.1  skrll }
   2212  1.1  skrll 
   2213  1.1  skrll void
   2214  1.1  skrll S_CLEAR_EXTERNAL (symbolS *s)
   2215  1.1  skrll {
   2216  1.1  skrll   if (LOCAL_SYMBOL_CHECK (s))
   2217  1.1  skrll     return;
   2218  1.1  skrll   if ((s->bsym->flags & BSF_WEAK) != 0)
   2219  1.1  skrll     {
   2220  1.1  skrll       /* Let .weak override.  */
   2221  1.1  skrll       return;
   2222  1.1  skrll     }
   2223  1.1  skrll   s->bsym->flags |= BSF_LOCAL;
   2224  1.1  skrll   s->bsym->flags &= ~(BSF_GLOBAL | BSF_WEAK);
   2225  1.1  skrll }
   2226  1.1  skrll 
   2227  1.1  skrll void
   2228  1.1  skrll S_SET_WEAK (symbolS *s)
   2229  1.1  skrll {
   2230  1.1  skrll   if (LOCAL_SYMBOL_CHECK (s))
   2231  1.1  skrll     s = local_symbol_convert ((struct local_symbol *) s);
   2232  1.1  skrll #ifdef obj_set_weak_hook
   2233  1.1  skrll   obj_set_weak_hook (s);
   2234  1.1  skrll #endif
   2235  1.1  skrll   s->bsym->flags |= BSF_WEAK;
   2236  1.1  skrll   s->bsym->flags &= ~(BSF_GLOBAL | BSF_LOCAL);
   2237  1.1  skrll }
   2238  1.1  skrll 
   2239  1.1  skrll void
   2240  1.1  skrll S_SET_WEAKREFR (symbolS *s)
   2241  1.1  skrll {
   2242  1.1  skrll   if (LOCAL_SYMBOL_CHECK (s))
   2243  1.1  skrll     s = local_symbol_convert ((struct local_symbol *) s);
   2244  1.1  skrll   s->sy_weakrefr = 1;
   2245  1.1  skrll   /* If the alias was already used, make sure we mark the target as
   2246  1.1  skrll      used as well, otherwise it might be dropped from the symbol
   2247  1.1  skrll      table.  This may have unintended side effects if the alias is
   2248  1.1  skrll      later redirected to another symbol, such as keeping the unused
   2249  1.1  skrll      previous target in the symbol table.  Since it will be weak, it's
   2250  1.1  skrll      not a big deal.  */
   2251  1.1  skrll   if (s->sy_used)
   2252  1.1  skrll     symbol_mark_used (s->sy_value.X_add_symbol);
   2253  1.1  skrll }
   2254  1.1  skrll 
   2255  1.1  skrll void
   2256  1.1  skrll S_CLEAR_WEAKREFR (symbolS *s)
   2257  1.1  skrll {
   2258  1.1  skrll   if (LOCAL_SYMBOL_CHECK (s))
   2259  1.1  skrll     return;
   2260  1.1  skrll   s->sy_weakrefr = 0;
   2261  1.1  skrll }
   2262  1.1  skrll 
   2263  1.1  skrll void
   2264  1.1  skrll S_SET_WEAKREFD (symbolS *s)
   2265  1.1  skrll {
   2266  1.1  skrll   if (LOCAL_SYMBOL_CHECK (s))
   2267  1.1  skrll     s = local_symbol_convert ((struct local_symbol *) s);
   2268  1.1  skrll   s->sy_weakrefd = 1;
   2269  1.1  skrll   S_SET_WEAK (s);
   2270  1.1  skrll }
   2271  1.1  skrll 
   2272  1.1  skrll void
   2273  1.1  skrll S_CLEAR_WEAKREFD (symbolS *s)
   2274  1.1  skrll {
   2275  1.1  skrll   if (LOCAL_SYMBOL_CHECK (s))
   2276  1.1  skrll     return;
   2277  1.1  skrll   if (s->sy_weakrefd)
   2278  1.1  skrll     {
   2279  1.1  skrll       s->sy_weakrefd = 0;
   2280  1.1  skrll       /* If a weakref target symbol is weak, then it was never
   2281  1.1  skrll 	 referenced directly before, not even in a .global directive,
   2282  1.1  skrll 	 so decay it to local.  If it remains undefined, it will be
   2283  1.1  skrll 	 later turned into a global, like any other undefined
   2284  1.1  skrll 	 symbol.  */
   2285  1.1  skrll       if (s->bsym->flags & BSF_WEAK)
   2286  1.1  skrll 	{
   2287  1.1  skrll #ifdef obj_clear_weak_hook
   2288  1.1  skrll 	  obj_clear_weak_hook (s);
   2289  1.1  skrll #endif
   2290  1.1  skrll 	  s->bsym->flags &= ~BSF_WEAK;
   2291  1.1  skrll 	  s->bsym->flags |= BSF_LOCAL;
   2292  1.1  skrll 	}
   2293  1.1  skrll     }
   2294  1.1  skrll }
   2295  1.1  skrll 
   2296  1.1  skrll void
   2297  1.1  skrll S_SET_THREAD_LOCAL (symbolS *s)
   2298  1.1  skrll {
   2299  1.1  skrll   if (LOCAL_SYMBOL_CHECK (s))
   2300  1.1  skrll     s = local_symbol_convert ((struct local_symbol *) s);
   2301  1.1  skrll   if (bfd_is_com_section (s->bsym->section)
   2302  1.1  skrll       && (s->bsym->flags & BSF_THREAD_LOCAL) != 0)
   2303  1.1  skrll     return;
   2304  1.1  skrll   s->bsym->flags |= BSF_THREAD_LOCAL;
   2305  1.1  skrll   if ((s->bsym->flags & BSF_FUNCTION) != 0)
   2306  1.1  skrll     as_bad (_("Accessing function `%s' as thread-local object"),
   2307  1.1  skrll 	    S_GET_NAME (s));
   2308  1.1  skrll   else if (! bfd_is_und_section (s->bsym->section)
   2309  1.1  skrll 	   && (s->bsym->section->flags & SEC_THREAD_LOCAL) == 0)
   2310  1.1  skrll     as_bad (_("Accessing `%s' as thread-local object"),
   2311  1.1  skrll 	    S_GET_NAME (s));
   2312  1.1  skrll }
   2313  1.1  skrll 
   2314  1.1  skrll void
   2315  1.1  skrll S_SET_NAME (symbolS *s, const char *name)
   2316  1.1  skrll {
   2317  1.1  skrll   if (LOCAL_SYMBOL_CHECK (s))
   2318  1.1  skrll     {
   2319  1.1  skrll       ((struct local_symbol *) s)->lsy_name = name;
   2320  1.1  skrll       return;
   2321  1.1  skrll     }
   2322  1.1  skrll   s->bsym->name = name;
   2323  1.1  skrll }
   2324  1.1  skrll 
   2325  1.1  skrll void
   2326  1.1  skrll S_SET_VOLATILE (symbolS *s)
   2327  1.1  skrll {
   2328  1.1  skrll   if (LOCAL_SYMBOL_CHECK (s))
   2329  1.1  skrll     s = local_symbol_convert ((struct local_symbol *) s);
   2330  1.1  skrll   s->sy_volatile = 1;
   2331  1.1  skrll }
   2332  1.1  skrll 
   2333  1.1  skrll void
   2334  1.1  skrll S_CLEAR_VOLATILE (symbolS *s)
   2335  1.1  skrll {
   2336  1.1  skrll   if (!LOCAL_SYMBOL_CHECK (s))
   2337  1.1  skrll     s->sy_volatile = 0;
   2338  1.1  skrll }
   2339  1.1  skrll 
   2340  1.1  skrll void
   2341  1.1  skrll S_SET_FORWARD_REF (symbolS *s)
   2342  1.1  skrll {
   2343  1.1  skrll   if (LOCAL_SYMBOL_CHECK (s))
   2344  1.1  skrll     s = local_symbol_convert ((struct local_symbol *) s);
   2345  1.1  skrll   s->sy_forward_ref = 1;
   2346  1.1  skrll }
   2347  1.1  skrll 
   2348  1.1  skrll /* Return the previous symbol in a chain.  */
   2349  1.1  skrll 
   2350  1.1  skrll symbolS *
   2351  1.1  skrll symbol_previous (symbolS *s)
   2352  1.1  skrll {
   2353  1.1  skrll   if (LOCAL_SYMBOL_CHECK (s))
   2354  1.1  skrll     abort ();
   2355  1.1  skrll   return s->sy_previous;
   2356  1.1  skrll }
   2357  1.1  skrll 
   2358  1.1  skrll /* Return the next symbol in a chain.  */
   2359  1.1  skrll 
   2360  1.1  skrll symbolS *
   2361  1.1  skrll symbol_next (symbolS *s)
   2362  1.1  skrll {
   2363  1.1  skrll   if (LOCAL_SYMBOL_CHECK (s))
   2364  1.1  skrll     abort ();
   2365  1.1  skrll   return s->sy_next;
   2366  1.1  skrll }
   2367  1.1  skrll 
   2368  1.1  skrll /* Return a pointer to the value of a symbol as an expression.  */
   2369  1.1  skrll 
   2370  1.1  skrll expressionS *
   2371  1.1  skrll symbol_get_value_expression (symbolS *s)
   2372  1.1  skrll {
   2373  1.1  skrll   if (LOCAL_SYMBOL_CHECK (s))
   2374  1.1  skrll     s = local_symbol_convert ((struct local_symbol *) s);
   2375  1.1  skrll   return &s->sy_value;
   2376  1.1  skrll }
   2377  1.1  skrll 
   2378  1.1  skrll /* Set the value of a symbol to an expression.  */
   2379  1.1  skrll 
   2380  1.1  skrll void
   2381  1.1  skrll symbol_set_value_expression (symbolS *s, const expressionS *exp)
   2382  1.1  skrll {
   2383  1.1  skrll   if (LOCAL_SYMBOL_CHECK (s))
   2384  1.1  skrll     s = local_symbol_convert ((struct local_symbol *) s);
   2385  1.1  skrll   s->sy_value = *exp;
   2386  1.1  skrll   S_CLEAR_WEAKREFR (s);
   2387  1.1  skrll }
   2388  1.1  skrll 
   2389  1.1  skrll /* Return a pointer to the X_add_number component of a symbol.  */
   2390  1.1  skrll 
   2391  1.1  skrll offsetT *
   2392  1.1  skrll symbol_X_add_number (symbolS *s)
   2393  1.1  skrll {
   2394  1.1  skrll   if (LOCAL_SYMBOL_CHECK (s))
   2395  1.1  skrll     return (offsetT *) &((struct local_symbol *) s)->lsy_value;
   2396  1.1  skrll 
   2397  1.1  skrll   return &s->sy_value.X_add_number;
   2398  1.1  skrll }
   2399  1.1  skrll 
   2400  1.1  skrll /* Set the value of SYM to the current position in the current segment.  */
   2401  1.1  skrll 
   2402  1.1  skrll void
   2403  1.1  skrll symbol_set_value_now (symbolS *sym)
   2404  1.1  skrll {
   2405  1.1  skrll   S_SET_SEGMENT (sym, now_seg);
   2406  1.1  skrll   S_SET_VALUE (sym, frag_now_fix ());
   2407  1.1  skrll   symbol_set_frag (sym, frag_now);
   2408  1.1  skrll }
   2409  1.1  skrll 
   2410  1.1  skrll /* Set the frag of a symbol.  */
   2411  1.1  skrll 
   2412  1.1  skrll void
   2413  1.1  skrll symbol_set_frag (symbolS *s, fragS *f)
   2414  1.1  skrll {
   2415  1.1  skrll   if (LOCAL_SYMBOL_CHECK (s))
   2416  1.1  skrll     {
   2417  1.1  skrll       local_symbol_set_frag ((struct local_symbol *) s, f);
   2418  1.1  skrll       return;
   2419  1.1  skrll     }
   2420  1.1  skrll   s->sy_frag = f;
   2421  1.1  skrll   S_CLEAR_WEAKREFR (s);
   2422  1.1  skrll }
   2423  1.1  skrll 
   2424  1.1  skrll /* Return the frag of a symbol.  */
   2425  1.1  skrll 
   2426  1.1  skrll fragS *
   2427  1.1  skrll symbol_get_frag (symbolS *s)
   2428  1.1  skrll {
   2429  1.1  skrll   if (LOCAL_SYMBOL_CHECK (s))
   2430  1.1  skrll     return local_symbol_get_frag ((struct local_symbol *) s);
   2431  1.1  skrll   return s->sy_frag;
   2432  1.1  skrll }
   2433  1.1  skrll 
   2434  1.1  skrll /* Mark a symbol as having been used.  */
   2435  1.1  skrll 
   2436  1.1  skrll void
   2437  1.1  skrll symbol_mark_used (symbolS *s)
   2438  1.1  skrll {
   2439  1.1  skrll   if (LOCAL_SYMBOL_CHECK (s))
   2440  1.1  skrll     return;
   2441  1.1  skrll   s->sy_used = 1;
   2442  1.1  skrll   if (S_IS_WEAKREFR (s))
   2443  1.1  skrll     symbol_mark_used (s->sy_value.X_add_symbol);
   2444  1.1  skrll }
   2445  1.1  skrll 
   2446  1.1  skrll /* Clear the mark of whether a symbol has been used.  */
   2447  1.1  skrll 
   2448  1.1  skrll void
   2449  1.1  skrll symbol_clear_used (symbolS *s)
   2450  1.1  skrll {
   2451  1.1  skrll   if (LOCAL_SYMBOL_CHECK (s))
   2452  1.1  skrll     s = local_symbol_convert ((struct local_symbol *) s);
   2453  1.1  skrll   s->sy_used = 0;
   2454  1.1  skrll }
   2455  1.1  skrll 
   2456  1.1  skrll /* Return whether a symbol has been used.  */
   2457  1.1  skrll 
   2458  1.1  skrll int
   2459  1.1  skrll symbol_used_p (symbolS *s)
   2460  1.1  skrll {
   2461  1.1  skrll   if (LOCAL_SYMBOL_CHECK (s))
   2462  1.1  skrll     return 1;
   2463  1.1  skrll   return s->sy_used;
   2464  1.1  skrll }
   2465  1.1  skrll 
   2466  1.1  skrll /* Mark a symbol as having been used in a reloc.  */
   2467  1.1  skrll 
   2468  1.1  skrll void
   2469  1.1  skrll symbol_mark_used_in_reloc (symbolS *s)
   2470  1.1  skrll {
   2471  1.1  skrll   if (LOCAL_SYMBOL_CHECK (s))
   2472  1.1  skrll     s = local_symbol_convert ((struct local_symbol *) s);
   2473  1.1  skrll   s->sy_used_in_reloc = 1;
   2474  1.1  skrll }
   2475  1.1  skrll 
   2476  1.1  skrll /* Clear the mark of whether a symbol has been used in a reloc.  */
   2477  1.1  skrll 
   2478  1.1  skrll void
   2479  1.1  skrll symbol_clear_used_in_reloc (symbolS *s)
   2480  1.1  skrll {
   2481  1.1  skrll   if (LOCAL_SYMBOL_CHECK (s))
   2482  1.1  skrll     return;
   2483  1.1  skrll   s->sy_used_in_reloc = 0;
   2484  1.1  skrll }
   2485  1.1  skrll 
   2486  1.1  skrll /* Return whether a symbol has been used in a reloc.  */
   2487  1.1  skrll 
   2488  1.1  skrll int
   2489  1.1  skrll symbol_used_in_reloc_p (symbolS *s)
   2490  1.1  skrll {
   2491  1.1  skrll   if (LOCAL_SYMBOL_CHECK (s))
   2492  1.1  skrll     return 0;
   2493  1.1  skrll   return s->sy_used_in_reloc;
   2494  1.1  skrll }
   2495  1.1  skrll 
   2496  1.1  skrll /* Mark a symbol as an MRI common symbol.  */
   2497  1.1  skrll 
   2498  1.1  skrll void
   2499  1.1  skrll symbol_mark_mri_common (symbolS *s)
   2500  1.1  skrll {
   2501  1.1  skrll   if (LOCAL_SYMBOL_CHECK (s))
   2502  1.1  skrll     s = local_symbol_convert ((struct local_symbol *) s);
   2503  1.1  skrll   s->sy_mri_common = 1;
   2504  1.1  skrll }
   2505  1.1  skrll 
   2506  1.1  skrll /* Clear the mark of whether a symbol is an MRI common symbol.  */
   2507  1.1  skrll 
   2508  1.1  skrll void
   2509  1.1  skrll symbol_clear_mri_common (symbolS *s)
   2510  1.1  skrll {
   2511  1.1  skrll   if (LOCAL_SYMBOL_CHECK (s))
   2512  1.1  skrll     return;
   2513  1.1  skrll   s->sy_mri_common = 0;
   2514  1.1  skrll }
   2515  1.1  skrll 
   2516  1.1  skrll /* Return whether a symbol is an MRI common symbol.  */
   2517  1.1  skrll 
   2518  1.1  skrll int
   2519  1.1  skrll symbol_mri_common_p (symbolS *s)
   2520  1.1  skrll {
   2521  1.1  skrll   if (LOCAL_SYMBOL_CHECK (s))
   2522  1.1  skrll     return 0;
   2523  1.1  skrll   return s->sy_mri_common;
   2524  1.1  skrll }
   2525  1.1  skrll 
   2526  1.1  skrll /* Mark a symbol as having been written.  */
   2527  1.1  skrll 
   2528  1.1  skrll void
   2529  1.1  skrll symbol_mark_written (symbolS *s)
   2530  1.1  skrll {
   2531  1.1  skrll   if (LOCAL_SYMBOL_CHECK (s))
   2532  1.1  skrll     return;
   2533  1.1  skrll   s->written = 1;
   2534  1.1  skrll }
   2535  1.1  skrll 
   2536  1.1  skrll /* Clear the mark of whether a symbol has been written.  */
   2537  1.1  skrll 
   2538  1.1  skrll void
   2539  1.1  skrll symbol_clear_written (symbolS *s)
   2540  1.1  skrll {
   2541  1.1  skrll   if (LOCAL_SYMBOL_CHECK (s))
   2542  1.1  skrll     return;
   2543  1.1  skrll   s->written = 0;
   2544  1.1  skrll }
   2545  1.1  skrll 
   2546  1.1  skrll /* Return whether a symbol has been written.  */
   2547  1.1  skrll 
   2548  1.1  skrll int
   2549  1.1  skrll symbol_written_p (symbolS *s)
   2550  1.1  skrll {
   2551  1.1  skrll   if (LOCAL_SYMBOL_CHECK (s))
   2552  1.1  skrll     return 0;
   2553  1.1  skrll   return s->written;
   2554  1.1  skrll }
   2555  1.1  skrll 
   2556  1.1  skrll /* Mark a symbol has having been resolved.  */
   2557  1.1  skrll 
   2558  1.1  skrll void
   2559  1.1  skrll symbol_mark_resolved (symbolS *s)
   2560  1.1  skrll {
   2561  1.1  skrll   if (LOCAL_SYMBOL_CHECK (s))
   2562  1.1  skrll     {
   2563  1.1  skrll       local_symbol_mark_resolved ((struct local_symbol *) s);
   2564  1.1  skrll       return;
   2565  1.1  skrll     }
   2566  1.1  skrll   s->sy_resolved = 1;
   2567  1.1  skrll }
   2568  1.1  skrll 
   2569  1.1  skrll /* Return whether a symbol has been resolved.  */
   2570  1.1  skrll 
   2571  1.1  skrll int
   2572  1.1  skrll symbol_resolved_p (symbolS *s)
   2573  1.1  skrll {
   2574  1.1  skrll   if (LOCAL_SYMBOL_CHECK (s))
   2575  1.1  skrll     return local_symbol_resolved_p ((struct local_symbol *) s);
   2576  1.1  skrll   return s->sy_resolved;
   2577  1.1  skrll }
   2578  1.1  skrll 
   2579  1.1  skrll /* Return whether a symbol is a section symbol.  */
   2580  1.1  skrll 
   2581  1.1  skrll int
   2582  1.1  skrll symbol_section_p (symbolS *s ATTRIBUTE_UNUSED)
   2583  1.1  skrll {
   2584  1.1  skrll   if (LOCAL_SYMBOL_CHECK (s))
   2585  1.1  skrll     return 0;
   2586  1.1  skrll   return (s->bsym->flags & BSF_SECTION_SYM) != 0;
   2587  1.1  skrll }
   2588  1.1  skrll 
   2589  1.1  skrll /* Return whether a symbol is equated to another symbol.  */
   2590  1.1  skrll 
   2591  1.1  skrll int
   2592  1.1  skrll symbol_equated_p (symbolS *s)
   2593  1.1  skrll {
   2594  1.1  skrll   if (LOCAL_SYMBOL_CHECK (s))
   2595  1.1  skrll     return 0;
   2596  1.1  skrll   return s->sy_value.X_op == O_symbol;
   2597  1.1  skrll }
   2598  1.1  skrll 
   2599  1.1  skrll /* Return whether a symbol is equated to another symbol, and should be
   2600  1.1  skrll    treated specially when writing out relocs.  */
   2601  1.1  skrll 
   2602  1.1  skrll int
   2603  1.1  skrll symbol_equated_reloc_p (symbolS *s)
   2604  1.1  skrll {
   2605  1.1  skrll   if (LOCAL_SYMBOL_CHECK (s))
   2606  1.1  skrll     return 0;
   2607  1.1  skrll   /* X_op_symbol, normally not used for O_symbol, is set by
   2608  1.1  skrll      resolve_symbol_value to flag expression syms that have been
   2609  1.1  skrll      equated.  */
   2610  1.1  skrll   return (s->sy_value.X_op == O_symbol
   2611  1.1  skrll #if defined (OBJ_COFF) && defined (TE_PE)
   2612  1.1  skrll 	  && ! S_IS_WEAK (s)
   2613  1.1  skrll #endif
   2614  1.1  skrll 	  && ((s->sy_resolved && s->sy_value.X_op_symbol != NULL)
   2615  1.1  skrll 	      || ! S_IS_DEFINED (s)
   2616  1.1  skrll 	      || S_IS_COMMON (s)));
   2617  1.1  skrll }
   2618  1.1  skrll 
   2619  1.1  skrll /* Return whether a symbol has a constant value.  */
   2620  1.1  skrll 
   2621  1.1  skrll int
   2622  1.1  skrll symbol_constant_p (symbolS *s)
   2623  1.1  skrll {
   2624  1.1  skrll   if (LOCAL_SYMBOL_CHECK (s))
   2625  1.1  skrll     return 1;
   2626  1.1  skrll   return s->sy_value.X_op == O_constant;
   2627  1.1  skrll }
   2628  1.1  skrll 
   2629  1.1  skrll /* Return whether a symbol was cloned and thus removed from the global
   2630  1.1  skrll    symbol list.  */
   2631  1.1  skrll 
   2632  1.1  skrll int
   2633  1.1  skrll symbol_shadow_p (symbolS *s)
   2634  1.1  skrll {
   2635  1.1  skrll   if (LOCAL_SYMBOL_CHECK (s))
   2636  1.1  skrll     return 0;
   2637  1.1  skrll   return s->sy_next == s;
   2638  1.1  skrll }
   2639  1.1  skrll 
   2640  1.1  skrll /* Return the BFD symbol for a symbol.  */
   2641  1.1  skrll 
   2642  1.1  skrll asymbol *
   2643  1.1  skrll symbol_get_bfdsym (symbolS *s)
   2644  1.1  skrll {
   2645  1.1  skrll   if (LOCAL_SYMBOL_CHECK (s))
   2646  1.1  skrll     s = local_symbol_convert ((struct local_symbol *) s);
   2647  1.1  skrll   return s->bsym;
   2648  1.1  skrll }
   2649  1.1  skrll 
   2650  1.1  skrll /* Set the BFD symbol for a symbol.  */
   2651  1.1  skrll 
   2652  1.1  skrll void
   2653  1.1  skrll symbol_set_bfdsym (symbolS *s, asymbol *bsym)
   2654  1.1  skrll {
   2655  1.1  skrll   if (LOCAL_SYMBOL_CHECK (s))
   2656  1.1  skrll     s = local_symbol_convert ((struct local_symbol *) s);
   2657  1.1  skrll   /* Usually, it is harmless to reset a symbol to a BFD section
   2658  1.1  skrll      symbol. For example, obj_elf_change_section sets the BFD symbol
   2659  1.1  skrll      of an old symbol with the newly created section symbol. But when
   2660  1.1  skrll      we have multiple sections with the same name, the newly created
   2661  1.1  skrll      section may have the same name as an old section. We check if the
   2662  1.1  skrll      old symbol has been already marked as a section symbol before
   2663  1.1  skrll      resetting it.  */
   2664  1.1  skrll   if ((s->bsym->flags & BSF_SECTION_SYM) == 0)
   2665  1.1  skrll     s->bsym = bsym;
   2666  1.1  skrll   /* else XXX - What do we do now ?  */
   2667  1.1  skrll }
   2668  1.1  skrll 
   2669  1.1  skrll #ifdef OBJ_SYMFIELD_TYPE
   2670  1.1  skrll 
   2671  1.1  skrll /* Get a pointer to the object format information for a symbol.  */
   2672  1.1  skrll 
   2673  1.1  skrll OBJ_SYMFIELD_TYPE *
   2674  1.1  skrll symbol_get_obj (symbolS *s)
   2675  1.1  skrll {
   2676  1.1  skrll   if (LOCAL_SYMBOL_CHECK (s))
   2677  1.1  skrll     s = local_symbol_convert ((struct local_symbol *) s);
   2678  1.1  skrll   return &s->sy_obj;
   2679  1.1  skrll }
   2680  1.1  skrll 
   2681  1.1  skrll /* Set the object format information for a symbol.  */
   2682  1.1  skrll 
   2683  1.1  skrll void
   2684  1.1  skrll symbol_set_obj (symbolS *s, OBJ_SYMFIELD_TYPE *o)
   2685  1.1  skrll {
   2686  1.1  skrll   if (LOCAL_SYMBOL_CHECK (s))
   2687  1.1  skrll     s = local_symbol_convert ((struct local_symbol *) s);
   2688  1.1  skrll   s->sy_obj = *o;
   2689  1.1  skrll }
   2690  1.1  skrll 
   2691  1.1  skrll #endif /* OBJ_SYMFIELD_TYPE */
   2692  1.1  skrll 
   2693  1.1  skrll #ifdef TC_SYMFIELD_TYPE
   2694  1.1  skrll 
   2695  1.1  skrll /* Get a pointer to the processor information for a symbol.  */
   2696  1.1  skrll 
   2697  1.1  skrll TC_SYMFIELD_TYPE *
   2698  1.1  skrll symbol_get_tc (symbolS *s)
   2699  1.1  skrll {
   2700  1.1  skrll   if (LOCAL_SYMBOL_CHECK (s))
   2701  1.1  skrll     s = local_symbol_convert ((struct local_symbol *) s);
   2702  1.1  skrll   return &s->sy_tc;
   2703  1.1  skrll }
   2704  1.1  skrll 
   2705  1.1  skrll /* Set the processor information for a symbol.  */
   2706  1.1  skrll 
   2707  1.1  skrll void
   2708  1.1  skrll symbol_set_tc (symbolS *s, TC_SYMFIELD_TYPE *o)
   2709  1.1  skrll {
   2710  1.1  skrll   if (LOCAL_SYMBOL_CHECK (s))
   2711  1.1  skrll     s = local_symbol_convert ((struct local_symbol *) s);
   2712  1.1  skrll   s->sy_tc = *o;
   2713  1.1  skrll }
   2714  1.1  skrll 
   2715  1.1  skrll #endif /* TC_SYMFIELD_TYPE */
   2716  1.1  skrll 
   2717  1.1  skrll void
   2718  1.1  skrll symbol_begin (void)
   2719  1.1  skrll {
   2720  1.1  skrll   symbol_lastP = NULL;
   2721  1.1  skrll   symbol_rootP = NULL;		/* In case we have 0 symbols (!!)  */
   2722  1.1  skrll   sy_hash = hash_new ();
   2723  1.1  skrll   local_hash = hash_new ();
   2724  1.1  skrll 
   2725  1.1  skrll   memset ((char *) (&abs_symbol), '\0', sizeof (abs_symbol));
   2726  1.1  skrll #if defined (EMIT_SECTION_SYMBOLS) || !defined (RELOC_REQUIRES_SYMBOL)
   2727  1.1  skrll   abs_symbol.bsym = bfd_abs_section.symbol;
   2728  1.1  skrll #endif
   2729  1.1  skrll   abs_symbol.sy_value.X_op = O_constant;
   2730  1.1  skrll   abs_symbol.sy_frag = &zero_address_frag;
   2731  1.1  skrll 
   2732  1.1  skrll   if (LOCAL_LABELS_FB)
   2733  1.1  skrll     fb_label_init ();
   2734  1.1  skrll }
   2735  1.1  skrll 
   2736  1.1  skrll int indent_level;
   2738  1.1  skrll 
   2739  1.1  skrll /* Maximum indent level.
   2740  1.1  skrll    Available for modification inside a gdb session.  */
   2741  1.1  skrll static int max_indent_level = 8;
   2742  1.1  skrll 
   2743  1.1  skrll void
   2744  1.1  skrll print_symbol_value_1 (FILE *file, symbolS *sym)
   2745  1.1  skrll {
   2746  1.1  skrll   const char *name = S_GET_NAME (sym);
   2747  1.1  skrll   if (!name || !name[0])
   2748  1.1  skrll     name = "(unnamed)";
   2749  1.1  skrll   fprintf (file, "sym ");
   2750  1.1  skrll   fprintf_vma (file, (bfd_vma) ((bfd_hostptr_t) sym));
   2751  1.1  skrll   fprintf (file, " %s", name);
   2752  1.1  skrll 
   2753  1.1  skrll   if (LOCAL_SYMBOL_CHECK (sym))
   2754  1.1  skrll     {
   2755  1.1  skrll       struct local_symbol *locsym = (struct local_symbol *) sym;
   2756  1.1  skrll 
   2757  1.1  skrll       if (local_symbol_get_frag (locsym) != & zero_address_frag
   2758  1.1  skrll 	  && local_symbol_get_frag (locsym) != NULL)
   2759  1.1  skrll 	{
   2760  1.1  skrll 	  fprintf (file, " frag ");
   2761  1.1  skrll 	  fprintf_vma (file, (bfd_vma) ((bfd_hostptr_t) local_symbol_get_frag (locsym)));
   2762  1.1  skrll         }
   2763  1.1  skrll       if (local_symbol_resolved_p (locsym))
   2764  1.1  skrll 	fprintf (file, " resolved");
   2765  1.1  skrll       fprintf (file, " local");
   2766  1.1  skrll     }
   2767  1.1  skrll   else
   2768  1.1  skrll     {
   2769  1.1  skrll       if (sym->sy_frag != &zero_address_frag)
   2770  1.1  skrll 	{
   2771  1.1  skrll 	  fprintf (file, " frag ");
   2772  1.1  skrll 	  fprintf_vma (file, (bfd_vma) ((bfd_hostptr_t) sym->sy_frag));
   2773  1.1  skrll 	}
   2774  1.1  skrll       if (sym->written)
   2775  1.1  skrll 	fprintf (file, " written");
   2776  1.1  skrll       if (sym->sy_resolved)
   2777  1.1  skrll 	fprintf (file, " resolved");
   2778  1.1  skrll       else if (sym->sy_resolving)
   2779  1.1  skrll 	fprintf (file, " resolving");
   2780  1.1  skrll       if (sym->sy_used_in_reloc)
   2781  1.1  skrll 	fprintf (file, " used-in-reloc");
   2782  1.1  skrll       if (sym->sy_used)
   2783  1.1  skrll 	fprintf (file, " used");
   2784  1.1  skrll       if (S_IS_LOCAL (sym))
   2785  1.1  skrll 	fprintf (file, " local");
   2786  1.1  skrll       if (S_IS_EXTERNAL (sym))
   2787  1.1  skrll 	fprintf (file, " extern");
   2788  1.1  skrll       if (S_IS_WEAK (sym))
   2789  1.1  skrll 	fprintf (file, " weak");
   2790  1.1  skrll       if (S_IS_DEBUG (sym))
   2791  1.1  skrll 	fprintf (file, " debug");
   2792  1.1  skrll       if (S_IS_DEFINED (sym))
   2793  1.1  skrll 	fprintf (file, " defined");
   2794  1.1  skrll     }
   2795  1.1  skrll   if (S_IS_WEAKREFR (sym))
   2796  1.1  skrll     fprintf (file, " weakrefr");
   2797  1.1  skrll   if (S_IS_WEAKREFD (sym))
   2798  1.1  skrll     fprintf (file, " weakrefd");
   2799  1.1  skrll   fprintf (file, " %s", segment_name (S_GET_SEGMENT (sym)));
   2800  1.1  skrll   if (symbol_resolved_p (sym))
   2801  1.1  skrll     {
   2802  1.1  skrll       segT s = S_GET_SEGMENT (sym);
   2803  1.1  skrll 
   2804  1.1  skrll       if (s != undefined_section
   2805  1.1  skrll 	  && s != expr_section)
   2806  1.1  skrll 	fprintf (file, " %lx", (unsigned long) S_GET_VALUE (sym));
   2807  1.1  skrll     }
   2808  1.1  skrll   else if (indent_level < max_indent_level
   2809  1.1  skrll 	   && S_GET_SEGMENT (sym) != undefined_section)
   2810  1.1  skrll     {
   2811  1.1  skrll       indent_level++;
   2812  1.1  skrll       fprintf (file, "\n%*s<", indent_level * 4, "");
   2813  1.1  skrll       if (LOCAL_SYMBOL_CHECK (sym))
   2814  1.1  skrll 	fprintf (file, "constant %lx",
   2815  1.1  skrll 		 (unsigned long) ((struct local_symbol *) sym)->lsy_value);
   2816  1.1  skrll       else
   2817  1.1  skrll 	print_expr_1 (file, &sym->sy_value);
   2818  1.1  skrll       fprintf (file, ">");
   2819  1.1  skrll       indent_level--;
   2820  1.1  skrll     }
   2821  1.1  skrll   fflush (file);
   2822  1.1  skrll }
   2823  1.1  skrll 
   2824  1.1  skrll void
   2825  1.1  skrll print_symbol_value (symbolS *sym)
   2826  1.1  skrll {
   2827  1.1  skrll   indent_level = 0;
   2828  1.1  skrll   print_symbol_value_1 (stderr, sym);
   2829  1.1  skrll   fprintf (stderr, "\n");
   2830  1.1  skrll }
   2831  1.1  skrll 
   2832  1.1  skrll static void
   2833  1.1  skrll print_binary (FILE *file, const char *name, expressionS *exp)
   2834  1.1  skrll {
   2835  1.1  skrll   indent_level++;
   2836  1.1  skrll   fprintf (file, "%s\n%*s<", name, indent_level * 4, "");
   2837  1.1  skrll   print_symbol_value_1 (file, exp->X_add_symbol);
   2838  1.1  skrll   fprintf (file, ">\n%*s<", indent_level * 4, "");
   2839  1.1  skrll   print_symbol_value_1 (file, exp->X_op_symbol);
   2840  1.1  skrll   fprintf (file, ">");
   2841  1.1  skrll   indent_level--;
   2842  1.1  skrll }
   2843  1.1  skrll 
   2844  1.1  skrll void
   2845  1.1  skrll print_expr_1 (FILE *file, expressionS *exp)
   2846  1.1  skrll {
   2847  1.1  skrll   fprintf (file, "expr ");
   2848  1.1  skrll   fprintf_vma (file, (bfd_vma) ((bfd_hostptr_t) exp));
   2849  1.1  skrll   fprintf (file, " ");
   2850  1.1  skrll   switch (exp->X_op)
   2851  1.1  skrll     {
   2852  1.1  skrll     case O_illegal:
   2853  1.1  skrll       fprintf (file, "illegal");
   2854  1.1  skrll       break;
   2855  1.1  skrll     case O_absent:
   2856  1.1  skrll       fprintf (file, "absent");
   2857  1.1  skrll       break;
   2858  1.1  skrll     case O_constant:
   2859  1.1  skrll       fprintf (file, "constant %lx", (unsigned long) exp->X_add_number);
   2860  1.1  skrll       break;
   2861  1.1  skrll     case O_symbol:
   2862  1.1  skrll       indent_level++;
   2863  1.1  skrll       fprintf (file, "symbol\n%*s<", indent_level * 4, "");
   2864  1.1  skrll       print_symbol_value_1 (file, exp->X_add_symbol);
   2865  1.1  skrll       fprintf (file, ">");
   2866  1.1  skrll     maybe_print_addnum:
   2867  1.1  skrll       if (exp->X_add_number)
   2868  1.1  skrll 	fprintf (file, "\n%*s%lx", indent_level * 4, "",
   2869  1.1  skrll 		 (unsigned long) exp->X_add_number);
   2870  1.1  skrll       indent_level--;
   2871  1.1  skrll       break;
   2872  1.1  skrll     case O_register:
   2873  1.1  skrll       fprintf (file, "register #%d", (int) exp->X_add_number);
   2874  1.1  skrll       break;
   2875  1.1  skrll     case O_big:
   2876  1.1  skrll       fprintf (file, "big");
   2877  1.1  skrll       break;
   2878  1.1  skrll     case O_uminus:
   2879  1.1  skrll       fprintf (file, "uminus -<");
   2880  1.1  skrll       indent_level++;
   2881  1.1  skrll       print_symbol_value_1 (file, exp->X_add_symbol);
   2882  1.1  skrll       fprintf (file, ">");
   2883  1.1  skrll       goto maybe_print_addnum;
   2884  1.1  skrll     case O_bit_not:
   2885  1.1  skrll       fprintf (file, "bit_not");
   2886  1.1  skrll       break;
   2887  1.1  skrll     case O_multiply:
   2888  1.1  skrll       print_binary (file, "multiply", exp);
   2889  1.1  skrll       break;
   2890  1.1  skrll     case O_divide:
   2891  1.1  skrll       print_binary (file, "divide", exp);
   2892  1.1  skrll       break;
   2893  1.1  skrll     case O_modulus:
   2894  1.1  skrll       print_binary (file, "modulus", exp);
   2895  1.1  skrll       break;
   2896  1.1  skrll     case O_left_shift:
   2897  1.1  skrll       print_binary (file, "lshift", exp);
   2898  1.1  skrll       break;
   2899  1.1  skrll     case O_right_shift:
   2900  1.1  skrll       print_binary (file, "rshift", exp);
   2901  1.1  skrll       break;
   2902  1.1  skrll     case O_bit_inclusive_or:
   2903  1.1  skrll       print_binary (file, "bit_ior", exp);
   2904  1.1  skrll       break;
   2905  1.1  skrll     case O_bit_exclusive_or:
   2906  1.1  skrll       print_binary (file, "bit_xor", exp);
   2907  1.1  skrll       break;
   2908  1.1  skrll     case O_bit_and:
   2909  1.1  skrll       print_binary (file, "bit_and", exp);
   2910  1.1  skrll       break;
   2911  1.1  skrll     case O_eq:
   2912  1.1  skrll       print_binary (file, "eq", exp);
   2913  1.1  skrll       break;
   2914  1.1  skrll     case O_ne:
   2915  1.1  skrll       print_binary (file, "ne", exp);
   2916  1.1  skrll       break;
   2917  1.1  skrll     case O_lt:
   2918  1.1  skrll       print_binary (file, "lt", exp);
   2919  1.1  skrll       break;
   2920  1.1  skrll     case O_le:
   2921  1.1  skrll       print_binary (file, "le", exp);
   2922  1.1  skrll       break;
   2923  1.1  skrll     case O_ge:
   2924  1.1  skrll       print_binary (file, "ge", exp);
   2925  1.1  skrll       break;
   2926  1.1  skrll     case O_gt:
   2927  1.1  skrll       print_binary (file, "gt", exp);
   2928  1.1  skrll       break;
   2929  1.1  skrll     case O_logical_and:
   2930  1.1  skrll       print_binary (file, "logical_and", exp);
   2931  1.1  skrll       break;
   2932  1.1  skrll     case O_logical_or:
   2933  1.1  skrll       print_binary (file, "logical_or", exp);
   2934  1.1  skrll       break;
   2935  1.1  skrll     case O_add:
   2936  1.1  skrll       indent_level++;
   2937  1.1  skrll       fprintf (file, "add\n%*s<", indent_level * 4, "");
   2938  1.1  skrll       print_symbol_value_1 (file, exp->X_add_symbol);
   2939  1.1  skrll       fprintf (file, ">\n%*s<", indent_level * 4, "");
   2940  1.1  skrll       print_symbol_value_1 (file, exp->X_op_symbol);
   2941  1.1  skrll       fprintf (file, ">");
   2942  1.1  skrll       goto maybe_print_addnum;
   2943  1.1  skrll     case O_subtract:
   2944  1.1  skrll       indent_level++;
   2945  1.1  skrll       fprintf (file, "subtract\n%*s<", indent_level * 4, "");
   2946  1.1  skrll       print_symbol_value_1 (file, exp->X_add_symbol);
   2947  1.1  skrll       fprintf (file, ">\n%*s<", indent_level * 4, "");
   2948  1.1  skrll       print_symbol_value_1 (file, exp->X_op_symbol);
   2949  1.1  skrll       fprintf (file, ">");
   2950  1.1  skrll       goto maybe_print_addnum;
   2951  1.1  skrll     default:
   2952  1.1  skrll       fprintf (file, "{unknown opcode %d}", (int) exp->X_op);
   2953  1.1  skrll       break;
   2954  1.1  skrll     }
   2955  1.1  skrll   fflush (stdout);
   2956  1.1  skrll }
   2957  1.1  skrll 
   2958  1.1  skrll void
   2959  1.1  skrll print_expr (expressionS *exp)
   2960  1.1  skrll {
   2961  1.1  skrll   print_expr_1 (stderr, exp);
   2962  1.1  skrll   fprintf (stderr, "\n");
   2963  1.1  skrll }
   2964  1.1  skrll 
   2965  1.1  skrll void
   2966  1.1  skrll symbol_print_statistics (FILE *file)
   2967  1.1  skrll {
   2968  1.1  skrll   hash_print_statistics (file, "symbol table", sy_hash);
   2969  1.1  skrll   hash_print_statistics (file, "mini local symbol table", local_hash);
   2970  1.1  skrll   fprintf (file, "%lu mini local symbols created, %lu converted\n",
   2971  1.1  skrll 	   local_symbol_count, local_symbol_conversion_count);
   2972  1.1  skrll }
   2973  1.1  skrll 
   2974  1.1  skrll #ifdef OBJ_COMPLEX_RELC
   2975  1.1  skrll 
   2976  1.1  skrll /* Convert given symbol to a new complex-relocation symbol name.  This
   2977  1.1  skrll    may be a recursive function, since it might be called for non-leaf
   2978  1.1  skrll    nodes (plain symbols) in the expression tree.  The caller owns the
   2979  1.1  skrll    returning string, so should free it eventually.  Errors are
   2980  1.1  skrll    indicated via as_bad and a NULL return value.  The given symbol
   2981  1.1  skrll    is marked with sy_used_in_reloc.  */
   2982  1.1  skrll 
   2983  1.1  skrll char *
   2984  1.1  skrll symbol_relc_make_sym (symbolS * sym)
   2985  1.1  skrll {
   2986  1.1  skrll   char * terminal = NULL;
   2987  1.1  skrll   const char * sname;
   2988  1.1  skrll   char typetag;
   2989  1.1  skrll   int sname_len;
   2990  1.1  skrll 
   2991  1.1  skrll   assert (sym != NULL);
   2992  1.1  skrll 
   2993  1.1  skrll   /* Recurse to symbol_relc_make_expr if this symbol
   2994  1.1  skrll      is defined as an expression or a plain value.  */
   2995  1.1  skrll   if (   S_GET_SEGMENT (sym) == expr_section
   2996  1.1  skrll       || S_GET_SEGMENT (sym) == absolute_section)
   2997  1.1  skrll     return symbol_relc_make_expr (& sym->sy_value);
   2998  1.1  skrll 
   2999  1.1  skrll   /* This may be a "fake symbol" L0\001, referring to ".".
   3000  1.1  skrll      Write out a special null symbol to refer to this position.  */
   3001  1.1  skrll   if (! strcmp (S_GET_NAME (sym), FAKE_LABEL_NAME))
   3002  1.1  skrll     return xstrdup (".");
   3003  1.1  skrll 
   3004  1.1  skrll   /* We hope this is a plain leaf symbol.  Construct the encoding
   3005  1.1  skrll      as {S,s}II...:CCCCCCC....
   3006  1.1  skrll      where 'S'/'s' means section symbol / plain symbol
   3007  1.1  skrll      III is decimal for the symbol name length
   3008  1.1  skrll      CCC is the symbol name itself.  */
   3009  1.1  skrll   symbol_mark_used_in_reloc (sym);
   3010  1.1  skrll 
   3011  1.1  skrll   sname = S_GET_NAME (sym);
   3012  1.1  skrll   sname_len = strlen (sname);
   3013  1.1  skrll   typetag = symbol_section_p (sym) ? 'S' : 's';
   3014  1.1  skrll 
   3015  1.1  skrll   terminal = xmalloc (1 /* S or s */
   3016  1.1  skrll 		      + 8 /* sname_len in decimal */
   3017  1.1  skrll 		      + 1 /* _ spacer */
   3018  1.1  skrll 		      + sname_len /* name itself */
   3019  1.1  skrll 		      + 1 /* \0 */ );
   3020  1.1  skrll 
   3021  1.1  skrll   sprintf (terminal, "%c%d:%s", typetag, sname_len, sname);
   3022  1.1  skrll   return terminal;
   3023  1.1  skrll }
   3024  1.1  skrll 
   3025  1.1  skrll /* Convert given value to a new complex-relocation symbol name.  This
   3026  1.1  skrll    is a non-recursive function, since it is be called for leaf nodes
   3027  1.1  skrll    (plain values) in the expression tree.  The caller owns the
   3028  1.1  skrll    returning string, so should free() it eventually.  No errors.  */
   3029  1.1  skrll 
   3030  1.1  skrll char *
   3031  1.1  skrll symbol_relc_make_value (offsetT val)
   3032  1.1  skrll {
   3033  1.1  skrll   char * terminal = xmalloc (28);  /* Enough for long long.  */
   3034  1.1  skrll 
   3035  1.1  skrll   terminal[0] = '#';
   3036  1.1  skrll   bfd_sprintf_vma (stdoutput, terminal + 1, val);
   3037  1.1  skrll   return terminal;
   3038  1.1  skrll }
   3039  1.1  skrll 
   3040  1.1  skrll /* Convert given expression to a new complex-relocation symbol name.
   3041  1.1  skrll    This is a recursive function, since it traverses the entire given
   3042  1.1  skrll    expression tree.  The caller owns the returning string, so should
   3043  1.1  skrll    free() it eventually.  Errors are indicated via as_bad() and a NULL
   3044  1.1  skrll    return value.  */
   3045  1.1  skrll 
   3046  1.1  skrll char *
   3047  1.1  skrll symbol_relc_make_expr (expressionS * exp)
   3048  1.1  skrll {
   3049  1.1  skrll   char * opstr = NULL; /* Operator prefix string.  */
   3050  1.1  skrll   int    arity = 0;    /* Arity of this operator.  */
   3051  1.1  skrll   char * operands[3];  /* Up to three operands.  */
   3052  1.1  skrll   char * concat_string = NULL;
   3053  1.1  skrll 
   3054  1.1  skrll   operands[0] = operands[1] = operands[2] = NULL;
   3055  1.1  skrll 
   3056  1.1  skrll   assert (exp != NULL);
   3057  1.1  skrll 
   3058  1.1  skrll   /* Match known operators -> fill in opstr, arity, operands[] and fall
   3059  1.1  skrll      through to construct subexpression fragments; may instead return
   3060  1.1  skrll      string directly for leaf nodes.  */
   3061  1.1  skrll 
   3062  1.1  skrll   /* See expr.h for the meaning of all these enums.  Many operators
   3063  1.1  skrll      have an unnatural arity (X_add_number implicitly added).  The
   3064  1.1  skrll      conversion logic expands them to explicit "+" subexpressions.   */
   3065  1.1  skrll 
   3066  1.1  skrll   switch (exp->X_op)
   3067  1.1  skrll     {
   3068  1.1  skrll     default:
   3069  1.1  skrll       as_bad ("Unknown expression operator (enum %d)", exp->X_op);
   3070  1.1  skrll       break;
   3071  1.1  skrll 
   3072  1.1  skrll       /* Leaf nodes.  */
   3073  1.1  skrll     case O_constant:
   3074  1.1  skrll       return symbol_relc_make_value (exp->X_add_number);
   3075  1.1  skrll 
   3076  1.1  skrll     case O_symbol:
   3077  1.1  skrll       if (exp->X_add_number)
   3078  1.1  skrll 	{
   3079  1.1  skrll 	  arity = 2;
   3080  1.1  skrll 	  opstr = "+";
   3081  1.1  skrll 	  operands[0] = symbol_relc_make_sym (exp->X_add_symbol);
   3082  1.1  skrll 	  operands[1] = symbol_relc_make_value (exp->X_add_number);
   3083  1.1  skrll 	  break;
   3084  1.1  skrll 	}
   3085  1.1  skrll       else
   3086  1.1  skrll 	return symbol_relc_make_sym (exp->X_add_symbol);
   3087  1.1  skrll 
   3088  1.1  skrll       /* Helper macros for nesting nodes.  */
   3089  1.1  skrll 
   3090  1.1  skrll #define HANDLE_XADD_OPT1(str_) 						\
   3091  1.1  skrll       if (exp->X_add_number)						\
   3092  1.1  skrll         {								\
   3093  1.1  skrll           arity = 2;							\
   3094  1.1  skrll           opstr = "+:" str_;						\
   3095  1.1  skrll           operands[0] = symbol_relc_make_sym (exp->X_add_symbol);	\
   3096  1.1  skrll           operands[1] = symbol_relc_make_value (exp->X_add_number);	\
   3097  1.1  skrll           break;							\
   3098  1.1  skrll         }								\
   3099  1.1  skrll       else								\
   3100  1.1  skrll         {								\
   3101  1.1  skrll           arity = 1;							\
   3102  1.1  skrll           opstr = str_;							\
   3103  1.1  skrll           operands[0] = symbol_relc_make_sym (exp->X_add_symbol);	\
   3104  1.1  skrll         }								\
   3105  1.1  skrll       break
   3106  1.1  skrll 
   3107  1.1  skrll #define HANDLE_XADD_OPT2(str_) 						\
   3108  1.1  skrll       if (exp->X_add_number)						\
   3109  1.1  skrll         {								\
   3110  1.1  skrll           arity = 3;							\
   3111  1.1  skrll           opstr = "+:" str_;						\
   3112  1.1  skrll           operands[0] = symbol_relc_make_sym (exp->X_add_symbol);	\
   3113  1.1  skrll           operands[1] = symbol_relc_make_sym (exp->X_op_symbol);	\
   3114  1.1  skrll           operands[2] = symbol_relc_make_value (exp->X_add_number);	\
   3115  1.1  skrll         }								\
   3116  1.1  skrll       else								\
   3117  1.1  skrll         {								\
   3118  1.1  skrll           arity = 2;							\
   3119  1.1  skrll           opstr = str_;							\
   3120  1.1  skrll           operands[0] = symbol_relc_make_sym (exp->X_add_symbol);	\
   3121  1.1  skrll           operands[1] = symbol_relc_make_sym (exp->X_op_symbol);	\
   3122  1.1  skrll         } 								\
   3123  1.1  skrll       break
   3124  1.1  skrll 
   3125  1.1  skrll       /* Nesting nodes.  */
   3126  1.1  skrll 
   3127  1.1  skrll     case O_uminus:       	HANDLE_XADD_OPT1 ("0-");
   3128  1.1  skrll     case O_bit_not:      	HANDLE_XADD_OPT1 ("~");
   3129  1.1  skrll     case O_logical_not:  	HANDLE_XADD_OPT1 ("!");
   3130  1.1  skrll     case O_multiply:     	HANDLE_XADD_OPT2 ("*");
   3131  1.1  skrll     case O_divide:       	HANDLE_XADD_OPT2 ("/");
   3132  1.1  skrll     case O_modulus:      	HANDLE_XADD_OPT2 ("%");
   3133  1.1  skrll     case O_left_shift:   	HANDLE_XADD_OPT2 ("<<");
   3134  1.1  skrll     case O_right_shift:  	HANDLE_XADD_OPT2 (">>");
   3135  1.1  skrll     case O_bit_inclusive_or:	HANDLE_XADD_OPT2 ("|");
   3136  1.1  skrll     case O_bit_exclusive_or:	HANDLE_XADD_OPT2 ("^");
   3137  1.1  skrll     case O_bit_and:      	HANDLE_XADD_OPT2 ("&");
   3138  1.1  skrll     case O_add:          	HANDLE_XADD_OPT2 ("+");
   3139  1.1  skrll     case O_subtract:     	HANDLE_XADD_OPT2 ("-");
   3140  1.1  skrll     case O_eq:           	HANDLE_XADD_OPT2 ("==");
   3141  1.1  skrll     case O_ne:           	HANDLE_XADD_OPT2 ("!=");
   3142  1.1  skrll     case O_lt:           	HANDLE_XADD_OPT2 ("<");
   3143  1.1  skrll     case O_le:           	HANDLE_XADD_OPT2 ("<=");
   3144  1.1  skrll     case O_ge:           	HANDLE_XADD_OPT2 (">=");
   3145  1.1  skrll     case O_gt:           	HANDLE_XADD_OPT2 (">");
   3146  1.1  skrll     case O_logical_and:  	HANDLE_XADD_OPT2 ("&&");
   3147  1.1  skrll     case O_logical_or:   	HANDLE_XADD_OPT2 ("||");
   3148  1.1  skrll     }
   3149  1.1  skrll 
   3150  1.1  skrll   /* Validate & reject early.  */
   3151  1.1  skrll   if (arity >= 1 && ((operands[0] == NULL) || (strlen (operands[0]) == 0)))
   3152  1.1  skrll     opstr = NULL;
   3153  1.1  skrll   if (arity >= 2 && ((operands[1] == NULL) || (strlen (operands[1]) == 0)))
   3154  1.1  skrll     opstr = NULL;
   3155  1.1  skrll   if (arity >= 3 && ((operands[2] == NULL) || (strlen (operands[2]) == 0)))
   3156  1.1  skrll     opstr = NULL;
   3157  1.1  skrll 
   3158  1.1  skrll   if (opstr == NULL)
   3159  1.1  skrll     concat_string = NULL;
   3160  1.1  skrll   else
   3161  1.1  skrll     {
   3162  1.1  skrll       /* Allocate new string; include inter-operand padding gaps etc.  */
   3163  1.1  skrll       concat_string = xmalloc (strlen (opstr)
   3164  1.1  skrll 			       + 1
   3165  1.1  skrll 			       + (arity >= 1 ? (strlen (operands[0]) + 1 ) : 0)
   3166  1.1  skrll 			       + (arity >= 2 ? (strlen (operands[1]) + 1 ) : 0)
   3167  1.1  skrll 			       + (arity >= 3 ? (strlen (operands[2]) + 0 ) : 0)
   3168  1.1  skrll 			       + 1);
   3169  1.1  skrll       assert (concat_string != NULL);
   3170  1.1  skrll 
   3171  1.1  skrll       /* Format the thing.  */
   3172  1.1  skrll       sprintf (concat_string,
   3173  1.1  skrll 	       (arity == 0 ? "%s" :
   3174  1.1  skrll 		arity == 1 ? "%s:%s" :
   3175  1.1  skrll 		arity == 2 ? "%s:%s:%s" :
   3176  1.1  skrll 		/* arity == 3 */ "%s:%s:%s:%s"),
   3177  1.1  skrll 	       opstr, operands[0], operands[1], operands[2]);
   3178  1.1  skrll     }
   3179  1.1  skrll 
   3180  1.1  skrll   /* Free operand strings (not opstr).  */
   3181  1.1  skrll   if (arity >= 1) xfree (operands[0]);
   3182  1.1  skrll   if (arity >= 2) xfree (operands[1]);
   3183  1.1  skrll   if (arity >= 3) xfree (operands[2]);
   3184             
   3185               return concat_string;
   3186             }
   3187             
   3188             #endif
   3189