* symbols.c (colon) [!WORKING_DOT_WORD]: Don't declare
[platform/upstream/binutils.git] / gas / symbols.c
1 /* symbols.c -symbol table-
2    Copyright 1987, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
3    1999, 2000, 2001, 2002, 2003, 2004
4    Free Software Foundation, Inc.
5
6    This file is part of GAS, the GNU Assembler.
7
8    GAS is free software; you can redistribute it and/or modify
9    it under the terms of the GNU General Public License as published by
10    the Free Software Foundation; either version 2, or (at your option)
11    any later version.
12
13    GAS is distributed in the hope that it will be useful,
14    but WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16    GNU General Public License for more details.
17
18    You should have received a copy of the GNU General Public License
19    along with GAS; see the file COPYING.  If not, write to the Free
20    Software Foundation, 59 Temple Place - Suite 330, Boston, MA
21    02111-1307, USA.  */
22
23 /* #define DEBUG_SYMS / * to debug symbol list maintenance.  */
24
25 #include "as.h"
26
27 #include "safe-ctype.h"
28 #include "obstack.h"            /* For "symbols.h" */
29 #include "subsegs.h"
30
31 #include "struc-symbol.h"
32
33 /* This is non-zero if symbols are case sensitive, which is the
34    default.  */
35 int symbols_case_sensitive = 1;
36
37 #ifndef WORKING_DOT_WORD
38 extern int new_broken_words;
39 #endif
40
41 /* symbol-name => struct symbol pointer */
42 static struct hash_control *sy_hash;
43
44 /* Table of local symbols.  */
45 static struct hash_control *local_hash;
46
47 /* Below are commented in "symbols.h".  */
48 symbolS *symbol_rootP;
49 symbolS *symbol_lastP;
50 symbolS abs_symbol;
51
52 #ifdef DEBUG_SYMS
53 #define debug_verify_symchain verify_symbol_chain
54 #else
55 #define debug_verify_symchain(root, last) ((void) 0)
56 #endif
57
58 #define DOLLAR_LABEL_CHAR       '\001'
59 #define LOCAL_LABEL_CHAR        '\002'
60
61 struct obstack notes;
62
63 static char *save_symbol_name (const char *);
64 static void fb_label_init (void);
65 static long dollar_label_instance (long);
66 static long fb_label_instance (long);
67
68 static void print_binary (FILE *, const char *, expressionS *);
69 static void report_op_error (symbolS *, symbolS *, symbolS *);
70
71 /* Return a pointer to a new symbol.  Die if we can't make a new
72    symbol.  Fill in the symbol's values.  Add symbol to end of symbol
73    chain.
74
75    This function should be called in the general case of creating a
76    symbol.  However, if the output file symbol table has already been
77    set, and you are certain that this symbol won't be wanted in the
78    output file, you can call symbol_create.  */
79
80 symbolS *
81 symbol_new (const char *name, segT segment, valueT valu, fragS *frag)
82 {
83   symbolS *symbolP = symbol_create (name, segment, valu, frag);
84
85   /* Link to end of symbol chain.  */
86 #ifdef BFD_ASSEMBLER
87   {
88     extern int symbol_table_frozen;
89     if (symbol_table_frozen)
90       abort ();
91   }
92 #endif
93   symbol_append (symbolP, symbol_lastP, &symbol_rootP, &symbol_lastP);
94
95   return symbolP;
96 }
97
98 /* Save a symbol name on a permanent obstack, and convert it according
99    to the object file format.  */
100
101 static char *
102 save_symbol_name (const char *name)
103 {
104   unsigned int name_length;
105   char *ret;
106
107   name_length = strlen (name) + 1;      /* +1 for \0.  */
108   obstack_grow (&notes, name, name_length);
109   ret = obstack_finish (&notes);
110
111 #ifdef STRIP_UNDERSCORE
112   if (ret[0] == '_')
113     ++ret;
114 #endif
115
116 #ifdef tc_canonicalize_symbol_name
117   ret = tc_canonicalize_symbol_name (ret);
118 #endif
119
120   if (! symbols_case_sensitive)
121     {
122       char *s;
123
124       for (s = ret; *s != '\0'; s++)
125         *s = TOUPPER (*s);
126     }
127
128   return ret;
129 }
130
131 symbolS *
132 symbol_create (const char *name, /* It is copied, the caller can destroy/modify.  */
133                segT segment,    /* Segment identifier (SEG_<something>).  */
134                valueT valu,     /* Symbol value.  */
135                fragS *frag      /* Associated fragment.  */)
136 {
137   char *preserved_copy_of_name;
138   symbolS *symbolP;
139
140   preserved_copy_of_name = save_symbol_name (name);
141
142   symbolP = (symbolS *) obstack_alloc (&notes, sizeof (symbolS));
143
144   /* symbol must be born in some fixed state.  This seems as good as any.  */
145   memset (symbolP, 0, sizeof (symbolS));
146
147 #ifdef BFD_ASSEMBLER
148   symbolP->bsym = bfd_make_empty_symbol (stdoutput);
149   if (symbolP->bsym == NULL)
150     as_perror ("%s", "bfd_make_empty_symbol");
151   symbolP->bsym->udata.p = (PTR) symbolP;
152 #endif
153   S_SET_NAME (symbolP, preserved_copy_of_name);
154
155   S_SET_SEGMENT (symbolP, segment);
156   S_SET_VALUE (symbolP, valu);
157   symbol_clear_list_pointers (symbolP);
158
159   symbolP->sy_frag = frag;
160 #ifndef BFD_ASSEMBLER
161   symbolP->sy_number = ~0;
162   symbolP->sy_name_offset = (unsigned int) ~0;
163 #endif
164
165   obj_symbol_new_hook (symbolP);
166
167 #ifdef tc_symbol_new_hook
168   tc_symbol_new_hook (symbolP);
169 #endif
170
171   return symbolP;
172 }
173 \f
174 #ifdef BFD_ASSEMBLER
175
176 /* Local symbol support.  If we can get away with it, we keep only a
177    small amount of information for local symbols.  */
178
179 static symbolS *local_symbol_convert (struct local_symbol *);
180
181 /* Used for statistics.  */
182
183 static unsigned long local_symbol_count;
184 static unsigned long local_symbol_conversion_count;
185
186 /* This macro is called with a symbol argument passed by reference.
187    It returns whether this is a local symbol.  If necessary, it
188    changes its argument to the real symbol.  */
189
190 #define LOCAL_SYMBOL_CHECK(s)                                           \
191   (s->bsym == NULL                                                      \
192    ? (local_symbol_converted_p ((struct local_symbol *) s)              \
193       ? (s = local_symbol_get_real_symbol ((struct local_symbol *) s),  \
194          0)                                                             \
195       : 1)                                                              \
196    : 0)
197
198 /* Create a local symbol and insert it into the local hash table.  */
199
200 struct local_symbol *
201 local_symbol_make (const char *name, segT section, valueT value, fragS *frag)
202 {
203   char *name_copy;
204   struct local_symbol *ret;
205
206   ++local_symbol_count;
207
208   name_copy = save_symbol_name (name);
209
210   ret = (struct local_symbol *) obstack_alloc (&notes, sizeof *ret);
211   ret->lsy_marker = NULL;
212   ret->lsy_name = name_copy;
213   ret->lsy_section = section;
214   local_symbol_set_frag (ret, frag);
215   ret->lsy_value = value;
216
217   hash_jam (local_hash, name_copy, (PTR) ret);
218
219   return ret;
220 }
221
222 /* Convert a local symbol into a real symbol.  Note that we do not
223    reclaim the space used by the local symbol.  */
224
225 static symbolS *
226 local_symbol_convert (struct local_symbol *locsym)
227 {
228   symbolS *ret;
229
230   assert (locsym->lsy_marker == NULL);
231   if (local_symbol_converted_p (locsym))
232     return local_symbol_get_real_symbol (locsym);
233
234   ++local_symbol_conversion_count;
235
236   ret = symbol_new (locsym->lsy_name, locsym->lsy_section, locsym->lsy_value,
237                     local_symbol_get_frag (locsym));
238
239   if (local_symbol_resolved_p (locsym))
240     ret->sy_resolved = 1;
241
242   /* Local symbols are always either defined or used.  */
243   ret->sy_used = 1;
244
245 #ifdef TC_LOCAL_SYMFIELD_CONVERT
246   TC_LOCAL_SYMFIELD_CONVERT (locsym, ret);
247 #endif
248
249   symbol_table_insert (ret);
250
251   local_symbol_mark_converted (locsym);
252   local_symbol_set_real_symbol (locsym, ret);
253
254   hash_jam (local_hash, locsym->lsy_name, NULL);
255
256   return ret;
257 }
258
259 #else /* ! BFD_ASSEMBLER */
260
261 #define LOCAL_SYMBOL_CHECK(s) 0
262 #define local_symbol_convert(s) ((symbolS *) s)
263
264 #endif /* ! BFD_ASSEMBLER */
265 \f
266 /* We have just seen "<name>:".
267    Creates a struct symbol unless it already exists.
268
269    Gripes if we are redefining a symbol incompatibly (and ignores it).  */
270
271 symbolS *
272 colon (/* Just seen "x:" - rattle symbols & frags.  */
273        const char *sym_name     /* Symbol name, as a cannonical string.  */
274        /* We copy this string: OK to alter later.  */)
275 {
276   register symbolS *symbolP;    /* Symbol we are working with.  */
277
278   /* Sun local labels go out of scope whenever a non-local symbol is
279      defined.  */
280   if (LOCAL_LABELS_DOLLAR)
281     {
282       int local;
283
284 #ifdef BFD_ASSEMBLER
285       local = bfd_is_local_label_name (stdoutput, sym_name);
286 #else
287       local = LOCAL_LABEL (sym_name);
288 #endif
289
290       if (! local)
291         dollar_label_clear ();
292     }
293
294 #ifndef WORKING_DOT_WORD
295   if (new_broken_words)
296     {
297       struct broken_word *a;
298       int possible_bytes;
299       fragS *frag_tmp;
300       char *frag_opcode;
301
302       if (now_seg == absolute_section)
303         {
304           as_bad (_("cannot define symbol `%s' in absolute section"), sym_name);
305           return NULL;
306         }
307
308       possible_bytes = (md_short_jump_size
309                         + new_broken_words * md_long_jump_size);
310
311       frag_tmp = frag_now;
312       frag_opcode = frag_var (rs_broken_word,
313                               possible_bytes,
314                               possible_bytes,
315                               (relax_substateT) 0,
316                               (symbolS *) broken_words,
317                               (offsetT) 0,
318                               NULL);
319
320       /* We want to store the pointer to where to insert the jump
321          table in the fr_opcode of the rs_broken_word frag.  This
322          requires a little hackery.  */
323       while (frag_tmp
324              && (frag_tmp->fr_type != rs_broken_word
325                  || frag_tmp->fr_opcode))
326         frag_tmp = frag_tmp->fr_next;
327       know (frag_tmp);
328       frag_tmp->fr_opcode = frag_opcode;
329       new_broken_words = 0;
330
331       for (a = broken_words; a && a->dispfrag == 0; a = a->next_broken_word)
332         a->dispfrag = frag_tmp;
333     }
334 #endif /* WORKING_DOT_WORD */
335
336   if ((symbolP = symbol_find (sym_name)) != 0)
337     {
338 #ifdef RESOLVE_SYMBOL_REDEFINITION
339       if (RESOLVE_SYMBOL_REDEFINITION (symbolP))
340         return symbolP;
341 #endif
342       /* Now check for undefined symbols.  */
343       if (LOCAL_SYMBOL_CHECK (symbolP))
344         {
345 #ifdef BFD_ASSEMBLER
346           struct local_symbol *locsym = (struct local_symbol *) symbolP;
347
348           if (locsym->lsy_section != undefined_section
349               && (local_symbol_get_frag (locsym) != frag_now
350                   || locsym->lsy_section != now_seg
351                   || locsym->lsy_value != frag_now_fix ()))
352             {
353               as_bad (_("symbol `%s' is already defined"), sym_name);
354               return symbolP;
355             }
356
357           locsym->lsy_section = now_seg;
358           local_symbol_set_frag (locsym, frag_now);
359           locsym->lsy_value = frag_now_fix ();
360 #endif
361         }
362       else if (!S_IS_DEFINED (symbolP) || S_IS_COMMON (symbolP))
363         {
364           if (S_GET_VALUE (symbolP) == 0)
365             {
366               symbolP->sy_frag = frag_now;
367 #ifdef OBJ_VMS
368               S_SET_OTHER (symbolP, const_flag);
369 #endif
370               S_SET_VALUE (symbolP, (valueT) frag_now_fix ());
371               S_SET_SEGMENT (symbolP, now_seg);
372 #ifdef N_UNDF
373               know (N_UNDF == 0);
374 #endif /* if we have one, it better be zero.  */
375
376             }
377           else
378             {
379               /* There are still several cases to check:
380
381                  A .comm/.lcomm symbol being redefined as initialized
382                  data is OK
383
384                  A .comm/.lcomm symbol being redefined with a larger
385                  size is also OK
386
387                  This only used to be allowed on VMS gas, but Sun cc
388                  on the sparc also depends on it.  */
389
390               if (((!S_IS_DEBUG (symbolP)
391                     && (!S_IS_DEFINED (symbolP) || S_IS_COMMON (symbolP))
392                     && S_IS_EXTERNAL (symbolP))
393                    || S_GET_SEGMENT (symbolP) == bss_section)
394                   && (now_seg == data_section
395                       || now_seg == S_GET_SEGMENT (symbolP)))
396                 {
397                   /* Select which of the 2 cases this is.  */
398                   if (now_seg != data_section)
399                     {
400                       /* New .comm for prev .comm symbol.
401
402                          If the new size is larger we just change its
403                          value.  If the new size is smaller, we ignore
404                          this symbol.  */
405                       if (S_GET_VALUE (symbolP)
406                           < ((unsigned) frag_now_fix ()))
407                         {
408                           S_SET_VALUE (symbolP, (valueT) frag_now_fix ());
409                         }
410                     }
411                   else
412                     {
413                       /* It is a .comm/.lcomm being converted to initialized
414                          data.  */
415                       symbolP->sy_frag = frag_now;
416 #ifdef OBJ_VMS
417                       S_SET_OTHER (symbolP, const_flag);
418 #endif
419                       S_SET_VALUE (symbolP, (valueT) frag_now_fix ());
420                       S_SET_SEGMENT (symbolP, now_seg); /* Keep N_EXT bit.  */
421                     }
422                 }
423               else
424                 {
425 #if (!defined (OBJ_AOUT) && !defined (OBJ_MAYBE_AOUT) \
426      && !defined (OBJ_BOUT) && !defined (OBJ_MAYBE_BOUT))
427                   static const char *od_buf = "";
428 #else
429                   char od_buf[100];
430                   od_buf[0] = '\0';
431 #ifdef BFD_ASSEMBLER
432                   if (OUTPUT_FLAVOR == bfd_target_aout_flavour)
433 #endif
434                     sprintf (od_buf, "%d.%d.",
435                              S_GET_OTHER (symbolP),
436                              S_GET_DESC (symbolP));
437 #endif
438                   as_bad (_("symbol `%s' is already defined as \"%s\"/%s%ld"),
439                             sym_name,
440                             segment_name (S_GET_SEGMENT (symbolP)),
441                             od_buf,
442                             (long) S_GET_VALUE (symbolP));
443                 }
444             }                   /* if the undefined symbol has no value  */
445         }
446       else
447         {
448           /* Don't blow up if the definition is the same.  */
449           if (!(frag_now == symbolP->sy_frag
450                 && S_GET_VALUE (symbolP) == frag_now_fix ()
451                 && S_GET_SEGMENT (symbolP) == now_seg))
452             as_bad (_("symbol `%s' is already defined"), sym_name);
453         }
454
455     }
456 #ifdef BFD_ASSEMBLER
457   else if (! flag_keep_locals && bfd_is_local_label_name (stdoutput, sym_name))
458     {
459       symbolP = (symbolS *) local_symbol_make (sym_name, now_seg,
460                                                (valueT) frag_now_fix (),
461                                                frag_now);
462     }
463 #endif /* BFD_ASSEMBLER */
464   else
465     {
466       symbolP = symbol_new (sym_name, now_seg, (valueT) frag_now_fix (),
467                             frag_now);
468 #ifdef OBJ_VMS
469       S_SET_OTHER (symbolP, const_flag);
470 #endif /* OBJ_VMS */
471
472       symbol_table_insert (symbolP);
473     }
474
475   if (mri_common_symbol != NULL)
476     {
477       /* This symbol is actually being defined within an MRI common
478          section.  This requires special handling.  */
479       if (LOCAL_SYMBOL_CHECK (symbolP))
480         symbolP = local_symbol_convert ((struct local_symbol *) symbolP);
481       symbolP->sy_value.X_op = O_symbol;
482       symbolP->sy_value.X_add_symbol = mri_common_symbol;
483       symbolP->sy_value.X_add_number = S_GET_VALUE (mri_common_symbol);
484       symbolP->sy_frag = &zero_address_frag;
485       S_SET_SEGMENT (symbolP, expr_section);
486       symbolP->sy_mri_common = 1;
487     }
488
489 #ifdef tc_frob_label
490   tc_frob_label (symbolP);
491 #endif
492 #ifdef obj_frob_label
493   obj_frob_label (symbolP);
494 #endif
495
496   return symbolP;
497 }
498 \f
499 /* Die if we can't insert the symbol.  */
500
501 void
502 symbol_table_insert (symbolS *symbolP)
503 {
504   register const char *error_string;
505
506   know (symbolP);
507   know (S_GET_NAME (symbolP));
508
509   if (LOCAL_SYMBOL_CHECK (symbolP))
510     {
511       error_string = hash_jam (local_hash, S_GET_NAME (symbolP),
512                                (PTR) symbolP);
513       if (error_string != NULL)
514         as_fatal (_("inserting \"%s\" into symbol table failed: %s"),
515                   S_GET_NAME (symbolP), error_string);
516       return;
517     }
518
519   if ((error_string = hash_jam (sy_hash, S_GET_NAME (symbolP), (PTR) symbolP)))
520     {
521       as_fatal (_("inserting \"%s\" into symbol table failed: %s"),
522                 S_GET_NAME (symbolP), error_string);
523     }                           /* on error  */
524 }
525 \f
526 /* If a symbol name does not exist, create it as undefined, and insert
527    it into the symbol table.  Return a pointer to it.  */
528
529 symbolS *
530 symbol_find_or_make (const char *name)
531 {
532   register symbolS *symbolP;
533
534   symbolP = symbol_find (name);
535
536   if (symbolP == NULL)
537     {
538 #ifdef BFD_ASSEMBLER
539       if (! flag_keep_locals && bfd_is_local_label_name (stdoutput, name))
540         {
541           symbolP = md_undefined_symbol ((char *) name);
542           if (symbolP != NULL)
543             return symbolP;
544
545           symbolP = (symbolS *) local_symbol_make (name, undefined_section,
546                                                    (valueT) 0,
547                                                    &zero_address_frag);
548           return symbolP;
549         }
550 #endif
551
552       symbolP = symbol_make (name);
553
554       symbol_table_insert (symbolP);
555     }                           /* if symbol wasn't found */
556
557   return (symbolP);
558 }
559
560 symbolS *
561 symbol_make (const char *name)
562 {
563   symbolS *symbolP;
564
565   /* Let the machine description default it, e.g. for register names.  */
566   symbolP = md_undefined_symbol ((char *) name);
567
568   if (!symbolP)
569     symbolP = symbol_new (name, undefined_section, (valueT) 0, &zero_address_frag);
570
571   return (symbolP);
572 }
573
574 symbolS *
575 symbol_temp_new (segT seg, valueT ofs, fragS *frag)
576 {
577   return symbol_new (FAKE_LABEL_NAME, seg, ofs, frag);
578 }
579
580 symbolS *
581 symbol_temp_new_now (void)
582 {
583   return symbol_temp_new (now_seg, frag_now_fix (), frag_now);
584 }
585
586 symbolS *
587 symbol_temp_make (void)
588 {
589   return symbol_make (FAKE_LABEL_NAME);
590 }
591
592 /* Implement symbol table lookup.
593    In:  A symbol's name as a string: '\0' can't be part of a symbol name.
594    Out: NULL if the name was not in the symbol table, else the address
595    of a struct symbol associated with that name.  */
596
597 symbolS *
598 symbol_find (const char *name)
599 {
600 #ifdef STRIP_UNDERSCORE
601   return (symbol_find_base (name, 1));
602 #else /* STRIP_UNDERSCORE */
603   return (symbol_find_base (name, 0));
604 #endif /* STRIP_UNDERSCORE */
605 }
606
607 symbolS *
608 symbol_find_exact (const char *name)
609 {
610 #ifdef BFD_ASSEMBLER
611   {
612     struct local_symbol *locsym;
613
614     locsym = (struct local_symbol *) hash_find (local_hash, name);
615     if (locsym != NULL)
616       return (symbolS *) locsym;
617   }
618 #endif
619
620   return ((symbolS *) hash_find (sy_hash, name));
621 }
622
623 symbolS *
624 symbol_find_base (const char *name, int strip_underscore)
625 {
626   if (strip_underscore && *name == '_')
627     name++;
628
629 #ifdef tc_canonicalize_symbol_name
630   {
631     char *copy;
632     size_t len = strlen (name) + 1;
633
634     copy = (char *) alloca (len);
635     memcpy (copy, name, len);
636     name = tc_canonicalize_symbol_name (copy);
637   }
638 #endif
639
640   if (! symbols_case_sensitive)
641     {
642       char *copy;
643       const char *orig;
644       unsigned char c;
645
646       orig = name;
647       name = copy = (char *) alloca (strlen (name) + 1);
648
649       while ((c = *orig++) != '\0')
650         {
651           *copy++ = TOUPPER (c);
652         }
653       *copy = '\0';
654     }
655
656   return symbol_find_exact (name);
657 }
658
659 /* Once upon a time, symbols were kept in a singly linked list.  At
660    least coff needs to be able to rearrange them from time to time, for
661    which a doubly linked list is much more convenient.  Loic did these
662    as macros which seemed dangerous to me so they're now functions.
663    xoxorich.  */
664
665 /* Link symbol ADDME after symbol TARGET in the chain.  */
666
667 void
668 symbol_append (symbolS *addme, symbolS *target,
669                symbolS **rootPP, symbolS **lastPP)
670 {
671   if (LOCAL_SYMBOL_CHECK (addme))
672     abort ();
673   if (target != NULL && LOCAL_SYMBOL_CHECK (target))
674     abort ();
675
676   if (target == NULL)
677     {
678       know (*rootPP == NULL);
679       know (*lastPP == NULL);
680       addme->sy_next = NULL;
681 #ifdef SYMBOLS_NEED_BACKPOINTERS
682       addme->sy_previous = NULL;
683 #endif
684       *rootPP = addme;
685       *lastPP = addme;
686       return;
687     }                           /* if the list is empty  */
688
689   if (target->sy_next != NULL)
690     {
691 #ifdef SYMBOLS_NEED_BACKPOINTERS
692       target->sy_next->sy_previous = addme;
693 #endif /* SYMBOLS_NEED_BACKPOINTERS */
694     }
695   else
696     {
697       know (*lastPP == target);
698       *lastPP = addme;
699     }                           /* if we have a next  */
700
701   addme->sy_next = target->sy_next;
702   target->sy_next = addme;
703
704 #ifdef SYMBOLS_NEED_BACKPOINTERS
705   addme->sy_previous = target;
706 #endif /* SYMBOLS_NEED_BACKPOINTERS */
707
708   debug_verify_symchain (symbol_rootP, symbol_lastP);
709 }
710
711 /* Set the chain pointers of SYMBOL to null.  */
712
713 void
714 symbol_clear_list_pointers (symbolS *symbolP)
715 {
716   if (LOCAL_SYMBOL_CHECK (symbolP))
717     abort ();
718   symbolP->sy_next = NULL;
719 #ifdef SYMBOLS_NEED_BACKPOINTERS
720   symbolP->sy_previous = NULL;
721 #endif
722 }
723
724 #ifdef SYMBOLS_NEED_BACKPOINTERS
725 /* Remove SYMBOLP from the list.  */
726
727 void
728 symbol_remove (symbolS *symbolP, symbolS **rootPP, symbolS **lastPP)
729 {
730   if (LOCAL_SYMBOL_CHECK (symbolP))
731     abort ();
732
733   if (symbolP == *rootPP)
734     {
735       *rootPP = symbolP->sy_next;
736     }                           /* if it was the root  */
737
738   if (symbolP == *lastPP)
739     {
740       *lastPP = symbolP->sy_previous;
741     }                           /* if it was the tail  */
742
743   if (symbolP->sy_next != NULL)
744     {
745       symbolP->sy_next->sy_previous = symbolP->sy_previous;
746     }                           /* if not last  */
747
748   if (symbolP->sy_previous != NULL)
749     {
750       symbolP->sy_previous->sy_next = symbolP->sy_next;
751     }                           /* if not first  */
752
753   debug_verify_symchain (*rootPP, *lastPP);
754 }
755
756 /* Link symbol ADDME before symbol TARGET in the chain.  */
757
758 void
759 symbol_insert (symbolS *addme, symbolS *target,
760                symbolS **rootPP, symbolS **lastPP ATTRIBUTE_UNUSED)
761 {
762   if (LOCAL_SYMBOL_CHECK (addme))
763     abort ();
764   if (LOCAL_SYMBOL_CHECK (target))
765     abort ();
766
767   if (target->sy_previous != NULL)
768     {
769       target->sy_previous->sy_next = addme;
770     }
771   else
772     {
773       know (*rootPP == target);
774       *rootPP = addme;
775     }                           /* if not first  */
776
777   addme->sy_previous = target->sy_previous;
778   target->sy_previous = addme;
779   addme->sy_next = target;
780
781   debug_verify_symchain (*rootPP, *lastPP);
782 }
783
784 #endif /* SYMBOLS_NEED_BACKPOINTERS */
785
786 void
787 verify_symbol_chain (symbolS *rootP, symbolS *lastP)
788 {
789   symbolS *symbolP = rootP;
790
791   if (symbolP == NULL)
792     return;
793
794   for (; symbol_next (symbolP) != NULL; symbolP = symbol_next (symbolP))
795     {
796 #ifdef BFD_ASSEMBLER
797       assert (symbolP->bsym != NULL);
798 #endif
799 #ifdef SYMBOLS_NEED_BACKPOINTERS
800       assert (symbolP->sy_next->sy_previous == symbolP);
801 #else
802       /* Walk the list anyways, to make sure pointers are still good.  */
803       ;
804 #endif /* SYMBOLS_NEED_BACKPOINTERS */
805     }
806
807   assert (lastP == symbolP);
808 }
809
810 void
811 verify_symbol_chain_2 (symbolS *sym)
812 {
813   symbolS *p = sym, *n = sym;
814 #ifdef SYMBOLS_NEED_BACKPOINTERS
815   while (symbol_previous (p))
816     p = symbol_previous (p);
817 #endif
818   while (symbol_next (n))
819     n = symbol_next (n);
820   verify_symbol_chain (p, n);
821 }
822
823 static void
824 report_op_error (symbolS *symp, symbolS *left, symbolS *right)
825 {
826   char *file;
827   unsigned int line;
828   segT seg_left = S_GET_SEGMENT (left);
829   segT seg_right = right ? S_GET_SEGMENT (right) : 0;
830
831   if (expr_symbol_where (symp, &file, &line))
832     {
833       if (seg_left == undefined_section)
834         as_bad_where (file, line,
835                       _("undefined symbol `%s' in operation"),
836                       S_GET_NAME (left));
837       if (seg_right == undefined_section)
838         as_bad_where (file, line,
839                       _("undefined symbol `%s' in operation"),
840                       S_GET_NAME (right));
841       if (seg_left != undefined_section
842           && seg_right != undefined_section)
843         {
844           if (right)
845             as_bad_where (file, line,
846                           _("invalid sections for operation on `%s' and `%s'"),
847                           S_GET_NAME (left), S_GET_NAME (right));
848           else
849             as_bad_where (file, line,
850                           _("invalid section for operation on `%s'"),
851                           S_GET_NAME (left));
852         }
853
854     }
855   else
856     {
857       if (seg_left == undefined_section)
858         as_bad (_("undefined symbol `%s' in operation setting `%s'"),
859                 S_GET_NAME (left), S_GET_NAME (symp));
860       if (seg_right == undefined_section)
861         as_bad (_("undefined symbol `%s' in operation setting `%s'"),
862                 S_GET_NAME (right), S_GET_NAME (symp));
863       if (seg_left != undefined_section
864           && seg_right != undefined_section)
865         {
866           if (right)
867             as_bad_where (file, line,
868                           _("invalid sections for operation on `%s' and `%s' setting `%s'"),
869                           S_GET_NAME (left), S_GET_NAME (right), S_GET_NAME (symp));
870           else
871             as_bad_where (file, line,
872                           _("invalid section for operation on `%s' setting `%s'"),
873                           S_GET_NAME (left), S_GET_NAME (symp));
874         }
875     }
876 }
877
878 /* Resolve the value of a symbol.  This is called during the final
879    pass over the symbol table to resolve any symbols with complex
880    values.  */
881
882 valueT
883 resolve_symbol_value (symbolS *symp)
884 {
885   int resolved;
886   valueT final_val = 0;
887   segT final_seg;
888
889 #ifdef BFD_ASSEMBLER
890   if (LOCAL_SYMBOL_CHECK (symp))
891     {
892       struct local_symbol *locsym = (struct local_symbol *) symp;
893
894       final_val = locsym->lsy_value;
895       if (local_symbol_resolved_p (locsym))
896         return final_val;
897
898       final_val += local_symbol_get_frag (locsym)->fr_address / OCTETS_PER_BYTE;
899
900       if (finalize_syms)
901         {
902           locsym->lsy_value = final_val;
903           local_symbol_mark_resolved (locsym);
904         }
905
906       return final_val;
907     }
908 #endif
909
910   if (symp->sy_resolved)
911     {
912       if (symp->sy_value.X_op == O_constant)
913         return (valueT) symp->sy_value.X_add_number;
914       else
915         return 0;
916     }
917
918   resolved = 0;
919   final_seg = S_GET_SEGMENT (symp);
920
921   if (symp->sy_resolving)
922     {
923       if (finalize_syms)
924         as_bad (_("symbol definition loop encountered at `%s'"),
925                 S_GET_NAME (symp));
926       final_val = 0;
927       resolved = 1;
928     }
929   else
930     {
931       symbolS *add_symbol, *op_symbol;
932       offsetT left, right;
933       segT seg_left, seg_right;
934       operatorT op;
935
936       symp->sy_resolving = 1;
937
938       /* Help out with CSE.  */
939       add_symbol = symp->sy_value.X_add_symbol;
940       op_symbol = symp->sy_value.X_op_symbol;
941       final_val = symp->sy_value.X_add_number;
942       op = symp->sy_value.X_op;
943
944       switch (op)
945         {
946         default:
947           BAD_CASE (op);
948           break;
949
950         case O_absent:
951           final_val = 0;
952           /* Fall through.  */
953
954         case O_constant:
955           final_val += symp->sy_frag->fr_address / OCTETS_PER_BYTE;
956           if (final_seg == expr_section)
957             final_seg = absolute_section;
958           resolved = 1;
959           break;
960
961         case O_symbol:
962         case O_symbol_rva:
963           left = resolve_symbol_value (add_symbol);
964           seg_left = S_GET_SEGMENT (add_symbol);
965           if (finalize_syms)
966             symp->sy_value.X_op_symbol = NULL;
967
968         do_symbol:
969           if (symp->sy_mri_common)
970             {
971               /* This is a symbol inside an MRI common section.  The
972                  relocation routines are going to handle it specially.
973                  Don't change the value.  */
974               resolved = symbol_resolved_p (add_symbol);
975               break;
976             }
977
978           if (finalize_syms && final_val == 0)
979             {
980               if (LOCAL_SYMBOL_CHECK (add_symbol))
981                 add_symbol = local_symbol_convert ((struct local_symbol *)
982                                                    add_symbol);
983               copy_symbol_attributes (symp, add_symbol);
984             }
985
986           /* If we have equated this symbol to an undefined or common
987              symbol, keep X_op set to O_symbol, and don't change
988              X_add_number.  This permits the routine which writes out
989              relocation to detect this case, and convert the
990              relocation to be against the symbol to which this symbol
991              is equated.  */
992           if (! S_IS_DEFINED (add_symbol) || S_IS_COMMON (add_symbol))
993             {
994               if (finalize_syms)
995                 {
996                   symp->sy_value.X_op = O_symbol;
997                   symp->sy_value.X_add_symbol = add_symbol;
998                   symp->sy_value.X_add_number = final_val;
999                   /* Use X_op_symbol as a flag.  */
1000                   symp->sy_value.X_op_symbol = add_symbol;
1001                   final_seg = seg_left;
1002                 }
1003               final_val = 0;
1004               resolved = symbol_resolved_p (add_symbol);
1005               symp->sy_resolving = 0;
1006               goto exit_dont_set_value;
1007             }
1008           else if (finalize_syms && final_seg == expr_section
1009                    && seg_left != expr_section)
1010             {
1011               /* If the symbol is an expression symbol, do similarly
1012                  as for undefined and common syms above.  Handles
1013                  "sym +/- expr" where "expr" cannot be evaluated
1014                  immediately, and we want relocations to be against
1015                  "sym", eg. because it is weak.  */
1016               symp->sy_value.X_op = O_symbol;
1017               symp->sy_value.X_add_symbol = add_symbol;
1018               symp->sy_value.X_add_number = final_val;
1019               symp->sy_value.X_op_symbol = add_symbol;
1020               final_seg = seg_left;
1021               final_val += symp->sy_frag->fr_address + left;
1022               resolved = symbol_resolved_p (add_symbol);
1023               symp->sy_resolving = 0;
1024               goto exit_dont_set_value;
1025             }
1026           else
1027             {
1028               final_val += symp->sy_frag->fr_address + left;
1029               if (final_seg == expr_section || final_seg == undefined_section)
1030                 final_seg = seg_left;
1031             }
1032
1033           resolved = symbol_resolved_p (add_symbol);
1034           break;
1035
1036         case O_uminus:
1037         case O_bit_not:
1038         case O_logical_not:
1039           left = resolve_symbol_value (add_symbol);
1040           seg_left = S_GET_SEGMENT (add_symbol);
1041
1042           /* By reducing these to the relevant dyadic operator, we get
1043                 !S -> S == 0    permitted on anything,
1044                 -S -> 0 - S     only permitted on absolute
1045                 ~S -> S ^ ~0    only permitted on absolute  */
1046           if (op != O_logical_not && seg_left != absolute_section
1047               && finalize_syms)
1048             report_op_error (symp, add_symbol, NULL);
1049
1050           if (final_seg == expr_section || final_seg == undefined_section)
1051             final_seg = absolute_section;
1052
1053           if (op == O_uminus)
1054             left = -left;
1055           else if (op == O_logical_not)
1056             left = !left;
1057           else
1058             left = ~left;
1059
1060           final_val += left + symp->sy_frag->fr_address;
1061
1062           resolved = symbol_resolved_p (add_symbol);
1063           break;
1064
1065         case O_multiply:
1066         case O_divide:
1067         case O_modulus:
1068         case O_left_shift:
1069         case O_right_shift:
1070         case O_bit_inclusive_or:
1071         case O_bit_or_not:
1072         case O_bit_exclusive_or:
1073         case O_bit_and:
1074         case O_add:
1075         case O_subtract:
1076         case O_eq:
1077         case O_ne:
1078         case O_lt:
1079         case O_le:
1080         case O_ge:
1081         case O_gt:
1082         case O_logical_and:
1083         case O_logical_or:
1084           left = resolve_symbol_value (add_symbol);
1085           right = resolve_symbol_value (op_symbol);
1086           seg_left = S_GET_SEGMENT (add_symbol);
1087           seg_right = S_GET_SEGMENT (op_symbol);
1088
1089           /* Simplify addition or subtraction of a constant by folding the
1090              constant into X_add_number.  */
1091           if (op == O_add)
1092             {
1093               if (seg_right == absolute_section)
1094                 {
1095                   final_val += right;
1096                   goto do_symbol;
1097                 }
1098               else if (seg_left == absolute_section)
1099                 {
1100                   final_val += left;
1101                   add_symbol = op_symbol;
1102                   left = right;
1103                   seg_left = seg_right;
1104                   goto do_symbol;
1105                 }
1106             }
1107           else if (op == O_subtract)
1108             {
1109               if (seg_right == absolute_section)
1110                 {
1111                   final_val -= right;
1112                   goto do_symbol;
1113                 }
1114             }
1115
1116           /* Equality and non-equality tests are permitted on anything.
1117              Subtraction, and other comparison operators are permitted if
1118              both operands are in the same section.  Otherwise, both
1119              operands must be absolute.  We already handled the case of
1120              addition or subtraction of a constant above.  This will
1121              probably need to be changed for an object file format which
1122              supports arbitrary expressions, such as IEEE-695.
1123
1124              Don't emit messages unless we're finalizing the symbol value,
1125              otherwise we may get the same message multiple times.  */
1126           if (finalize_syms
1127               && !(seg_left == absolute_section
1128                    && seg_right == absolute_section)
1129               && !(op == O_eq || op == O_ne)
1130               && !((op == O_subtract
1131                     || op == O_lt || op == O_le || op == O_ge || op == O_gt)
1132                    && seg_left == seg_right
1133                    && (seg_left != undefined_section
1134                        || add_symbol == op_symbol)))
1135             report_op_error (symp, add_symbol, op_symbol);
1136
1137           if (final_seg == expr_section || final_seg == undefined_section)
1138             final_seg = absolute_section;
1139
1140           /* Check for division by zero.  */
1141           if ((op == O_divide || op == O_modulus) && right == 0)
1142             {
1143               /* If seg_right is not absolute_section, then we've
1144                  already issued a warning about using a bad symbol.  */
1145               if (seg_right == absolute_section && finalize_syms)
1146                 {
1147                   char *file;
1148                   unsigned int line;
1149
1150                   if (expr_symbol_where (symp, &file, &line))
1151                     as_bad_where (file, line, _("division by zero"));
1152                   else
1153                     as_bad (_("division by zero when setting `%s'"),
1154                             S_GET_NAME (symp));
1155                 }
1156
1157               right = 1;
1158             }
1159
1160           switch (symp->sy_value.X_op)
1161             {
1162             case O_multiply:            left *= right; break;
1163             case O_divide:              left /= right; break;
1164             case O_modulus:             left %= right; break;
1165             case O_left_shift:          left <<= right; break;
1166             case O_right_shift:         left >>= right; break;
1167             case O_bit_inclusive_or:    left |= right; break;
1168             case O_bit_or_not:          left |= ~right; break;
1169             case O_bit_exclusive_or:    left ^= right; break;
1170             case O_bit_and:             left &= right; break;
1171             case O_add:                 left += right; break;
1172             case O_subtract:            left -= right; break;
1173             case O_eq:
1174             case O_ne:
1175               left = (left == right && seg_left == seg_right
1176                       && (seg_left != undefined_section
1177                           || add_symbol == op_symbol)
1178                       ? ~ (offsetT) 0 : 0);
1179               if (symp->sy_value.X_op == O_ne)
1180                 left = ~left;
1181               break;
1182             case O_lt:  left = left <  right ? ~ (offsetT) 0 : 0; break;
1183             case O_le:  left = left <= right ? ~ (offsetT) 0 : 0; break;
1184             case O_ge:  left = left >= right ? ~ (offsetT) 0 : 0; break;
1185             case O_gt:  left = left >  right ? ~ (offsetT) 0 : 0; break;
1186             case O_logical_and: left = left && right; break;
1187             case O_logical_or:  left = left || right; break;
1188             default:            abort ();
1189             }
1190
1191           final_val += symp->sy_frag->fr_address + left;
1192           if (final_seg == expr_section || final_seg == undefined_section)
1193             {
1194               if (seg_left == undefined_section
1195                   || seg_right == undefined_section)
1196                 final_seg = undefined_section;
1197               else if (seg_left == absolute_section)
1198                 final_seg = seg_right;
1199               else
1200                 final_seg = seg_left;
1201             }
1202           resolved = (symbol_resolved_p (add_symbol)
1203                       && symbol_resolved_p (op_symbol));
1204           break;
1205
1206         case O_register:
1207         case O_big:
1208         case O_illegal:
1209           /* Give an error (below) if not in expr_section.  We don't
1210              want to worry about expr_section symbols, because they
1211              are fictional (they are created as part of expression
1212              resolution), and any problems may not actually mean
1213              anything.  */
1214           break;
1215         }
1216
1217       symp->sy_resolving = 0;
1218     }
1219
1220   if (finalize_syms)
1221     S_SET_VALUE (symp, final_val);
1222
1223 exit_dont_set_value:
1224   /* Always set the segment, even if not finalizing the value.
1225      The segment is used to determine whether a symbol is defined.  */
1226 #if defined (OBJ_AOUT) && ! defined (BFD_ASSEMBLER)
1227   /* The old a.out backend does not handle S_SET_SEGMENT correctly
1228      for a stab symbol, so we use this bad hack.  */
1229   if (final_seg != S_GET_SEGMENT (symp))
1230 #endif
1231     S_SET_SEGMENT (symp, final_seg);
1232
1233   /* Don't worry if we can't resolve an expr_section symbol.  */
1234   if (finalize_syms)
1235     {
1236       if (resolved)
1237         symp->sy_resolved = 1;
1238       else if (S_GET_SEGMENT (symp) != expr_section)
1239         {
1240           as_bad (_("can't resolve value for symbol `%s'"),
1241                   S_GET_NAME (symp));
1242           symp->sy_resolved = 1;
1243         }
1244     }
1245
1246   return final_val;
1247 }
1248
1249 #ifdef BFD_ASSEMBLER
1250
1251 static void resolve_local_symbol (const char *, PTR);
1252
1253 /* A static function passed to hash_traverse.  */
1254
1255 static void
1256 resolve_local_symbol (const char *key ATTRIBUTE_UNUSED, PTR value)
1257 {
1258   if (value != NULL)
1259     resolve_symbol_value (value);
1260 }
1261
1262 #endif
1263
1264 /* Resolve all local symbols.  */
1265
1266 void
1267 resolve_local_symbol_values (void)
1268 {
1269 #ifdef BFD_ASSEMBLER
1270   hash_traverse (local_hash, resolve_local_symbol);
1271 #endif
1272 }
1273
1274 /* Dollar labels look like a number followed by a dollar sign.  Eg, "42$".
1275    They are *really* local.  That is, they go out of scope whenever we see a
1276    label that isn't local.  Also, like fb labels, there can be multiple
1277    instances of a dollar label.  Therefor, we name encode each instance with
1278    the instance number, keep a list of defined symbols separate from the real
1279    symbol table, and we treat these buggers as a sparse array.  */
1280
1281 static long *dollar_labels;
1282 static long *dollar_label_instances;
1283 static char *dollar_label_defines;
1284 static unsigned long dollar_label_count;
1285 static unsigned long dollar_label_max;
1286
1287 int
1288 dollar_label_defined (long label)
1289 {
1290   long *i;
1291
1292   know ((dollar_labels != NULL) || (dollar_label_count == 0));
1293
1294   for (i = dollar_labels; i < dollar_labels + dollar_label_count; ++i)
1295     if (*i == label)
1296       return dollar_label_defines[i - dollar_labels];
1297
1298   /* If we get here, label isn't defined.  */
1299   return 0;
1300 }
1301
1302 static long
1303 dollar_label_instance (long label)
1304 {
1305   long *i;
1306
1307   know ((dollar_labels != NULL) || (dollar_label_count == 0));
1308
1309   for (i = dollar_labels; i < dollar_labels + dollar_label_count; ++i)
1310     if (*i == label)
1311       return (dollar_label_instances[i - dollar_labels]);
1312
1313   /* If we get here, we haven't seen the label before.
1314      Therefore its instance count is zero.  */
1315   return 0;
1316 }
1317
1318 void
1319 dollar_label_clear (void)
1320 {
1321   memset (dollar_label_defines, '\0', (unsigned int) dollar_label_count);
1322 }
1323
1324 #define DOLLAR_LABEL_BUMP_BY 10
1325
1326 void
1327 define_dollar_label (long label)
1328 {
1329   long *i;
1330
1331   for (i = dollar_labels; i < dollar_labels + dollar_label_count; ++i)
1332     if (*i == label)
1333       {
1334         ++dollar_label_instances[i - dollar_labels];
1335         dollar_label_defines[i - dollar_labels] = 1;
1336         return;
1337       }
1338
1339   /* If we get to here, we don't have label listed yet.  */
1340
1341   if (dollar_labels == NULL)
1342     {
1343       dollar_labels = (long *) xmalloc (DOLLAR_LABEL_BUMP_BY * sizeof (long));
1344       dollar_label_instances = (long *) xmalloc (DOLLAR_LABEL_BUMP_BY * sizeof (long));
1345       dollar_label_defines = xmalloc (DOLLAR_LABEL_BUMP_BY);
1346       dollar_label_max = DOLLAR_LABEL_BUMP_BY;
1347       dollar_label_count = 0;
1348     }
1349   else if (dollar_label_count == dollar_label_max)
1350     {
1351       dollar_label_max += DOLLAR_LABEL_BUMP_BY;
1352       dollar_labels = (long *) xrealloc ((char *) dollar_labels,
1353                                          dollar_label_max * sizeof (long));
1354       dollar_label_instances = (long *) xrealloc ((char *) dollar_label_instances,
1355                                           dollar_label_max * sizeof (long));
1356       dollar_label_defines = xrealloc (dollar_label_defines, dollar_label_max);
1357     }                           /* if we needed to grow  */
1358
1359   dollar_labels[dollar_label_count] = label;
1360   dollar_label_instances[dollar_label_count] = 1;
1361   dollar_label_defines[dollar_label_count] = 1;
1362   ++dollar_label_count;
1363 }
1364
1365 /* Caller must copy returned name: we re-use the area for the next name.
1366
1367    The mth occurence of label n: is turned into the symbol "Ln^Am"
1368    where n is the label number and m is the instance number. "L" makes
1369    it a label discarded unless debugging and "^A"('\1') ensures no
1370    ordinary symbol SHOULD get the same name as a local label
1371    symbol. The first "4:" is "L4^A1" - the m numbers begin at 1.
1372
1373    fb labels get the same treatment, except that ^B is used in place
1374    of ^A.  */
1375
1376 char *                          /* Return local label name.  */
1377 dollar_label_name (register long n,     /* we just saw "n$:" : n a number.  */
1378                    register int augend  /* 0 for current instance, 1 for new instance.  */)
1379 {
1380   long i;
1381   /* Returned to caller, then copied.  Used for created names ("4f").  */
1382   static char symbol_name_build[24];
1383   register char *p;
1384   register char *q;
1385   char symbol_name_temporary[20];       /* Build up a number, BACKWARDS.  */
1386
1387   know (n >= 0);
1388   know (augend == 0 || augend == 1);
1389   p = symbol_name_build;
1390 #ifdef LOCAL_LABEL_PREFIX
1391   *p++ = LOCAL_LABEL_PREFIX;
1392 #endif
1393   *p++ = 'L';
1394
1395   /* Next code just does sprintf( {}, "%d", n);  */
1396   /* Label number.  */
1397   q = symbol_name_temporary;
1398   for (*q++ = 0, i = n; i; ++q)
1399     {
1400       *q = i % 10 + '0';
1401       i /= 10;
1402     }
1403   while ((*p = *--q) != '\0')
1404     ++p;
1405
1406   *p++ = DOLLAR_LABEL_CHAR;             /* ^A  */
1407
1408   /* Instance number.  */
1409   q = symbol_name_temporary;
1410   for (*q++ = 0, i = dollar_label_instance (n) + augend; i; ++q)
1411     {
1412       *q = i % 10 + '0';
1413       i /= 10;
1414     }
1415   while ((*p++ = *--q) != '\0');;
1416
1417   /* The label, as a '\0' ended string, starts at symbol_name_build.  */
1418   return symbol_name_build;
1419 }
1420
1421 /* Somebody else's idea of local labels. They are made by "n:" where n
1422    is any decimal digit. Refer to them with
1423     "nb" for previous (backward) n:
1424    or "nf" for next (forward) n:.
1425
1426    We do a little better and let n be any number, not just a single digit, but
1427    since the other guy's assembler only does ten, we treat the first ten
1428    specially.
1429
1430    Like someone else's assembler, we have one set of local label counters for
1431    entire assembly, not one set per (sub)segment like in most assemblers. This
1432    implies that one can refer to a label in another segment, and indeed some
1433    crufty compilers have done just that.
1434
1435    Since there could be a LOT of these things, treat them as a sparse
1436    array.  */
1437
1438 #define FB_LABEL_SPECIAL (10)
1439
1440 static long fb_low_counter[FB_LABEL_SPECIAL];
1441 static long *fb_labels;
1442 static long *fb_label_instances;
1443 static long fb_label_count;
1444 static long fb_label_max;
1445
1446 /* This must be more than FB_LABEL_SPECIAL.  */
1447 #define FB_LABEL_BUMP_BY (FB_LABEL_SPECIAL + 6)
1448
1449 static void
1450 fb_label_init (void)
1451 {
1452   memset ((void *) fb_low_counter, '\0', sizeof (fb_low_counter));
1453 }
1454
1455 /* Add one to the instance number of this fb label.  */
1456
1457 void
1458 fb_label_instance_inc (long label)
1459 {
1460   long *i;
1461
1462   if (label < FB_LABEL_SPECIAL)
1463     {
1464       ++fb_low_counter[label];
1465       return;
1466     }
1467
1468   if (fb_labels != NULL)
1469     {
1470       for (i = fb_labels + FB_LABEL_SPECIAL;
1471            i < fb_labels + fb_label_count; ++i)
1472         {
1473           if (*i == label)
1474             {
1475               ++fb_label_instances[i - fb_labels];
1476               return;
1477             }                   /* if we find it  */
1478         }                       /* for each existing label  */
1479     }
1480
1481   /* If we get to here, we don't have label listed yet.  */
1482
1483   if (fb_labels == NULL)
1484     {
1485       fb_labels = (long *) xmalloc (FB_LABEL_BUMP_BY * sizeof (long));
1486       fb_label_instances = (long *) xmalloc (FB_LABEL_BUMP_BY * sizeof (long));
1487       fb_label_max = FB_LABEL_BUMP_BY;
1488       fb_label_count = FB_LABEL_SPECIAL;
1489
1490     }
1491   else if (fb_label_count == fb_label_max)
1492     {
1493       fb_label_max += FB_LABEL_BUMP_BY;
1494       fb_labels = (long *) xrealloc ((char *) fb_labels,
1495                                      fb_label_max * sizeof (long));
1496       fb_label_instances = (long *) xrealloc ((char *) fb_label_instances,
1497                                               fb_label_max * sizeof (long));
1498     }                           /* if we needed to grow  */
1499
1500   fb_labels[fb_label_count] = label;
1501   fb_label_instances[fb_label_count] = 1;
1502   ++fb_label_count;
1503 }
1504
1505 static long
1506 fb_label_instance (long label)
1507 {
1508   long *i;
1509
1510   if (label < FB_LABEL_SPECIAL)
1511     {
1512       return (fb_low_counter[label]);
1513     }
1514
1515   if (fb_labels != NULL)
1516     {
1517       for (i = fb_labels + FB_LABEL_SPECIAL;
1518            i < fb_labels + fb_label_count; ++i)
1519         {
1520           if (*i == label)
1521             {
1522               return (fb_label_instances[i - fb_labels]);
1523             }                   /* if we find it  */
1524         }                       /* for each existing label  */
1525     }
1526
1527   /* We didn't find the label, so this must be a reference to the
1528      first instance.  */
1529   return 0;
1530 }
1531
1532 /* Caller must copy returned name: we re-use the area for the next name.
1533
1534    The mth occurence of label n: is turned into the symbol "Ln^Bm"
1535    where n is the label number and m is the instance number. "L" makes
1536    it a label discarded unless debugging and "^B"('\2') ensures no
1537    ordinary symbol SHOULD get the same name as a local label
1538    symbol. The first "4:" is "L4^B1" - the m numbers begin at 1.
1539
1540    dollar labels get the same treatment, except that ^A is used in
1541    place of ^B.  */
1542
1543 char *                          /* Return local label name.  */
1544 fb_label_name (long n,  /* We just saw "n:", "nf" or "nb" : n a number.  */
1545                long augend      /* 0 for nb, 1 for n:, nf.  */)
1546 {
1547   long i;
1548   /* Returned to caller, then copied.  Used for created names ("4f").  */
1549   static char symbol_name_build[24];
1550   register char *p;
1551   register char *q;
1552   char symbol_name_temporary[20];       /* Build up a number, BACKWARDS.  */
1553
1554   know (n >= 0);
1555   know (augend == 0 || augend == 1);
1556   p = symbol_name_build;
1557 #ifdef LOCAL_LABEL_PREFIX
1558   *p++ = LOCAL_LABEL_PREFIX;
1559 #endif
1560   *p++ = 'L';
1561
1562   /* Next code just does sprintf( {}, "%d", n);  */
1563   /* Label number.  */
1564   q = symbol_name_temporary;
1565   for (*q++ = 0, i = n; i; ++q)
1566     {
1567       *q = i % 10 + '0';
1568       i /= 10;
1569     }
1570   while ((*p = *--q) != '\0')
1571     ++p;
1572
1573   *p++ = LOCAL_LABEL_CHAR;              /* ^B  */
1574
1575   /* Instance number.  */
1576   q = symbol_name_temporary;
1577   for (*q++ = 0, i = fb_label_instance (n) + augend; i; ++q)
1578     {
1579       *q = i % 10 + '0';
1580       i /= 10;
1581     }
1582   while ((*p++ = *--q) != '\0');;
1583
1584   /* The label, as a '\0' ended string, starts at symbol_name_build.  */
1585   return (symbol_name_build);
1586 }
1587
1588 /* Decode name that may have been generated by foo_label_name() above.
1589    If the name wasn't generated by foo_label_name(), then return it
1590    unaltered.  This is used for error messages.  */
1591
1592 char *
1593 decode_local_label_name (char *s)
1594 {
1595   char *p;
1596   char *symbol_decode;
1597   int label_number;
1598   int instance_number;
1599   char *type;
1600   const char *message_format;
1601   int index = 0;
1602
1603 #ifdef LOCAL_LABEL_PREFIX
1604   if (s[index] == LOCAL_LABEL_PREFIX)
1605     ++index;
1606 #endif
1607
1608   if (s[index] != 'L')
1609     return s;
1610
1611   for (label_number = 0, p = s + index + 1; ISDIGIT (*p); ++p)
1612     label_number = (10 * label_number) + *p - '0';
1613
1614   if (*p == DOLLAR_LABEL_CHAR)
1615     type = "dollar";
1616   else if (*p == LOCAL_LABEL_CHAR)
1617     type = "fb";
1618   else
1619     return s;
1620
1621   for (instance_number = 0, p++; ISDIGIT (*p); ++p)
1622     instance_number = (10 * instance_number) + *p - '0';
1623
1624   message_format = _("\"%d\" (instance number %d of a %s label)");
1625   symbol_decode = obstack_alloc (&notes, strlen (message_format) + 30);
1626   sprintf (symbol_decode, message_format, label_number, instance_number, type);
1627
1628   return symbol_decode;
1629 }
1630
1631 /* Get the value of a symbol.  */
1632
1633 valueT
1634 S_GET_VALUE (symbolS *s)
1635 {
1636 #ifdef BFD_ASSEMBLER
1637   if (LOCAL_SYMBOL_CHECK (s))
1638     return resolve_symbol_value (s);
1639 #endif
1640
1641   if (!s->sy_resolved)
1642     {
1643       valueT val = resolve_symbol_value (s);
1644       if (!finalize_syms)
1645         return val;
1646     }
1647   if (s->sy_value.X_op != O_constant)
1648     {
1649       static symbolS *recur;
1650
1651       /* FIXME: In non BFD assemblers, S_IS_DEFINED and S_IS_COMMON
1652          may call S_GET_VALUE.  We use a static symbol to avoid the
1653          immediate recursion.  */
1654       if (recur == s)
1655         return (valueT) s->sy_value.X_add_number;
1656       recur = s;
1657       if (! s->sy_resolved
1658           || s->sy_value.X_op != O_symbol
1659           || (S_IS_DEFINED (s) && ! S_IS_COMMON (s)))
1660         as_bad (_("attempt to get value of unresolved symbol `%s'"),
1661                 S_GET_NAME (s));
1662       recur = NULL;
1663     }
1664   return (valueT) s->sy_value.X_add_number;
1665 }
1666
1667 /* Set the value of a symbol.  */
1668
1669 void
1670 S_SET_VALUE (symbolS *s, valueT val)
1671 {
1672 #ifdef BFD_ASSEMBLER
1673   if (LOCAL_SYMBOL_CHECK (s))
1674     {
1675       ((struct local_symbol *) s)->lsy_value = val;
1676       return;
1677     }
1678 #endif
1679
1680   s->sy_value.X_op = O_constant;
1681   s->sy_value.X_add_number = (offsetT) val;
1682   s->sy_value.X_unsigned = 0;
1683 }
1684
1685 void
1686 copy_symbol_attributes (symbolS *dest, symbolS *src)
1687 {
1688   if (LOCAL_SYMBOL_CHECK (dest))
1689     dest = local_symbol_convert ((struct local_symbol *) dest);
1690   if (LOCAL_SYMBOL_CHECK (src))
1691     src = local_symbol_convert ((struct local_symbol *) src);
1692
1693 #ifdef BFD_ASSEMBLER
1694   /* In an expression, transfer the settings of these flags.
1695      The user can override later, of course.  */
1696 #define COPIED_SYMFLAGS (BSF_FUNCTION | BSF_OBJECT)
1697   dest->bsym->flags |= src->bsym->flags & COPIED_SYMFLAGS;
1698 #endif
1699
1700 #ifdef OBJ_COPY_SYMBOL_ATTRIBUTES
1701   OBJ_COPY_SYMBOL_ATTRIBUTES (dest, src);
1702 #endif
1703 }
1704
1705 #ifdef BFD_ASSEMBLER
1706
1707 int
1708 S_IS_FUNCTION (symbolS *s)
1709 {
1710   flagword flags;
1711
1712   if (LOCAL_SYMBOL_CHECK (s))
1713     return 0;
1714
1715   flags = s->bsym->flags;
1716
1717   return (flags & BSF_FUNCTION) != 0;
1718 }
1719
1720 int
1721 S_IS_EXTERNAL (symbolS *s)
1722 {
1723   flagword flags;
1724
1725   if (LOCAL_SYMBOL_CHECK (s))
1726     return 0;
1727
1728   flags = s->bsym->flags;
1729
1730   /* Sanity check.  */
1731   if ((flags & BSF_LOCAL) && (flags & BSF_GLOBAL))
1732     abort ();
1733
1734   return (flags & BSF_GLOBAL) != 0;
1735 }
1736
1737 int
1738 S_IS_WEAK (symbolS *s)
1739 {
1740   if (LOCAL_SYMBOL_CHECK (s))
1741     return 0;
1742   return (s->bsym->flags & BSF_WEAK) != 0;
1743 }
1744
1745 int
1746 S_IS_COMMON (symbolS *s)
1747 {
1748   if (LOCAL_SYMBOL_CHECK (s))
1749     return 0;
1750   return bfd_is_com_section (s->bsym->section);
1751 }
1752
1753 int
1754 S_IS_DEFINED (symbolS *s)
1755 {
1756   if (LOCAL_SYMBOL_CHECK (s))
1757     return ((struct local_symbol *) s)->lsy_section != undefined_section;
1758   return s->bsym->section != undefined_section;
1759 }
1760
1761
1762 #ifndef EXTERN_FORCE_RELOC
1763 #define EXTERN_FORCE_RELOC IS_ELF
1764 #endif
1765
1766 /* Return true for symbols that should not be reduced to section
1767    symbols or eliminated from expressions, because they may be
1768    overridden by the linker.  */
1769 int
1770 S_FORCE_RELOC (symbolS *s, int strict)
1771 {
1772   if (LOCAL_SYMBOL_CHECK (s))
1773     return ((struct local_symbol *) s)->lsy_section == undefined_section;
1774
1775   return ((strict
1776            && ((s->bsym->flags & BSF_WEAK) != 0
1777                || (EXTERN_FORCE_RELOC
1778                    && (s->bsym->flags & BSF_GLOBAL) != 0)))
1779           || s->bsym->section == undefined_section
1780           || bfd_is_com_section (s->bsym->section));
1781 }
1782
1783 int
1784 S_IS_DEBUG (symbolS *s)
1785 {
1786   if (LOCAL_SYMBOL_CHECK (s))
1787     return 0;
1788   if (s->bsym->flags & BSF_DEBUGGING)
1789     return 1;
1790   return 0;
1791 }
1792
1793 int
1794 S_IS_LOCAL (symbolS *s)
1795 {
1796   flagword flags;
1797   const char *name;
1798
1799   if (LOCAL_SYMBOL_CHECK (s))
1800     return 1;
1801
1802   flags = s->bsym->flags;
1803
1804   /* Sanity check.  */
1805   if ((flags & BSF_LOCAL) && (flags & BSF_GLOBAL))
1806     abort ();
1807
1808   if (bfd_get_section (s->bsym) == reg_section)
1809     return 1;
1810
1811   if (flag_strip_local_absolute
1812       /* Keep BSF_FILE symbols in order to allow debuggers to identify
1813          the source file even when the object file is stripped.  */
1814       && (flags & (BSF_GLOBAL | BSF_FILE)) == 0
1815       && bfd_get_section (s->bsym) == absolute_section)
1816     return 1;
1817
1818   name = S_GET_NAME (s);
1819   return (name != NULL
1820           && ! S_IS_DEBUG (s)
1821           && (strchr (name, DOLLAR_LABEL_CHAR)
1822               || strchr (name, LOCAL_LABEL_CHAR)
1823               || (! flag_keep_locals
1824                   && (bfd_is_local_label (stdoutput, s->bsym)
1825                       || (flag_mri
1826                           && name[0] == '?'
1827                           && name[1] == '?')))));
1828 }
1829
1830 int
1831 S_IS_EXTERN (symbolS *s)
1832 {
1833   return S_IS_EXTERNAL (s);
1834 }
1835
1836 int
1837 S_IS_STABD (symbolS *s)
1838 {
1839   return S_GET_NAME (s) == 0;
1840 }
1841
1842 const char *
1843 S_GET_NAME (symbolS *s)
1844 {
1845   if (LOCAL_SYMBOL_CHECK (s))
1846     return ((struct local_symbol *) s)->lsy_name;
1847   return s->bsym->name;
1848 }
1849
1850 segT
1851 S_GET_SEGMENT (symbolS *s)
1852 {
1853   if (LOCAL_SYMBOL_CHECK (s))
1854     return ((struct local_symbol *) s)->lsy_section;
1855   return s->bsym->section;
1856 }
1857
1858 void
1859 S_SET_SEGMENT (symbolS *s, segT seg)
1860 {
1861   /* Don't reassign section symbols.  The direct reason is to prevent seg
1862      faults assigning back to const global symbols such as *ABS*, but it
1863      shouldn't happen anyway.  */
1864
1865   if (LOCAL_SYMBOL_CHECK (s))
1866     {
1867       if (seg == reg_section)
1868         s = local_symbol_convert ((struct local_symbol *) s);
1869       else
1870         {
1871           ((struct local_symbol *) s)->lsy_section = seg;
1872           return;
1873         }
1874     }
1875
1876   if (s->bsym->flags & BSF_SECTION_SYM)
1877     {
1878       if (s->bsym->section != seg)
1879         abort ();
1880     }
1881   else
1882     s->bsym->section = seg;
1883 }
1884
1885 void
1886 S_SET_EXTERNAL (symbolS *s)
1887 {
1888   if (LOCAL_SYMBOL_CHECK (s))
1889     s = local_symbol_convert ((struct local_symbol *) s);
1890   if ((s->bsym->flags & BSF_WEAK) != 0)
1891     {
1892       /* Let .weak override .global.  */
1893       return;
1894     }
1895   if (s->bsym->flags & BSF_SECTION_SYM)
1896     {
1897       char * file;
1898       unsigned int line;
1899
1900       /* Do not reassign section symbols.  */
1901       as_where (& file, & line);
1902       as_warn_where (file, line,
1903                      _("section symbols are already global"));
1904       return;
1905     }
1906   s->bsym->flags |= BSF_GLOBAL;
1907   s->bsym->flags &= ~(BSF_LOCAL | BSF_WEAK);
1908 }
1909
1910 void
1911 S_CLEAR_EXTERNAL (symbolS *s)
1912 {
1913   if (LOCAL_SYMBOL_CHECK (s))
1914     return;
1915   if ((s->bsym->flags & BSF_WEAK) != 0)
1916     {
1917       /* Let .weak override.  */
1918       return;
1919     }
1920   s->bsym->flags |= BSF_LOCAL;
1921   s->bsym->flags &= ~(BSF_GLOBAL | BSF_WEAK);
1922 }
1923
1924 void
1925 S_SET_WEAK (symbolS *s)
1926 {
1927   if (LOCAL_SYMBOL_CHECK (s))
1928     s = local_symbol_convert ((struct local_symbol *) s);
1929   s->bsym->flags |= BSF_WEAK;
1930   s->bsym->flags &= ~(BSF_GLOBAL | BSF_LOCAL);
1931 }
1932
1933 void
1934 S_SET_THREAD_LOCAL (symbolS *s)
1935 {
1936   if (LOCAL_SYMBOL_CHECK (s))
1937     s = local_symbol_convert ((struct local_symbol *) s);
1938   if (bfd_is_com_section (s->bsym->section)
1939       && (s->bsym->flags & BSF_THREAD_LOCAL) != 0)
1940     return;
1941   s->bsym->flags |= BSF_THREAD_LOCAL;
1942   if ((s->bsym->flags & BSF_FUNCTION) != 0)
1943     as_bad (_("Accessing function `%s' as thread-local object"),
1944             S_GET_NAME (s));
1945   else if (! bfd_is_und_section (s->bsym->section)
1946            && (s->bsym->section->flags & SEC_THREAD_LOCAL) == 0)
1947     as_bad (_("Accessing `%s' as thread-local object"),
1948             S_GET_NAME (s));
1949 }
1950
1951 void
1952 S_SET_NAME (symbolS *s, char *name)
1953 {
1954   if (LOCAL_SYMBOL_CHECK (s))
1955     {
1956       ((struct local_symbol *) s)->lsy_name = name;
1957       return;
1958     }
1959   s->bsym->name = name;
1960 }
1961 #endif /* BFD_ASSEMBLER */
1962
1963 #ifdef SYMBOLS_NEED_BACKPOINTERS
1964
1965 /* Return the previous symbol in a chain.  */
1966
1967 symbolS *
1968 symbol_previous (symbolS *s)
1969 {
1970   if (LOCAL_SYMBOL_CHECK (s))
1971     abort ();
1972   return s->sy_previous;
1973 }
1974
1975 #endif /* SYMBOLS_NEED_BACKPOINTERS */
1976
1977 /* Return the next symbol in a chain.  */
1978
1979 symbolS *
1980 symbol_next (symbolS *s)
1981 {
1982   if (LOCAL_SYMBOL_CHECK (s))
1983     abort ();
1984   return s->sy_next;
1985 }
1986
1987 /* Return a pointer to the value of a symbol as an expression.  */
1988
1989 expressionS *
1990 symbol_get_value_expression (symbolS *s)
1991 {
1992   if (LOCAL_SYMBOL_CHECK (s))
1993     s = local_symbol_convert ((struct local_symbol *) s);
1994   return &s->sy_value;
1995 }
1996
1997 /* Set the value of a symbol to an expression.  */
1998
1999 void
2000 symbol_set_value_expression (symbolS *s, const expressionS *exp)
2001 {
2002   if (LOCAL_SYMBOL_CHECK (s))
2003     s = local_symbol_convert ((struct local_symbol *) s);
2004   s->sy_value = *exp;
2005 }
2006
2007 /* Set the value of SYM to the current position in the current segment.  */
2008
2009 void
2010 symbol_set_value_now (symbolS *sym)
2011 {
2012   S_SET_SEGMENT (sym, now_seg);
2013   S_SET_VALUE (sym, frag_now_fix ());
2014   symbol_set_frag (sym, frag_now);
2015 }
2016
2017 /* Set the frag of a symbol.  */
2018
2019 void
2020 symbol_set_frag (symbolS *s, fragS *f)
2021 {
2022 #ifdef BFD_ASSEMBLER
2023   if (LOCAL_SYMBOL_CHECK (s))
2024     {
2025       local_symbol_set_frag ((struct local_symbol *) s, f);
2026       return;
2027     }
2028 #endif
2029   s->sy_frag = f;
2030 }
2031
2032 /* Return the frag of a symbol.  */
2033
2034 fragS *
2035 symbol_get_frag (symbolS *s)
2036 {
2037 #ifdef BFD_ASSEMBLER
2038   if (LOCAL_SYMBOL_CHECK (s))
2039     return local_symbol_get_frag ((struct local_symbol *) s);
2040 #endif
2041   return s->sy_frag;
2042 }
2043
2044 /* Mark a symbol as having been used.  */
2045
2046 void
2047 symbol_mark_used (symbolS *s)
2048 {
2049   if (LOCAL_SYMBOL_CHECK (s))
2050     return;
2051   s->sy_used = 1;
2052 }
2053
2054 /* Clear the mark of whether a symbol has been used.  */
2055
2056 void
2057 symbol_clear_used (symbolS *s)
2058 {
2059   if (LOCAL_SYMBOL_CHECK (s))
2060     s = local_symbol_convert ((struct local_symbol *) s);
2061   s->sy_used = 0;
2062 }
2063
2064 /* Return whether a symbol has been used.  */
2065
2066 int
2067 symbol_used_p (symbolS *s)
2068 {
2069   if (LOCAL_SYMBOL_CHECK (s))
2070     return 1;
2071   return s->sy_used;
2072 }
2073
2074 /* Mark a symbol as having been used in a reloc.  */
2075
2076 void
2077 symbol_mark_used_in_reloc (symbolS *s)
2078 {
2079   if (LOCAL_SYMBOL_CHECK (s))
2080     s = local_symbol_convert ((struct local_symbol *) s);
2081   s->sy_used_in_reloc = 1;
2082 }
2083
2084 /* Clear the mark of whether a symbol has been used in a reloc.  */
2085
2086 void
2087 symbol_clear_used_in_reloc (symbolS *s)
2088 {
2089   if (LOCAL_SYMBOL_CHECK (s))
2090     return;
2091   s->sy_used_in_reloc = 0;
2092 }
2093
2094 /* Return whether a symbol has been used in a reloc.  */
2095
2096 int
2097 symbol_used_in_reloc_p (symbolS *s)
2098 {
2099   if (LOCAL_SYMBOL_CHECK (s))
2100     return 0;
2101   return s->sy_used_in_reloc;
2102 }
2103
2104 /* Mark a symbol as an MRI common symbol.  */
2105
2106 void
2107 symbol_mark_mri_common (symbolS *s)
2108 {
2109   if (LOCAL_SYMBOL_CHECK (s))
2110     s = local_symbol_convert ((struct local_symbol *) s);
2111   s->sy_mri_common = 1;
2112 }
2113
2114 /* Clear the mark of whether a symbol is an MRI common symbol.  */
2115
2116 void
2117 symbol_clear_mri_common (symbolS *s)
2118 {
2119   if (LOCAL_SYMBOL_CHECK (s))
2120     return;
2121   s->sy_mri_common = 0;
2122 }
2123
2124 /* Return whether a symbol is an MRI common symbol.  */
2125
2126 int
2127 symbol_mri_common_p (symbolS *s)
2128 {
2129   if (LOCAL_SYMBOL_CHECK (s))
2130     return 0;
2131   return s->sy_mri_common;
2132 }
2133
2134 /* Mark a symbol as having been written.  */
2135
2136 void
2137 symbol_mark_written (symbolS *s)
2138 {
2139   if (LOCAL_SYMBOL_CHECK (s))
2140     return;
2141   s->written = 1;
2142 }
2143
2144 /* Clear the mark of whether a symbol has been written.  */
2145
2146 void
2147 symbol_clear_written (symbolS *s)
2148 {
2149   if (LOCAL_SYMBOL_CHECK (s))
2150     return;
2151   s->written = 0;
2152 }
2153
2154 /* Return whether a symbol has been written.  */
2155
2156 int
2157 symbol_written_p (symbolS *s)
2158 {
2159   if (LOCAL_SYMBOL_CHECK (s))
2160     return 0;
2161   return s->written;
2162 }
2163
2164 /* Mark a symbol has having been resolved.  */
2165
2166 void
2167 symbol_mark_resolved (symbolS *s)
2168 {
2169 #ifdef BFD_ASSEMBLER
2170   if (LOCAL_SYMBOL_CHECK (s))
2171     {
2172       local_symbol_mark_resolved ((struct local_symbol *) s);
2173       return;
2174     }
2175 #endif
2176   s->sy_resolved = 1;
2177 }
2178
2179 /* Return whether a symbol has been resolved.  */
2180
2181 int
2182 symbol_resolved_p (symbolS *s)
2183 {
2184 #ifdef BFD_ASSEMBLER
2185   if (LOCAL_SYMBOL_CHECK (s))
2186     return local_symbol_resolved_p ((struct local_symbol *) s);
2187 #endif
2188   return s->sy_resolved;
2189 }
2190
2191 /* Return whether a symbol is a section symbol.  */
2192
2193 int
2194 symbol_section_p (symbolS *s ATTRIBUTE_UNUSED)
2195 {
2196   if (LOCAL_SYMBOL_CHECK (s))
2197     return 0;
2198 #ifdef BFD_ASSEMBLER
2199   return (s->bsym->flags & BSF_SECTION_SYM) != 0;
2200 #else
2201   /* FIXME.  */
2202   return 0;
2203 #endif
2204 }
2205
2206 /* Return whether a symbol is equated to another symbol.  */
2207
2208 int
2209 symbol_equated_p (symbolS *s)
2210 {
2211   if (LOCAL_SYMBOL_CHECK (s))
2212     return 0;
2213   return s->sy_value.X_op == O_symbol;
2214 }
2215
2216 /* Return whether a symbol is equated to another symbol, and should be
2217    treated specially when writing out relocs.  */
2218
2219 int
2220 symbol_equated_reloc_p (symbolS *s)
2221 {
2222   if (LOCAL_SYMBOL_CHECK (s))
2223     return 0;
2224   /* X_op_symbol, normally not used for O_symbol, is set by
2225      resolve_symbol_value to flag expression syms that have been
2226      equated.  */
2227   return (s->sy_value.X_op == O_symbol
2228           && ((s->sy_resolved && s->sy_value.X_op_symbol != NULL)
2229               || ! S_IS_DEFINED (s)
2230               || S_IS_COMMON (s)));
2231 }
2232
2233 /* Return whether a symbol has a constant value.  */
2234
2235 int
2236 symbol_constant_p (symbolS *s)
2237 {
2238   if (LOCAL_SYMBOL_CHECK (s))
2239     return 1;
2240   return s->sy_value.X_op == O_constant;
2241 }
2242
2243 #ifdef BFD_ASSEMBLER
2244
2245 /* Return the BFD symbol for a symbol.  */
2246
2247 asymbol *
2248 symbol_get_bfdsym (symbolS *s)
2249 {
2250   if (LOCAL_SYMBOL_CHECK (s))
2251     s = local_symbol_convert ((struct local_symbol *) s);
2252   return s->bsym;
2253 }
2254
2255 /* Set the BFD symbol for a symbol.  */
2256
2257 void
2258 symbol_set_bfdsym (symbolS *s, asymbol *bsym)
2259 {
2260   if (LOCAL_SYMBOL_CHECK (s))
2261     s = local_symbol_convert ((struct local_symbol *) s);
2262   /* Usually, it is harmless to reset a symbol to a BFD section
2263      symbol. For example, obj_elf_change_section sets the BFD symbol
2264      of an old symbol with the newly created section symbol. But when
2265      we have multiple sections with the same name, the newly created
2266      section may have the same name as an old section. We check if the
2267      old symbol has been already marked as a section symbol before
2268      resetting it.  */
2269   if ((s->bsym->flags & BSF_SECTION_SYM) == 0)
2270     s->bsym = bsym;
2271   /* else XXX - What do we do now ?  */
2272 }
2273
2274 #endif /* BFD_ASSEMBLER */
2275
2276 #ifdef OBJ_SYMFIELD_TYPE
2277
2278 /* Get a pointer to the object format information for a symbol.  */
2279
2280 OBJ_SYMFIELD_TYPE *
2281 symbol_get_obj (symbolS *s)
2282 {
2283   if (LOCAL_SYMBOL_CHECK (s))
2284     s = local_symbol_convert ((struct local_symbol *) s);
2285   return &s->sy_obj;
2286 }
2287
2288 /* Set the object format information for a symbol.  */
2289
2290 void
2291 symbol_set_obj (symbolS *s, OBJ_SYMFIELD_TYPE *o)
2292 {
2293   if (LOCAL_SYMBOL_CHECK (s))
2294     s = local_symbol_convert ((struct local_symbol *) s);
2295   s->sy_obj = *o;
2296 }
2297
2298 #endif /* OBJ_SYMFIELD_TYPE */
2299
2300 #ifdef TC_SYMFIELD_TYPE
2301
2302 /* Get a pointer to the processor information for a symbol.  */
2303
2304 TC_SYMFIELD_TYPE *
2305 symbol_get_tc (symbolS *s)
2306 {
2307   if (LOCAL_SYMBOL_CHECK (s))
2308     s = local_symbol_convert ((struct local_symbol *) s);
2309   return &s->sy_tc;
2310 }
2311
2312 /* Set the processor information for a symbol.  */
2313
2314 void
2315 symbol_set_tc (symbolS *s, TC_SYMFIELD_TYPE *o)
2316 {
2317   if (LOCAL_SYMBOL_CHECK (s))
2318     s = local_symbol_convert ((struct local_symbol *) s);
2319   s->sy_tc = *o;
2320 }
2321
2322 #endif /* TC_SYMFIELD_TYPE */
2323
2324 void
2325 symbol_begin (void)
2326 {
2327   symbol_lastP = NULL;
2328   symbol_rootP = NULL;          /* In case we have 0 symbols (!!)  */
2329   sy_hash = hash_new ();
2330 #ifdef BFD_ASSEMBLER
2331   local_hash = hash_new ();
2332 #endif
2333
2334   memset ((char *) (&abs_symbol), '\0', sizeof (abs_symbol));
2335 #ifdef BFD_ASSEMBLER
2336 #if defined (EMIT_SECTION_SYMBOLS) || !defined (RELOC_REQUIRES_SYMBOL)
2337   abs_symbol.bsym = bfd_abs_section.symbol;
2338 #endif
2339 #else
2340   /* Can't initialise a union. Sigh.  */
2341   S_SET_SEGMENT (&abs_symbol, absolute_section);
2342 #endif
2343   abs_symbol.sy_value.X_op = O_constant;
2344   abs_symbol.sy_frag = &zero_address_frag;
2345
2346   if (LOCAL_LABELS_FB)
2347     fb_label_init ();
2348 }
2349 \f
2350 int indent_level;
2351
2352 /* Maximum indent level.
2353    Available for modification inside a gdb session.  */
2354 int max_indent_level = 8;
2355
2356 #if 0
2357
2358 static void
2359 indent (void)
2360 {
2361   printf ("%*s", indent_level * 4, "");
2362 }
2363
2364 #endif
2365
2366 void
2367 print_symbol_value_1 (FILE *file, symbolS *sym)
2368 {
2369   const char *name = S_GET_NAME (sym);
2370   if (!name || !name[0])
2371     name = "(unnamed)";
2372   fprintf (file, "sym %lx %s", (unsigned long) sym, name);
2373
2374   if (LOCAL_SYMBOL_CHECK (sym))
2375     {
2376 #ifdef BFD_ASSEMBLER
2377       struct local_symbol *locsym = (struct local_symbol *) sym;
2378       if (local_symbol_get_frag (locsym) != &zero_address_frag
2379           && local_symbol_get_frag (locsym) != NULL)
2380         fprintf (file, " frag %lx", (long) local_symbol_get_frag (locsym));
2381       if (local_symbol_resolved_p (locsym))
2382         fprintf (file, " resolved");
2383       fprintf (file, " local");
2384 #endif
2385     }
2386   else
2387     {
2388       if (sym->sy_frag != &zero_address_frag)
2389         fprintf (file, " frag %lx", (long) sym->sy_frag);
2390       if (sym->written)
2391         fprintf (file, " written");
2392       if (sym->sy_resolved)
2393         fprintf (file, " resolved");
2394       else if (sym->sy_resolving)
2395         fprintf (file, " resolving");
2396       if (sym->sy_used_in_reloc)
2397         fprintf (file, " used-in-reloc");
2398       if (sym->sy_used)
2399         fprintf (file, " used");
2400       if (S_IS_LOCAL (sym))
2401         fprintf (file, " local");
2402       if (S_IS_EXTERN (sym))
2403         fprintf (file, " extern");
2404       if (S_IS_DEBUG (sym))
2405         fprintf (file, " debug");
2406       if (S_IS_DEFINED (sym))
2407         fprintf (file, " defined");
2408     }
2409   fprintf (file, " %s", segment_name (S_GET_SEGMENT (sym)));
2410   if (symbol_resolved_p (sym))
2411     {
2412       segT s = S_GET_SEGMENT (sym);
2413
2414       if (s != undefined_section
2415           && s != expr_section)
2416         fprintf (file, " %lx", (long) S_GET_VALUE (sym));
2417     }
2418   else if (indent_level < max_indent_level
2419            && S_GET_SEGMENT (sym) != undefined_section)
2420     {
2421       indent_level++;
2422       fprintf (file, "\n%*s<", indent_level * 4, "");
2423 #ifdef BFD_ASSEMBLER
2424       if (LOCAL_SYMBOL_CHECK (sym))
2425         fprintf (file, "constant %lx",
2426                  (long) ((struct local_symbol *) sym)->lsy_value);
2427       else
2428 #endif
2429         print_expr_1 (file, &sym->sy_value);
2430       fprintf (file, ">");
2431       indent_level--;
2432     }
2433   fflush (file);
2434 }
2435
2436 void
2437 print_symbol_value (symbolS *sym)
2438 {
2439   indent_level = 0;
2440   print_symbol_value_1 (stderr, sym);
2441   fprintf (stderr, "\n");
2442 }
2443
2444 static void
2445 print_binary (FILE *file, const char *name, expressionS *exp)
2446 {
2447   indent_level++;
2448   fprintf (file, "%s\n%*s<", name, indent_level * 4, "");
2449   print_symbol_value_1 (file, exp->X_add_symbol);
2450   fprintf (file, ">\n%*s<", indent_level * 4, "");
2451   print_symbol_value_1 (file, exp->X_op_symbol);
2452   fprintf (file, ">");
2453   indent_level--;
2454 }
2455
2456 void
2457 print_expr_1 (FILE *file, expressionS *exp)
2458 {
2459   fprintf (file, "expr %lx ", (long) exp);
2460   switch (exp->X_op)
2461     {
2462     case O_illegal:
2463       fprintf (file, "illegal");
2464       break;
2465     case O_absent:
2466       fprintf (file, "absent");
2467       break;
2468     case O_constant:
2469       fprintf (file, "constant %lx", (long) exp->X_add_number);
2470       break;
2471     case O_symbol:
2472       indent_level++;
2473       fprintf (file, "symbol\n%*s<", indent_level * 4, "");
2474       print_symbol_value_1 (file, exp->X_add_symbol);
2475       fprintf (file, ">");
2476     maybe_print_addnum:
2477       if (exp->X_add_number)
2478         fprintf (file, "\n%*s%lx", indent_level * 4, "",
2479                  (long) exp->X_add_number);
2480       indent_level--;
2481       break;
2482     case O_register:
2483       fprintf (file, "register #%d", (int) exp->X_add_number);
2484       break;
2485     case O_big:
2486       fprintf (file, "big");
2487       break;
2488     case O_uminus:
2489       fprintf (file, "uminus -<");
2490       indent_level++;
2491       print_symbol_value_1 (file, exp->X_add_symbol);
2492       fprintf (file, ">");
2493       goto maybe_print_addnum;
2494     case O_bit_not:
2495       fprintf (file, "bit_not");
2496       break;
2497     case O_multiply:
2498       print_binary (file, "multiply", exp);
2499       break;
2500     case O_divide:
2501       print_binary (file, "divide", exp);
2502       break;
2503     case O_modulus:
2504       print_binary (file, "modulus", exp);
2505       break;
2506     case O_left_shift:
2507       print_binary (file, "lshift", exp);
2508       break;
2509     case O_right_shift:
2510       print_binary (file, "rshift", exp);
2511       break;
2512     case O_bit_inclusive_or:
2513       print_binary (file, "bit_ior", exp);
2514       break;
2515     case O_bit_exclusive_or:
2516       print_binary (file, "bit_xor", exp);
2517       break;
2518     case O_bit_and:
2519       print_binary (file, "bit_and", exp);
2520       break;
2521     case O_eq:
2522       print_binary (file, "eq", exp);
2523       break;
2524     case O_ne:
2525       print_binary (file, "ne", exp);
2526       break;
2527     case O_lt:
2528       print_binary (file, "lt", exp);
2529       break;
2530     case O_le:
2531       print_binary (file, "le", exp);
2532       break;
2533     case O_ge:
2534       print_binary (file, "ge", exp);
2535       break;
2536     case O_gt:
2537       print_binary (file, "gt", exp);
2538       break;
2539     case O_logical_and:
2540       print_binary (file, "logical_and", exp);
2541       break;
2542     case O_logical_or:
2543       print_binary (file, "logical_or", exp);
2544       break;
2545     case O_add:
2546       indent_level++;
2547       fprintf (file, "add\n%*s<", indent_level * 4, "");
2548       print_symbol_value_1 (file, exp->X_add_symbol);
2549       fprintf (file, ">\n%*s<", indent_level * 4, "");
2550       print_symbol_value_1 (file, exp->X_op_symbol);
2551       fprintf (file, ">");
2552       goto maybe_print_addnum;
2553     case O_subtract:
2554       indent_level++;
2555       fprintf (file, "subtract\n%*s<", indent_level * 4, "");
2556       print_symbol_value_1 (file, exp->X_add_symbol);
2557       fprintf (file, ">\n%*s<", indent_level * 4, "");
2558       print_symbol_value_1 (file, exp->X_op_symbol);
2559       fprintf (file, ">");
2560       goto maybe_print_addnum;
2561     default:
2562       fprintf (file, "{unknown opcode %d}", (int) exp->X_op);
2563       break;
2564     }
2565   fflush (stdout);
2566 }
2567
2568 void
2569 print_expr (expressionS *exp)
2570 {
2571   print_expr_1 (stderr, exp);
2572   fprintf (stderr, "\n");
2573 }
2574
2575 void
2576 symbol_print_statistics (FILE *file)
2577 {
2578   hash_print_statistics (file, "symbol table", sy_hash);
2579 #ifdef BFD_ASSEMBLER
2580   hash_print_statistics (file, "mini local symbol table", local_hash);
2581   fprintf (file, "%lu mini local symbols created, %lu converted\n",
2582            local_symbol_count, local_symbol_conversion_count);
2583 #endif
2584 }