OSDN Git Service

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