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