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