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