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