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