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