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