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