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