OSDN Git Service

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