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