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