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