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