* emulparams/hppa64linux.sh: Define PLT_BEFORE_GOT.
[binutils.git] / gas / symbols.c
blob8caaf4a441eaf5de12d914b3a20a7d9e09df1b6a
1 /* symbols.c -symbol table-
2 Copyright 1987, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
3 1999, 2000, 2001, 2002, 2003, 2004
4 Free Software Foundation, Inc.
6 This file is part of GAS, the GNU Assembler.
8 GAS is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2, or (at your option)
11 any later version.
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.
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, 59 Temple Place - Suite 330, Boston, MA
21 02111-1307, USA. */
23 /* #define DEBUG_SYMS / * to debug symbol list maintenance. */
25 #include "as.h"
27 #include "safe-ctype.h"
28 #include "obstack.h" /* For "symbols.h" */
29 #include "subsegs.h"
31 #include "struc-symbol.h"
33 /* This is non-zero if symbols are case sensitive, which is the
34 default. */
35 int symbols_case_sensitive = 1;
37 #ifndef WORKING_DOT_WORD
38 extern int new_broken_words;
39 #endif
41 /* symbol-name => struct symbol pointer */
42 static struct hash_control *sy_hash;
44 /* Table of local symbols. */
45 static struct hash_control *local_hash;
47 /* Below are commented in "symbols.h". */
48 symbolS *symbol_rootP;
49 symbolS *symbol_lastP;
50 symbolS abs_symbol;
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
58 #define DOLLAR_LABEL_CHAR '\001'
59 #define LOCAL_LABEL_CHAR '\002'
61 struct obstack notes;
63 static char *save_symbol_name (const char *);
64 static void fb_label_init (void);
65 static long dollar_label_instance (long);
66 static long fb_label_instance (long);
68 static void print_binary (FILE *, const char *, expressionS *);
69 static void report_op_error (symbolS *, symbolS *, symbolS *);
71 /* Return a pointer to a new symbol. Die if we can't make a new
72 symbol. Fill in the symbol's values. Add symbol to end of symbol
73 chain.
75 This function should be called in the general case of creating a
76 symbol. However, if the output file symbol table has already been
77 set, and you are certain that this symbol won't be wanted in the
78 output file, you can call symbol_create. */
80 symbolS *
81 symbol_new (const char *name, segT segment, valueT valu, fragS *frag)
83 symbolS *symbolP = symbol_create (name, segment, valu, frag);
85 /* Link to end of symbol chain. */
86 #ifdef BFD_ASSEMBLER
88 extern int symbol_table_frozen;
89 if (symbol_table_frozen)
90 abort ();
92 #endif
93 symbol_append (symbolP, symbol_lastP, &symbol_rootP, &symbol_lastP);
95 return symbolP;
98 /* Save a symbol name on a permanent obstack, and convert it according
99 to the object file format. */
101 static char *
102 save_symbol_name (const char *name)
104 unsigned int name_length;
105 char *ret;
107 name_length = strlen (name) + 1; /* +1 for \0. */
108 obstack_grow (&notes, name, name_length);
109 ret = obstack_finish (&notes);
111 #ifdef STRIP_UNDERSCORE
112 if (ret[0] == '_')
113 ++ret;
114 #endif
116 #ifdef tc_canonicalize_symbol_name
117 ret = tc_canonicalize_symbol_name (ret);
118 #endif
120 if (! symbols_case_sensitive)
122 char *s;
124 for (s = ret; *s != '\0'; s++)
125 *s = TOUPPER (*s);
128 return ret;
131 symbolS *
132 symbol_create (const char *name, /* It is copied, the caller can destroy/modify. */
133 segT segment, /* Segment identifier (SEG_<something>). */
134 valueT valu, /* Symbol value. */
135 fragS *frag /* Associated fragment. */)
137 char *preserved_copy_of_name;
138 symbolS *symbolP;
140 preserved_copy_of_name = save_symbol_name (name);
142 symbolP = (symbolS *) obstack_alloc (&notes, sizeof (symbolS));
144 /* symbol must be born in some fixed state. This seems as good as any. */
145 memset (symbolP, 0, sizeof (symbolS));
147 #ifdef BFD_ASSEMBLER
148 symbolP->bsym = bfd_make_empty_symbol (stdoutput);
149 if (symbolP->bsym == NULL)
150 as_perror ("%s", "bfd_make_empty_symbol");
151 symbolP->bsym->udata.p = (PTR) symbolP;
152 #endif
153 S_SET_NAME (symbolP, preserved_copy_of_name);
155 S_SET_SEGMENT (symbolP, segment);
156 S_SET_VALUE (symbolP, valu);
157 symbol_clear_list_pointers (symbolP);
159 symbolP->sy_frag = frag;
160 #ifndef BFD_ASSEMBLER
161 symbolP->sy_number = ~0;
162 symbolP->sy_name_offset = (unsigned int) ~0;
163 #endif
165 obj_symbol_new_hook (symbolP);
167 #ifdef tc_symbol_new_hook
168 tc_symbol_new_hook (symbolP);
169 #endif
171 return symbolP;
174 #ifdef BFD_ASSEMBLER
176 /* Local symbol support. If we can get away with it, we keep only a
177 small amount of information for local symbols. */
179 static symbolS *local_symbol_convert (struct local_symbol *);
181 /* Used for statistics. */
183 static unsigned long local_symbol_count;
184 static unsigned long local_symbol_conversion_count;
186 /* This macro is called with a symbol argument passed by reference.
187 It returns whether this is a local symbol. If necessary, it
188 changes its argument to the real symbol. */
190 #define LOCAL_SYMBOL_CHECK(s) \
191 (s->bsym == NULL \
192 ? (local_symbol_converted_p ((struct local_symbol *) s) \
193 ? (s = local_symbol_get_real_symbol ((struct local_symbol *) s), \
194 0) \
195 : 1) \
196 : 0)
198 /* Create a local symbol and insert it into the local hash table. */
200 struct local_symbol *
201 local_symbol_make (const char *name, segT section, valueT value, fragS *frag)
203 char *name_copy;
204 struct local_symbol *ret;
206 ++local_symbol_count;
208 name_copy = save_symbol_name (name);
210 ret = (struct local_symbol *) obstack_alloc (&notes, sizeof *ret);
211 ret->lsy_marker = NULL;
212 ret->lsy_name = name_copy;
213 ret->lsy_section = section;
214 local_symbol_set_frag (ret, frag);
215 ret->lsy_value = value;
217 hash_jam (local_hash, name_copy, (PTR) ret);
219 return ret;
222 /* Convert a local symbol into a real symbol. Note that we do not
223 reclaim the space used by the local symbol. */
225 static symbolS *
226 local_symbol_convert (struct local_symbol *locsym)
228 symbolS *ret;
230 assert (locsym->lsy_marker == NULL);
231 if (local_symbol_converted_p (locsym))
232 return local_symbol_get_real_symbol (locsym);
234 ++local_symbol_conversion_count;
236 ret = symbol_new (locsym->lsy_name, locsym->lsy_section, locsym->lsy_value,
237 local_symbol_get_frag (locsym));
239 if (local_symbol_resolved_p (locsym))
240 ret->sy_resolved = 1;
242 /* Local symbols are always either defined or used. */
243 ret->sy_used = 1;
245 #ifdef TC_LOCAL_SYMFIELD_CONVERT
246 TC_LOCAL_SYMFIELD_CONVERT (locsym, ret);
247 #endif
249 symbol_table_insert (ret);
251 local_symbol_mark_converted (locsym);
252 local_symbol_set_real_symbol (locsym, ret);
254 hash_jam (local_hash, locsym->lsy_name, NULL);
256 return ret;
259 #else /* ! BFD_ASSEMBLER */
261 #define LOCAL_SYMBOL_CHECK(s) 0
262 #define local_symbol_convert(s) ((symbolS *) s)
264 #endif /* ! BFD_ASSEMBLER */
266 /* We have just seen "<name>:".
267 Creates a struct symbol unless it already exists.
269 Gripes if we are redefining a symbol incompatibly (and ignores it). */
271 symbolS *
272 colon (/* Just seen "x:" - rattle symbols & frags. */
273 const char *sym_name /* Symbol name, as a cannonical string. */
274 /* We copy this string: OK to alter later. */)
276 register symbolS *symbolP; /* Symbol we are working with. */
278 /* Sun local labels go out of scope whenever a non-local symbol is
279 defined. */
280 if (LOCAL_LABELS_DOLLAR)
282 int local;
284 #ifdef BFD_ASSEMBLER
285 local = bfd_is_local_label_name (stdoutput, sym_name);
286 #else
287 local = LOCAL_LABEL (sym_name);
288 #endif
290 if (! local)
291 dollar_label_clear ();
294 #ifndef WORKING_DOT_WORD
295 if (new_broken_words)
297 struct broken_word *a;
298 int possible_bytes;
299 fragS *frag_tmp;
300 char *frag_opcode;
302 extern const int md_short_jump_size;
303 extern const int md_long_jump_size;
305 if (now_seg == absolute_section)
307 as_bad (_("cannot define symbol `%s' in absolute section"), sym_name);
308 return NULL;
311 possible_bytes = (md_short_jump_size
312 + new_broken_words * md_long_jump_size);
314 frag_tmp = frag_now;
315 frag_opcode = frag_var (rs_broken_word,
316 possible_bytes,
317 possible_bytes,
318 (relax_substateT) 0,
319 (symbolS *) broken_words,
320 (offsetT) 0,
321 NULL);
323 /* We want to store the pointer to where to insert the jump
324 table in the fr_opcode of the rs_broken_word frag. This
325 requires a little hackery. */
326 while (frag_tmp
327 && (frag_tmp->fr_type != rs_broken_word
328 || frag_tmp->fr_opcode))
329 frag_tmp = frag_tmp->fr_next;
330 know (frag_tmp);
331 frag_tmp->fr_opcode = frag_opcode;
332 new_broken_words = 0;
334 for (a = broken_words; a && a->dispfrag == 0; a = a->next_broken_word)
335 a->dispfrag = frag_tmp;
337 #endif /* WORKING_DOT_WORD */
339 if ((symbolP = symbol_find (sym_name)) != 0)
341 #ifdef RESOLVE_SYMBOL_REDEFINITION
342 if (RESOLVE_SYMBOL_REDEFINITION (symbolP))
343 return symbolP;
344 #endif
345 /* Now check for undefined symbols. */
346 if (LOCAL_SYMBOL_CHECK (symbolP))
348 #ifdef BFD_ASSEMBLER
349 struct local_symbol *locsym = (struct local_symbol *) symbolP;
351 if (locsym->lsy_section != undefined_section
352 && (local_symbol_get_frag (locsym) != frag_now
353 || locsym->lsy_section != now_seg
354 || locsym->lsy_value != frag_now_fix ()))
356 as_bad (_("symbol `%s' is already defined"), sym_name);
357 return symbolP;
360 locsym->lsy_section = now_seg;
361 local_symbol_set_frag (locsym, frag_now);
362 locsym->lsy_value = frag_now_fix ();
363 #endif
365 else if (!S_IS_DEFINED (symbolP) || S_IS_COMMON (symbolP))
367 if (S_GET_VALUE (symbolP) == 0)
369 symbolP->sy_frag = frag_now;
370 #ifdef OBJ_VMS
371 S_SET_OTHER (symbolP, const_flag);
372 #endif
373 S_SET_VALUE (symbolP, (valueT) frag_now_fix ());
374 S_SET_SEGMENT (symbolP, now_seg);
375 #ifdef N_UNDF
376 know (N_UNDF == 0);
377 #endif /* if we have one, it better be zero. */
380 else
382 /* There are still several cases to check:
384 A .comm/.lcomm symbol being redefined as initialized
385 data is OK
387 A .comm/.lcomm symbol being redefined with a larger
388 size is also OK
390 This only used to be allowed on VMS gas, but Sun cc
391 on the sparc also depends on it. */
393 if (((!S_IS_DEBUG (symbolP)
394 && (!S_IS_DEFINED (symbolP) || S_IS_COMMON (symbolP))
395 && S_IS_EXTERNAL (symbolP))
396 || S_GET_SEGMENT (symbolP) == bss_section)
397 && (now_seg == data_section
398 || now_seg == S_GET_SEGMENT (symbolP)))
400 /* Select which of the 2 cases this is. */
401 if (now_seg != data_section)
403 /* New .comm for prev .comm symbol.
405 If the new size is larger we just change its
406 value. If the new size is smaller, we ignore
407 this symbol. */
408 if (S_GET_VALUE (symbolP)
409 < ((unsigned) frag_now_fix ()))
411 S_SET_VALUE (symbolP, (valueT) frag_now_fix ());
414 else
416 /* It is a .comm/.lcomm being converted to initialized
417 data. */
418 symbolP->sy_frag = frag_now;
419 #ifdef OBJ_VMS
420 S_SET_OTHER (symbolP, const_flag);
421 #endif
422 S_SET_VALUE (symbolP, (valueT) frag_now_fix ());
423 S_SET_SEGMENT (symbolP, now_seg); /* Keep N_EXT bit. */
426 else
428 #if (!defined (OBJ_AOUT) && !defined (OBJ_MAYBE_AOUT) \
429 && !defined (OBJ_BOUT) && !defined (OBJ_MAYBE_BOUT))
430 static const char *od_buf = "";
431 #else
432 char od_buf[100];
433 od_buf[0] = '\0';
434 #ifdef BFD_ASSEMBLER
435 if (OUTPUT_FLAVOR == bfd_target_aout_flavour)
436 #endif
437 sprintf (od_buf, "%d.%d.",
438 S_GET_OTHER (symbolP),
439 S_GET_DESC (symbolP));
440 #endif
441 as_bad (_("symbol `%s' is already defined as \"%s\"/%s%ld"),
442 sym_name,
443 segment_name (S_GET_SEGMENT (symbolP)),
444 od_buf,
445 (long) S_GET_VALUE (symbolP));
447 } /* if the undefined symbol has no value */
449 else
451 /* Don't blow up if the definition is the same. */
452 if (!(frag_now == symbolP->sy_frag
453 && S_GET_VALUE (symbolP) == frag_now_fix ()
454 && S_GET_SEGMENT (symbolP) == now_seg))
455 as_bad (_("symbol `%s' is already defined"), sym_name);
459 #ifdef BFD_ASSEMBLER
460 else if (! flag_keep_locals && bfd_is_local_label_name (stdoutput, sym_name))
462 symbolP = (symbolS *) local_symbol_make (sym_name, now_seg,
463 (valueT) frag_now_fix (),
464 frag_now);
466 #endif /* BFD_ASSEMBLER */
467 else
469 symbolP = symbol_new (sym_name, now_seg, (valueT) frag_now_fix (),
470 frag_now);
471 #ifdef OBJ_VMS
472 S_SET_OTHER (symbolP, const_flag);
473 #endif /* OBJ_VMS */
475 symbol_table_insert (symbolP);
478 if (mri_common_symbol != NULL)
480 /* This symbol is actually being defined within an MRI common
481 section. This requires special handling. */
482 if (LOCAL_SYMBOL_CHECK (symbolP))
483 symbolP = local_symbol_convert ((struct local_symbol *) symbolP);
484 symbolP->sy_value.X_op = O_symbol;
485 symbolP->sy_value.X_add_symbol = mri_common_symbol;
486 symbolP->sy_value.X_add_number = S_GET_VALUE (mri_common_symbol);
487 symbolP->sy_frag = &zero_address_frag;
488 S_SET_SEGMENT (symbolP, expr_section);
489 symbolP->sy_mri_common = 1;
492 #ifdef tc_frob_label
493 tc_frob_label (symbolP);
494 #endif
495 #ifdef obj_frob_label
496 obj_frob_label (symbolP);
497 #endif
499 return symbolP;
502 /* Die if we can't insert the symbol. */
504 void
505 symbol_table_insert (symbolS *symbolP)
507 register const char *error_string;
509 know (symbolP);
510 know (S_GET_NAME (symbolP));
512 if (LOCAL_SYMBOL_CHECK (symbolP))
514 error_string = hash_jam (local_hash, S_GET_NAME (symbolP),
515 (PTR) symbolP);
516 if (error_string != NULL)
517 as_fatal (_("inserting \"%s\" into symbol table failed: %s"),
518 S_GET_NAME (symbolP), error_string);
519 return;
522 if ((error_string = hash_jam (sy_hash, S_GET_NAME (symbolP), (PTR) symbolP)))
524 as_fatal (_("inserting \"%s\" into symbol table failed: %s"),
525 S_GET_NAME (symbolP), error_string);
526 } /* on error */
529 /* If a symbol name does not exist, create it as undefined, and insert
530 it into the symbol table. Return a pointer to it. */
532 symbolS *
533 symbol_find_or_make (const char *name)
535 register symbolS *symbolP;
537 symbolP = symbol_find (name);
539 if (symbolP == NULL)
541 #ifdef BFD_ASSEMBLER
542 if (! flag_keep_locals && bfd_is_local_label_name (stdoutput, name))
544 symbolP = md_undefined_symbol ((char *) name);
545 if (symbolP != NULL)
546 return symbolP;
548 symbolP = (symbolS *) local_symbol_make (name, undefined_section,
549 (valueT) 0,
550 &zero_address_frag);
551 return symbolP;
553 #endif
555 symbolP = symbol_make (name);
557 symbol_table_insert (symbolP);
558 } /* if symbol wasn't found */
560 return (symbolP);
563 symbolS *
564 symbol_make (const char *name)
566 symbolS *symbolP;
568 /* Let the machine description default it, e.g. for register names. */
569 symbolP = md_undefined_symbol ((char *) name);
571 if (!symbolP)
572 symbolP = symbol_new (name, undefined_section, (valueT) 0, &zero_address_frag);
574 return (symbolP);
577 symbolS *
578 symbol_temp_new (segT seg, valueT ofs, fragS *frag)
580 return symbol_new (FAKE_LABEL_NAME, seg, ofs, frag);
583 symbolS *
584 symbol_temp_new_now (void)
586 return symbol_temp_new (now_seg, frag_now_fix (), frag_now);
589 symbolS *
590 symbol_temp_make (void)
592 return symbol_make (FAKE_LABEL_NAME);
595 /* Implement symbol table lookup.
596 In: A symbol's name as a string: '\0' can't be part of a symbol name.
597 Out: NULL if the name was not in the symbol table, else the address
598 of a struct symbol associated with that name. */
600 symbolS *
601 symbol_find (const char *name)
603 #ifdef STRIP_UNDERSCORE
604 return (symbol_find_base (name, 1));
605 #else /* STRIP_UNDERSCORE */
606 return (symbol_find_base (name, 0));
607 #endif /* STRIP_UNDERSCORE */
610 symbolS *
611 symbol_find_exact (const char *name)
613 #ifdef BFD_ASSEMBLER
615 struct local_symbol *locsym;
617 locsym = (struct local_symbol *) hash_find (local_hash, name);
618 if (locsym != NULL)
619 return (symbolS *) locsym;
621 #endif
623 return ((symbolS *) hash_find (sy_hash, name));
626 symbolS *
627 symbol_find_base (const char *name, int strip_underscore)
629 if (strip_underscore && *name == '_')
630 name++;
632 #ifdef tc_canonicalize_symbol_name
634 char *copy;
635 size_t len = strlen (name) + 1;
637 copy = (char *) alloca (len);
638 memcpy (copy, name, len);
639 name = tc_canonicalize_symbol_name (copy);
641 #endif
643 if (! symbols_case_sensitive)
645 char *copy;
646 const char *orig;
647 unsigned char c;
649 orig = name;
650 name = copy = (char *) alloca (strlen (name) + 1);
652 while ((c = *orig++) != '\0')
654 *copy++ = TOUPPER (c);
656 *copy = '\0';
659 return symbol_find_exact (name);
662 /* Once upon a time, symbols were kept in a singly linked list. At
663 least coff needs to be able to rearrange them from time to time, for
664 which a doubly linked list is much more convenient. Loic did these
665 as macros which seemed dangerous to me so they're now functions.
666 xoxorich. */
668 /* Link symbol ADDME after symbol TARGET in the chain. */
670 void
671 symbol_append (symbolS *addme, symbolS *target,
672 symbolS **rootPP, symbolS **lastPP)
674 if (LOCAL_SYMBOL_CHECK (addme))
675 abort ();
676 if (target != NULL && LOCAL_SYMBOL_CHECK (target))
677 abort ();
679 if (target == NULL)
681 know (*rootPP == NULL);
682 know (*lastPP == NULL);
683 addme->sy_next = NULL;
684 #ifdef SYMBOLS_NEED_BACKPOINTERS
685 addme->sy_previous = NULL;
686 #endif
687 *rootPP = addme;
688 *lastPP = addme;
689 return;
690 } /* if the list is empty */
692 if (target->sy_next != NULL)
694 #ifdef SYMBOLS_NEED_BACKPOINTERS
695 target->sy_next->sy_previous = addme;
696 #endif /* SYMBOLS_NEED_BACKPOINTERS */
698 else
700 know (*lastPP == target);
701 *lastPP = addme;
702 } /* if we have a next */
704 addme->sy_next = target->sy_next;
705 target->sy_next = addme;
707 #ifdef SYMBOLS_NEED_BACKPOINTERS
708 addme->sy_previous = target;
709 #endif /* SYMBOLS_NEED_BACKPOINTERS */
711 debug_verify_symchain (symbol_rootP, symbol_lastP);
714 /* Set the chain pointers of SYMBOL to null. */
716 void
717 symbol_clear_list_pointers (symbolS *symbolP)
719 if (LOCAL_SYMBOL_CHECK (symbolP))
720 abort ();
721 symbolP->sy_next = NULL;
722 #ifdef SYMBOLS_NEED_BACKPOINTERS
723 symbolP->sy_previous = NULL;
724 #endif
727 #ifdef SYMBOLS_NEED_BACKPOINTERS
728 /* Remove SYMBOLP from the list. */
730 void
731 symbol_remove (symbolS *symbolP, symbolS **rootPP, symbolS **lastPP)
733 if (LOCAL_SYMBOL_CHECK (symbolP))
734 abort ();
736 if (symbolP == *rootPP)
738 *rootPP = symbolP->sy_next;
739 } /* if it was the root */
741 if (symbolP == *lastPP)
743 *lastPP = symbolP->sy_previous;
744 } /* if it was the tail */
746 if (symbolP->sy_next != NULL)
748 symbolP->sy_next->sy_previous = symbolP->sy_previous;
749 } /* if not last */
751 if (symbolP->sy_previous != NULL)
753 symbolP->sy_previous->sy_next = symbolP->sy_next;
754 } /* if not first */
756 debug_verify_symchain (*rootPP, *lastPP);
759 /* Link symbol ADDME before symbol TARGET in the chain. */
761 void
762 symbol_insert (symbolS *addme, symbolS *target,
763 symbolS **rootPP, symbolS **lastPP ATTRIBUTE_UNUSED)
765 if (LOCAL_SYMBOL_CHECK (addme))
766 abort ();
767 if (LOCAL_SYMBOL_CHECK (target))
768 abort ();
770 if (target->sy_previous != NULL)
772 target->sy_previous->sy_next = addme;
774 else
776 know (*rootPP == target);
777 *rootPP = addme;
778 } /* if not first */
780 addme->sy_previous = target->sy_previous;
781 target->sy_previous = addme;
782 addme->sy_next = target;
784 debug_verify_symchain (*rootPP, *lastPP);
787 #endif /* SYMBOLS_NEED_BACKPOINTERS */
789 void
790 verify_symbol_chain (symbolS *rootP, symbolS *lastP)
792 symbolS *symbolP = rootP;
794 if (symbolP == NULL)
795 return;
797 for (; symbol_next (symbolP) != NULL; symbolP = symbol_next (symbolP))
799 #ifdef BFD_ASSEMBLER
800 assert (symbolP->bsym != NULL);
801 #endif
802 #ifdef SYMBOLS_NEED_BACKPOINTERS
803 assert (symbolP->sy_next->sy_previous == symbolP);
804 #else
805 /* Walk the list anyways, to make sure pointers are still good. */
807 #endif /* SYMBOLS_NEED_BACKPOINTERS */
810 assert (lastP == symbolP);
813 void
814 verify_symbol_chain_2 (symbolS *sym)
816 symbolS *p = sym, *n = sym;
817 #ifdef SYMBOLS_NEED_BACKPOINTERS
818 while (symbol_previous (p))
819 p = symbol_previous (p);
820 #endif
821 while (symbol_next (n))
822 n = symbol_next (n);
823 verify_symbol_chain (p, n);
826 static void
827 report_op_error (symbolS *symp, symbolS *left, symbolS *right)
829 char *file;
830 unsigned int line;
831 segT seg_left = S_GET_SEGMENT (left);
832 segT seg_right = right ? S_GET_SEGMENT (right) : 0;
834 if (expr_symbol_where (symp, &file, &line))
836 if (seg_left == undefined_section)
837 as_bad_where (file, line,
838 _("undefined symbol `%s' in operation"),
839 S_GET_NAME (left));
840 if (seg_right == undefined_section)
841 as_bad_where (file, line,
842 _("undefined symbol `%s' in operation"),
843 S_GET_NAME (right));
844 if (seg_left != undefined_section
845 && seg_right != undefined_section)
847 if (right)
848 as_bad_where (file, line,
849 _("invalid sections for operation on `%s' and `%s'"),
850 S_GET_NAME (left), S_GET_NAME (right));
851 else
852 as_bad_where (file, line,
853 _("invalid section for operation on `%s'"),
854 S_GET_NAME (left));
858 else
860 if (seg_left == undefined_section)
861 as_bad (_("undefined symbol `%s' in operation setting `%s'"),
862 S_GET_NAME (left), S_GET_NAME (symp));
863 if (seg_right == undefined_section)
864 as_bad (_("undefined symbol `%s' in operation setting `%s'"),
865 S_GET_NAME (right), S_GET_NAME (symp));
866 if (seg_left != undefined_section
867 && seg_right != undefined_section)
869 if (right)
870 as_bad_where (file, line,
871 _("invalid sections for operation on `%s' and `%s' setting `%s'"),
872 S_GET_NAME (left), S_GET_NAME (right), S_GET_NAME (symp));
873 else
874 as_bad_where (file, line,
875 _("invalid section for operation on `%s' setting `%s'"),
876 S_GET_NAME (left), S_GET_NAME (symp));
881 /* Resolve the value of a symbol. This is called during the final
882 pass over the symbol table to resolve any symbols with complex
883 values. */
885 valueT
886 resolve_symbol_value (symbolS *symp)
888 int resolved;
889 valueT final_val = 0;
890 segT final_seg;
892 #ifdef BFD_ASSEMBLER
893 if (LOCAL_SYMBOL_CHECK (symp))
895 struct local_symbol *locsym = (struct local_symbol *) symp;
897 final_val = locsym->lsy_value;
898 if (local_symbol_resolved_p (locsym))
899 return final_val;
901 final_val += local_symbol_get_frag (locsym)->fr_address / OCTETS_PER_BYTE;
903 if (finalize_syms)
905 locsym->lsy_value = final_val;
906 local_symbol_mark_resolved (locsym);
909 return final_val;
911 #endif
913 if (symp->sy_resolved)
915 if (symp->sy_value.X_op == O_constant)
916 return (valueT) symp->sy_value.X_add_number;
917 else
918 return 0;
921 resolved = 0;
922 final_seg = S_GET_SEGMENT (symp);
924 if (symp->sy_resolving)
926 if (finalize_syms)
927 as_bad (_("symbol definition loop encountered at `%s'"),
928 S_GET_NAME (symp));
929 final_val = 0;
930 resolved = 1;
932 else
934 symbolS *add_symbol, *op_symbol;
935 offsetT left, right;
936 segT seg_left, seg_right;
937 operatorT op;
939 symp->sy_resolving = 1;
941 /* Help out with CSE. */
942 add_symbol = symp->sy_value.X_add_symbol;
943 op_symbol = symp->sy_value.X_op_symbol;
944 final_val = symp->sy_value.X_add_number;
945 op = symp->sy_value.X_op;
947 switch (op)
949 default:
950 BAD_CASE (op);
951 break;
953 case O_absent:
954 final_val = 0;
955 /* Fall through. */
957 case O_constant:
958 final_val += symp->sy_frag->fr_address / OCTETS_PER_BYTE;
959 if (final_seg == expr_section)
960 final_seg = absolute_section;
961 resolved = 1;
962 break;
964 case O_symbol:
965 case O_symbol_rva:
966 left = resolve_symbol_value (add_symbol);
967 seg_left = S_GET_SEGMENT (add_symbol);
968 if (finalize_syms)
969 symp->sy_value.X_op_symbol = NULL;
971 do_symbol:
972 if (symp->sy_mri_common)
974 /* This is a symbol inside an MRI common section. The
975 relocation routines are going to handle it specially.
976 Don't change the value. */
977 resolved = symbol_resolved_p (add_symbol);
978 break;
981 if (finalize_syms && final_val == 0)
983 if (LOCAL_SYMBOL_CHECK (add_symbol))
984 add_symbol = local_symbol_convert ((struct local_symbol *)
985 add_symbol);
986 copy_symbol_attributes (symp, add_symbol);
989 /* If we have equated this symbol to an undefined or common
990 symbol, keep X_op set to O_symbol, and don't change
991 X_add_number. This permits the routine which writes out
992 relocation to detect this case, and convert the
993 relocation to be against the symbol to which this symbol
994 is equated. */
995 if (! S_IS_DEFINED (add_symbol) || S_IS_COMMON (add_symbol))
997 if (finalize_syms)
999 symp->sy_value.X_op = O_symbol;
1000 symp->sy_value.X_add_symbol = add_symbol;
1001 symp->sy_value.X_add_number = final_val;
1002 /* Use X_op_symbol as a flag. */
1003 symp->sy_value.X_op_symbol = add_symbol;
1004 final_seg = seg_left;
1006 final_val = 0;
1007 resolved = symbol_resolved_p (add_symbol);
1008 symp->sy_resolving = 0;
1009 goto exit_dont_set_value;
1011 else if (finalize_syms && final_seg == expr_section
1012 && seg_left != expr_section)
1014 /* If the symbol is an expression symbol, do similarly
1015 as for undefined and common syms above. Handles
1016 "sym +/- expr" where "expr" cannot be evaluated
1017 immediately, and we want relocations to be against
1018 "sym", eg. because it is weak. */
1019 symp->sy_value.X_op = O_symbol;
1020 symp->sy_value.X_add_symbol = add_symbol;
1021 symp->sy_value.X_add_number = final_val;
1022 symp->sy_value.X_op_symbol = add_symbol;
1023 final_seg = seg_left;
1024 final_val += symp->sy_frag->fr_address + left;
1025 resolved = symbol_resolved_p (add_symbol);
1026 symp->sy_resolving = 0;
1027 goto exit_dont_set_value;
1029 else
1031 final_val += symp->sy_frag->fr_address + left;
1032 if (final_seg == expr_section || final_seg == undefined_section)
1033 final_seg = seg_left;
1036 resolved = symbol_resolved_p (add_symbol);
1037 break;
1039 case O_uminus:
1040 case O_bit_not:
1041 case O_logical_not:
1042 left = resolve_symbol_value (add_symbol);
1043 seg_left = S_GET_SEGMENT (add_symbol);
1045 /* By reducing these to the relevant dyadic operator, we get
1046 !S -> S == 0 permitted on anything,
1047 -S -> 0 - S only permitted on absolute
1048 ~S -> S ^ ~0 only permitted on absolute */
1049 if (op != O_logical_not && seg_left != absolute_section
1050 && finalize_syms)
1051 report_op_error (symp, add_symbol, NULL);
1053 if (final_seg == expr_section || final_seg == undefined_section)
1054 final_seg = absolute_section;
1056 if (op == O_uminus)
1057 left = -left;
1058 else if (op == O_logical_not)
1059 left = !left;
1060 else
1061 left = ~left;
1063 final_val += left + symp->sy_frag->fr_address;
1065 resolved = symbol_resolved_p (add_symbol);
1066 break;
1068 case O_multiply:
1069 case O_divide:
1070 case O_modulus:
1071 case O_left_shift:
1072 case O_right_shift:
1073 case O_bit_inclusive_or:
1074 case O_bit_or_not:
1075 case O_bit_exclusive_or:
1076 case O_bit_and:
1077 case O_add:
1078 case O_subtract:
1079 case O_eq:
1080 case O_ne:
1081 case O_lt:
1082 case O_le:
1083 case O_ge:
1084 case O_gt:
1085 case O_logical_and:
1086 case O_logical_or:
1087 left = resolve_symbol_value (add_symbol);
1088 right = resolve_symbol_value (op_symbol);
1089 seg_left = S_GET_SEGMENT (add_symbol);
1090 seg_right = S_GET_SEGMENT (op_symbol);
1092 /* Simplify addition or subtraction of a constant by folding the
1093 constant into X_add_number. */
1094 if (op == O_add)
1096 if (seg_right == absolute_section)
1098 final_val += right;
1099 goto do_symbol;
1101 else if (seg_left == absolute_section)
1103 final_val += left;
1104 add_symbol = op_symbol;
1105 left = right;
1106 seg_left = seg_right;
1107 goto do_symbol;
1110 else if (op == O_subtract)
1112 if (seg_right == absolute_section)
1114 final_val -= right;
1115 goto do_symbol;
1119 /* Equality and non-equality tests are permitted on anything.
1120 Subtraction, and other comparison operators are permitted if
1121 both operands are in the same section. Otherwise, both
1122 operands must be absolute. We already handled the case of
1123 addition or subtraction of a constant above. This will
1124 probably need to be changed for an object file format which
1125 supports arbitrary expressions, such as IEEE-695.
1127 Don't emit messages unless we're finalizing the symbol value,
1128 otherwise we may get the same message multiple times. */
1129 if (finalize_syms
1130 && !(seg_left == absolute_section
1131 && seg_right == absolute_section)
1132 && !(op == O_eq || op == O_ne)
1133 && !((op == O_subtract
1134 || op == O_lt || op == O_le || op == O_ge || op == O_gt)
1135 && seg_left == seg_right
1136 && (seg_left != undefined_section
1137 || add_symbol == op_symbol)))
1138 report_op_error (symp, add_symbol, op_symbol);
1140 if (final_seg == expr_section || final_seg == undefined_section)
1141 final_seg = absolute_section;
1143 /* Check for division by zero. */
1144 if ((op == O_divide || op == O_modulus) && right == 0)
1146 /* If seg_right is not absolute_section, then we've
1147 already issued a warning about using a bad symbol. */
1148 if (seg_right == absolute_section && finalize_syms)
1150 char *file;
1151 unsigned int line;
1153 if (expr_symbol_where (symp, &file, &line))
1154 as_bad_where (file, line, _("division by zero"));
1155 else
1156 as_bad (_("division by zero when setting `%s'"),
1157 S_GET_NAME (symp));
1160 right = 1;
1163 switch (symp->sy_value.X_op)
1165 case O_multiply: left *= right; break;
1166 case O_divide: left /= right; break;
1167 case O_modulus: left %= right; break;
1168 case O_left_shift: left <<= right; break;
1169 case O_right_shift: left >>= right; break;
1170 case O_bit_inclusive_or: left |= right; break;
1171 case O_bit_or_not: left |= ~right; break;
1172 case O_bit_exclusive_or: left ^= right; break;
1173 case O_bit_and: left &= right; break;
1174 case O_add: left += right; break;
1175 case O_subtract: left -= right; break;
1176 case O_eq:
1177 case O_ne:
1178 left = (left == right && seg_left == seg_right
1179 && (seg_left != undefined_section
1180 || add_symbol == op_symbol)
1181 ? ~ (offsetT) 0 : 0);
1182 if (symp->sy_value.X_op == O_ne)
1183 left = ~left;
1184 break;
1185 case O_lt: left = left < right ? ~ (offsetT) 0 : 0; break;
1186 case O_le: left = left <= right ? ~ (offsetT) 0 : 0; break;
1187 case O_ge: left = left >= right ? ~ (offsetT) 0 : 0; break;
1188 case O_gt: left = left > right ? ~ (offsetT) 0 : 0; break;
1189 case O_logical_and: left = left && right; break;
1190 case O_logical_or: left = left || right; break;
1191 default: abort ();
1194 final_val += symp->sy_frag->fr_address + left;
1195 if (final_seg == expr_section || final_seg == undefined_section)
1197 if (seg_left == undefined_section
1198 || seg_right == undefined_section)
1199 final_seg = undefined_section;
1200 else if (seg_left == absolute_section)
1201 final_seg = seg_right;
1202 else
1203 final_seg = seg_left;
1205 resolved = (symbol_resolved_p (add_symbol)
1206 && symbol_resolved_p (op_symbol));
1207 break;
1209 case O_register:
1210 case O_big:
1211 case O_illegal:
1212 /* Give an error (below) if not in expr_section. We don't
1213 want to worry about expr_section symbols, because they
1214 are fictional (they are created as part of expression
1215 resolution), and any problems may not actually mean
1216 anything. */
1217 break;
1220 symp->sy_resolving = 0;
1223 if (finalize_syms)
1224 S_SET_VALUE (symp, final_val);
1226 exit_dont_set_value:
1227 /* Always set the segment, even if not finalizing the value.
1228 The segment is used to determine whether a symbol is defined. */
1229 #if defined (OBJ_AOUT) && ! defined (BFD_ASSEMBLER)
1230 /* The old a.out backend does not handle S_SET_SEGMENT correctly
1231 for a stab symbol, so we use this bad hack. */
1232 if (final_seg != S_GET_SEGMENT (symp))
1233 #endif
1234 S_SET_SEGMENT (symp, final_seg);
1236 /* Don't worry if we can't resolve an expr_section symbol. */
1237 if (finalize_syms)
1239 if (resolved)
1240 symp->sy_resolved = 1;
1241 else if (S_GET_SEGMENT (symp) != expr_section)
1243 as_bad (_("can't resolve value for symbol `%s'"),
1244 S_GET_NAME (symp));
1245 symp->sy_resolved = 1;
1249 return final_val;
1252 #ifdef BFD_ASSEMBLER
1254 static void resolve_local_symbol (const char *, PTR);
1256 /* A static function passed to hash_traverse. */
1258 static void
1259 resolve_local_symbol (const char *key ATTRIBUTE_UNUSED, PTR value)
1261 if (value != NULL)
1262 resolve_symbol_value (value);
1265 #endif
1267 /* Resolve all local symbols. */
1269 void
1270 resolve_local_symbol_values (void)
1272 #ifdef BFD_ASSEMBLER
1273 hash_traverse (local_hash, resolve_local_symbol);
1274 #endif
1277 /* Dollar labels look like a number followed by a dollar sign. Eg, "42$".
1278 They are *really* local. That is, they go out of scope whenever we see a
1279 label that isn't local. Also, like fb labels, there can be multiple
1280 instances of a dollar label. Therefor, we name encode each instance with
1281 the instance number, keep a list of defined symbols separate from the real
1282 symbol table, and we treat these buggers as a sparse array. */
1284 static long *dollar_labels;
1285 static long *dollar_label_instances;
1286 static char *dollar_label_defines;
1287 static unsigned long dollar_label_count;
1288 static unsigned long dollar_label_max;
1291 dollar_label_defined (long label)
1293 long *i;
1295 know ((dollar_labels != NULL) || (dollar_label_count == 0));
1297 for (i = dollar_labels; i < dollar_labels + dollar_label_count; ++i)
1298 if (*i == label)
1299 return dollar_label_defines[i - dollar_labels];
1301 /* If we get here, label isn't defined. */
1302 return 0;
1305 static long
1306 dollar_label_instance (long label)
1308 long *i;
1310 know ((dollar_labels != NULL) || (dollar_label_count == 0));
1312 for (i = dollar_labels; i < dollar_labels + dollar_label_count; ++i)
1313 if (*i == label)
1314 return (dollar_label_instances[i - dollar_labels]);
1316 /* If we get here, we haven't seen the label before.
1317 Therefore its instance count is zero. */
1318 return 0;
1321 void
1322 dollar_label_clear (void)
1324 memset (dollar_label_defines, '\0', (unsigned int) dollar_label_count);
1327 #define DOLLAR_LABEL_BUMP_BY 10
1329 void
1330 define_dollar_label (long label)
1332 long *i;
1334 for (i = dollar_labels; i < dollar_labels + dollar_label_count; ++i)
1335 if (*i == label)
1337 ++dollar_label_instances[i - dollar_labels];
1338 dollar_label_defines[i - dollar_labels] = 1;
1339 return;
1342 /* If we get to here, we don't have label listed yet. */
1344 if (dollar_labels == NULL)
1346 dollar_labels = (long *) xmalloc (DOLLAR_LABEL_BUMP_BY * sizeof (long));
1347 dollar_label_instances = (long *) xmalloc (DOLLAR_LABEL_BUMP_BY * sizeof (long));
1348 dollar_label_defines = xmalloc (DOLLAR_LABEL_BUMP_BY);
1349 dollar_label_max = DOLLAR_LABEL_BUMP_BY;
1350 dollar_label_count = 0;
1352 else if (dollar_label_count == dollar_label_max)
1354 dollar_label_max += DOLLAR_LABEL_BUMP_BY;
1355 dollar_labels = (long *) xrealloc ((char *) dollar_labels,
1356 dollar_label_max * sizeof (long));
1357 dollar_label_instances = (long *) xrealloc ((char *) dollar_label_instances,
1358 dollar_label_max * sizeof (long));
1359 dollar_label_defines = xrealloc (dollar_label_defines, dollar_label_max);
1360 } /* if we needed to grow */
1362 dollar_labels[dollar_label_count] = label;
1363 dollar_label_instances[dollar_label_count] = 1;
1364 dollar_label_defines[dollar_label_count] = 1;
1365 ++dollar_label_count;
1368 /* Caller must copy returned name: we re-use the area for the next name.
1370 The mth occurence of label n: is turned into the symbol "Ln^Am"
1371 where n is the label number and m is the instance number. "L" makes
1372 it a label discarded unless debugging and "^A"('\1') ensures no
1373 ordinary symbol SHOULD get the same name as a local label
1374 symbol. The first "4:" is "L4^A1" - the m numbers begin at 1.
1376 fb labels get the same treatment, except that ^B is used in place
1377 of ^A. */
1379 char * /* Return local label name. */
1380 dollar_label_name (register long n, /* we just saw "n$:" : n a number. */
1381 register int augend /* 0 for current instance, 1 for new instance. */)
1383 long i;
1384 /* Returned to caller, then copied. Used for created names ("4f"). */
1385 static char symbol_name_build[24];
1386 register char *p;
1387 register char *q;
1388 char symbol_name_temporary[20]; /* Build up a number, BACKWARDS. */
1390 know (n >= 0);
1391 know (augend == 0 || augend == 1);
1392 p = symbol_name_build;
1393 #ifdef LOCAL_LABEL_PREFIX
1394 *p++ = LOCAL_LABEL_PREFIX;
1395 #endif
1396 *p++ = 'L';
1398 /* Next code just does sprintf( {}, "%d", n); */
1399 /* Label number. */
1400 q = symbol_name_temporary;
1401 for (*q++ = 0, i = n; i; ++q)
1403 *q = i % 10 + '0';
1404 i /= 10;
1406 while ((*p = *--q) != '\0')
1407 ++p;
1409 *p++ = DOLLAR_LABEL_CHAR; /* ^A */
1411 /* Instance number. */
1412 q = symbol_name_temporary;
1413 for (*q++ = 0, i = dollar_label_instance (n) + augend; i; ++q)
1415 *q = i % 10 + '0';
1416 i /= 10;
1418 while ((*p++ = *--q) != '\0');;
1420 /* The label, as a '\0' ended string, starts at symbol_name_build. */
1421 return symbol_name_build;
1424 /* Somebody else's idea of local labels. They are made by "n:" where n
1425 is any decimal digit. Refer to them with
1426 "nb" for previous (backward) n:
1427 or "nf" for next (forward) n:.
1429 We do a little better and let n be any number, not just a single digit, but
1430 since the other guy's assembler only does ten, we treat the first ten
1431 specially.
1433 Like someone else's assembler, we have one set of local label counters for
1434 entire assembly, not one set per (sub)segment like in most assemblers. This
1435 implies that one can refer to a label in another segment, and indeed some
1436 crufty compilers have done just that.
1438 Since there could be a LOT of these things, treat them as a sparse
1439 array. */
1441 #define FB_LABEL_SPECIAL (10)
1443 static long fb_low_counter[FB_LABEL_SPECIAL];
1444 static long *fb_labels;
1445 static long *fb_label_instances;
1446 static long fb_label_count;
1447 static long fb_label_max;
1449 /* This must be more than FB_LABEL_SPECIAL. */
1450 #define FB_LABEL_BUMP_BY (FB_LABEL_SPECIAL + 6)
1452 static void
1453 fb_label_init (void)
1455 memset ((void *) fb_low_counter, '\0', sizeof (fb_low_counter));
1458 /* Add one to the instance number of this fb label. */
1460 void
1461 fb_label_instance_inc (long label)
1463 long *i;
1465 if (label < FB_LABEL_SPECIAL)
1467 ++fb_low_counter[label];
1468 return;
1471 if (fb_labels != NULL)
1473 for (i = fb_labels + FB_LABEL_SPECIAL;
1474 i < fb_labels + fb_label_count; ++i)
1476 if (*i == label)
1478 ++fb_label_instances[i - fb_labels];
1479 return;
1480 } /* if we find it */
1481 } /* for each existing label */
1484 /* If we get to here, we don't have label listed yet. */
1486 if (fb_labels == NULL)
1488 fb_labels = (long *) xmalloc (FB_LABEL_BUMP_BY * sizeof (long));
1489 fb_label_instances = (long *) xmalloc (FB_LABEL_BUMP_BY * sizeof (long));
1490 fb_label_max = FB_LABEL_BUMP_BY;
1491 fb_label_count = FB_LABEL_SPECIAL;
1494 else if (fb_label_count == fb_label_max)
1496 fb_label_max += FB_LABEL_BUMP_BY;
1497 fb_labels = (long *) xrealloc ((char *) fb_labels,
1498 fb_label_max * sizeof (long));
1499 fb_label_instances = (long *) xrealloc ((char *) fb_label_instances,
1500 fb_label_max * sizeof (long));
1501 } /* if we needed to grow */
1503 fb_labels[fb_label_count] = label;
1504 fb_label_instances[fb_label_count] = 1;
1505 ++fb_label_count;
1508 static long
1509 fb_label_instance (long label)
1511 long *i;
1513 if (label < FB_LABEL_SPECIAL)
1515 return (fb_low_counter[label]);
1518 if (fb_labels != NULL)
1520 for (i = fb_labels + FB_LABEL_SPECIAL;
1521 i < fb_labels + fb_label_count; ++i)
1523 if (*i == label)
1525 return (fb_label_instances[i - fb_labels]);
1526 } /* if we find it */
1527 } /* for each existing label */
1530 /* We didn't find the label, so this must be a reference to the
1531 first instance. */
1532 return 0;
1535 /* Caller must copy returned name: we re-use the area for the next name.
1537 The mth occurence of label n: is turned into the symbol "Ln^Bm"
1538 where n is the label number and m is the instance number. "L" makes
1539 it a label discarded unless debugging and "^B"('\2') ensures no
1540 ordinary symbol SHOULD get the same name as a local label
1541 symbol. The first "4:" is "L4^B1" - the m numbers begin at 1.
1543 dollar labels get the same treatment, except that ^A is used in
1544 place of ^B. */
1546 char * /* Return local label name. */
1547 fb_label_name (long n, /* We just saw "n:", "nf" or "nb" : n a number. */
1548 long augend /* 0 for nb, 1 for n:, nf. */)
1550 long i;
1551 /* Returned to caller, then copied. Used for created names ("4f"). */
1552 static char symbol_name_build[24];
1553 register char *p;
1554 register char *q;
1555 char symbol_name_temporary[20]; /* Build up a number, BACKWARDS. */
1557 know (n >= 0);
1558 know (augend == 0 || augend == 1);
1559 p = symbol_name_build;
1560 #ifdef LOCAL_LABEL_PREFIX
1561 *p++ = LOCAL_LABEL_PREFIX;
1562 #endif
1563 *p++ = 'L';
1565 /* Next code just does sprintf( {}, "%d", n); */
1566 /* Label number. */
1567 q = symbol_name_temporary;
1568 for (*q++ = 0, i = n; i; ++q)
1570 *q = i % 10 + '0';
1571 i /= 10;
1573 while ((*p = *--q) != '\0')
1574 ++p;
1576 *p++ = LOCAL_LABEL_CHAR; /* ^B */
1578 /* Instance number. */
1579 q = symbol_name_temporary;
1580 for (*q++ = 0, i = fb_label_instance (n) + augend; i; ++q)
1582 *q = i % 10 + '0';
1583 i /= 10;
1585 while ((*p++ = *--q) != '\0');;
1587 /* The label, as a '\0' ended string, starts at symbol_name_build. */
1588 return (symbol_name_build);
1591 /* Decode name that may have been generated by foo_label_name() above.
1592 If the name wasn't generated by foo_label_name(), then return it
1593 unaltered. This is used for error messages. */
1595 char *
1596 decode_local_label_name (char *s)
1598 char *p;
1599 char *symbol_decode;
1600 int label_number;
1601 int instance_number;
1602 char *type;
1603 const char *message_format;
1604 int index = 0;
1606 #ifdef LOCAL_LABEL_PREFIX
1607 if (s[index] == LOCAL_LABEL_PREFIX)
1608 ++index;
1609 #endif
1611 if (s[index] != 'L')
1612 return s;
1614 for (label_number = 0, p = s + index + 1; ISDIGIT (*p); ++p)
1615 label_number = (10 * label_number) + *p - '0';
1617 if (*p == DOLLAR_LABEL_CHAR)
1618 type = "dollar";
1619 else if (*p == LOCAL_LABEL_CHAR)
1620 type = "fb";
1621 else
1622 return s;
1624 for (instance_number = 0, p++; ISDIGIT (*p); ++p)
1625 instance_number = (10 * instance_number) + *p - '0';
1627 message_format = _("\"%d\" (instance number %d of a %s label)");
1628 symbol_decode = obstack_alloc (&notes, strlen (message_format) + 30);
1629 sprintf (symbol_decode, message_format, label_number, instance_number, type);
1631 return symbol_decode;
1634 /* Get the value of a symbol. */
1636 valueT
1637 S_GET_VALUE (symbolS *s)
1639 #ifdef BFD_ASSEMBLER
1640 if (LOCAL_SYMBOL_CHECK (s))
1641 return resolve_symbol_value (s);
1642 #endif
1644 if (!s->sy_resolved)
1646 valueT val = resolve_symbol_value (s);
1647 if (!finalize_syms)
1648 return val;
1650 if (s->sy_value.X_op != O_constant)
1652 static symbolS *recur;
1654 /* FIXME: In non BFD assemblers, S_IS_DEFINED and S_IS_COMMON
1655 may call S_GET_VALUE. We use a static symbol to avoid the
1656 immediate recursion. */
1657 if (recur == s)
1658 return (valueT) s->sy_value.X_add_number;
1659 recur = s;
1660 if (! s->sy_resolved
1661 || s->sy_value.X_op != O_symbol
1662 || (S_IS_DEFINED (s) && ! S_IS_COMMON (s)))
1663 as_bad (_("attempt to get value of unresolved symbol `%s'"),
1664 S_GET_NAME (s));
1665 recur = NULL;
1667 return (valueT) s->sy_value.X_add_number;
1670 /* Set the value of a symbol. */
1672 void
1673 S_SET_VALUE (symbolS *s, valueT val)
1675 #ifdef BFD_ASSEMBLER
1676 if (LOCAL_SYMBOL_CHECK (s))
1678 ((struct local_symbol *) s)->lsy_value = val;
1679 return;
1681 #endif
1683 s->sy_value.X_op = O_constant;
1684 s->sy_value.X_add_number = (offsetT) val;
1685 s->sy_value.X_unsigned = 0;
1688 void
1689 copy_symbol_attributes (symbolS *dest, symbolS *src)
1691 if (LOCAL_SYMBOL_CHECK (dest))
1692 dest = local_symbol_convert ((struct local_symbol *) dest);
1693 if (LOCAL_SYMBOL_CHECK (src))
1694 src = local_symbol_convert ((struct local_symbol *) src);
1696 #ifdef BFD_ASSEMBLER
1697 /* In an expression, transfer the settings of these flags.
1698 The user can override later, of course. */
1699 #define COPIED_SYMFLAGS (BSF_FUNCTION | BSF_OBJECT)
1700 dest->bsym->flags |= src->bsym->flags & COPIED_SYMFLAGS;
1701 #endif
1703 #ifdef OBJ_COPY_SYMBOL_ATTRIBUTES
1704 OBJ_COPY_SYMBOL_ATTRIBUTES (dest, src);
1705 #endif
1708 #ifdef BFD_ASSEMBLER
1711 S_IS_FUNCTION (symbolS *s)
1713 flagword flags;
1715 if (LOCAL_SYMBOL_CHECK (s))
1716 return 0;
1718 flags = s->bsym->flags;
1720 return (flags & BSF_FUNCTION) != 0;
1724 S_IS_EXTERNAL (symbolS *s)
1726 flagword flags;
1728 if (LOCAL_SYMBOL_CHECK (s))
1729 return 0;
1731 flags = s->bsym->flags;
1733 /* Sanity check. */
1734 if ((flags & BSF_LOCAL) && (flags & BSF_GLOBAL))
1735 abort ();
1737 return (flags & BSF_GLOBAL) != 0;
1741 S_IS_WEAK (symbolS *s)
1743 if (LOCAL_SYMBOL_CHECK (s))
1744 return 0;
1745 return (s->bsym->flags & BSF_WEAK) != 0;
1749 S_IS_COMMON (symbolS *s)
1751 if (LOCAL_SYMBOL_CHECK (s))
1752 return 0;
1753 return bfd_is_com_section (s->bsym->section);
1757 S_IS_DEFINED (symbolS *s)
1759 if (LOCAL_SYMBOL_CHECK (s))
1760 return ((struct local_symbol *) s)->lsy_section != undefined_section;
1761 return s->bsym->section != undefined_section;
1765 #ifndef EXTERN_FORCE_RELOC
1766 #define EXTERN_FORCE_RELOC IS_ELF
1767 #endif
1769 /* Return true for symbols that should not be reduced to section
1770 symbols or eliminated from expressions, because they may be
1771 overridden by the linker. */
1773 S_FORCE_RELOC (symbolS *s, int strict)
1775 if (LOCAL_SYMBOL_CHECK (s))
1776 return ((struct local_symbol *) s)->lsy_section == undefined_section;
1778 return ((strict
1779 && ((s->bsym->flags & BSF_WEAK) != 0
1780 || (EXTERN_FORCE_RELOC
1781 && (s->bsym->flags & BSF_GLOBAL) != 0)))
1782 || s->bsym->section == undefined_section
1783 || bfd_is_com_section (s->bsym->section));
1787 S_IS_DEBUG (symbolS *s)
1789 if (LOCAL_SYMBOL_CHECK (s))
1790 return 0;
1791 if (s->bsym->flags & BSF_DEBUGGING)
1792 return 1;
1793 return 0;
1797 S_IS_LOCAL (symbolS *s)
1799 flagword flags;
1800 const char *name;
1802 if (LOCAL_SYMBOL_CHECK (s))
1803 return 1;
1805 flags = s->bsym->flags;
1807 /* Sanity check. */
1808 if ((flags & BSF_LOCAL) && (flags & BSF_GLOBAL))
1809 abort ();
1811 if (bfd_get_section (s->bsym) == reg_section)
1812 return 1;
1814 if (flag_strip_local_absolute
1815 /* Keep BSF_FILE symbols in order to allow debuggers to identify
1816 the source file even when the object file is stripped. */
1817 && (flags & (BSF_GLOBAL | BSF_FILE)) == 0
1818 && bfd_get_section (s->bsym) == absolute_section)
1819 return 1;
1821 name = S_GET_NAME (s);
1822 return (name != NULL
1823 && ! S_IS_DEBUG (s)
1824 && (strchr (name, DOLLAR_LABEL_CHAR)
1825 || strchr (name, LOCAL_LABEL_CHAR)
1826 || (! flag_keep_locals
1827 && (bfd_is_local_label (stdoutput, s->bsym)
1828 || (flag_mri
1829 && name[0] == '?'
1830 && name[1] == '?')))));
1834 S_IS_EXTERN (symbolS *s)
1836 return S_IS_EXTERNAL (s);
1840 S_IS_STABD (symbolS *s)
1842 return S_GET_NAME (s) == 0;
1845 const char *
1846 S_GET_NAME (symbolS *s)
1848 if (LOCAL_SYMBOL_CHECK (s))
1849 return ((struct local_symbol *) s)->lsy_name;
1850 return s->bsym->name;
1853 segT
1854 S_GET_SEGMENT (symbolS *s)
1856 if (LOCAL_SYMBOL_CHECK (s))
1857 return ((struct local_symbol *) s)->lsy_section;
1858 return s->bsym->section;
1861 void
1862 S_SET_SEGMENT (symbolS *s, segT seg)
1864 /* Don't reassign section symbols. The direct reason is to prevent seg
1865 faults assigning back to const global symbols such as *ABS*, but it
1866 shouldn't happen anyway. */
1868 if (LOCAL_SYMBOL_CHECK (s))
1870 if (seg == reg_section)
1871 s = local_symbol_convert ((struct local_symbol *) s);
1872 else
1874 ((struct local_symbol *) s)->lsy_section = seg;
1875 return;
1879 if (s->bsym->flags & BSF_SECTION_SYM)
1881 if (s->bsym->section != seg)
1882 abort ();
1884 else
1885 s->bsym->section = seg;
1888 void
1889 S_SET_EXTERNAL (symbolS *s)
1891 if (LOCAL_SYMBOL_CHECK (s))
1892 s = local_symbol_convert ((struct local_symbol *) s);
1893 if ((s->bsym->flags & BSF_WEAK) != 0)
1895 /* Let .weak override .global. */
1896 return;
1898 if (s->bsym->flags & BSF_SECTION_SYM)
1900 char * file;
1901 unsigned int line;
1903 /* Do not reassign section symbols. */
1904 as_where (& file, & line);
1905 as_warn_where (file, line,
1906 _("section symbols are already global"));
1907 return;
1909 s->bsym->flags |= BSF_GLOBAL;
1910 s->bsym->flags &= ~(BSF_LOCAL | BSF_WEAK);
1913 void
1914 S_CLEAR_EXTERNAL (symbolS *s)
1916 if (LOCAL_SYMBOL_CHECK (s))
1917 return;
1918 if ((s->bsym->flags & BSF_WEAK) != 0)
1920 /* Let .weak override. */
1921 return;
1923 s->bsym->flags |= BSF_LOCAL;
1924 s->bsym->flags &= ~(BSF_GLOBAL | BSF_WEAK);
1927 void
1928 S_SET_WEAK (symbolS *s)
1930 if (LOCAL_SYMBOL_CHECK (s))
1931 s = local_symbol_convert ((struct local_symbol *) s);
1932 s->bsym->flags |= BSF_WEAK;
1933 s->bsym->flags &= ~(BSF_GLOBAL | BSF_LOCAL);
1936 void
1937 S_SET_THREAD_LOCAL (symbolS *s)
1939 if (LOCAL_SYMBOL_CHECK (s))
1940 s = local_symbol_convert ((struct local_symbol *) s);
1941 if (bfd_is_com_section (s->bsym->section)
1942 && (s->bsym->flags & BSF_THREAD_LOCAL) != 0)
1943 return;
1944 s->bsym->flags |= BSF_THREAD_LOCAL;
1945 if ((s->bsym->flags & BSF_FUNCTION) != 0)
1946 as_bad (_("Accessing function `%s' as thread-local object"),
1947 S_GET_NAME (s));
1948 else if (! bfd_is_und_section (s->bsym->section)
1949 && (s->bsym->section->flags & SEC_THREAD_LOCAL) == 0)
1950 as_bad (_("Accessing `%s' as thread-local object"),
1951 S_GET_NAME (s));
1954 void
1955 S_SET_NAME (symbolS *s, char *name)
1957 if (LOCAL_SYMBOL_CHECK (s))
1959 ((struct local_symbol *) s)->lsy_name = name;
1960 return;
1962 s->bsym->name = name;
1964 #endif /* BFD_ASSEMBLER */
1966 #ifdef SYMBOLS_NEED_BACKPOINTERS
1968 /* Return the previous symbol in a chain. */
1970 symbolS *
1971 symbol_previous (symbolS *s)
1973 if (LOCAL_SYMBOL_CHECK (s))
1974 abort ();
1975 return s->sy_previous;
1978 #endif /* SYMBOLS_NEED_BACKPOINTERS */
1980 /* Return the next symbol in a chain. */
1982 symbolS *
1983 symbol_next (symbolS *s)
1985 if (LOCAL_SYMBOL_CHECK (s))
1986 abort ();
1987 return s->sy_next;
1990 /* Return a pointer to the value of a symbol as an expression. */
1992 expressionS *
1993 symbol_get_value_expression (symbolS *s)
1995 if (LOCAL_SYMBOL_CHECK (s))
1996 s = local_symbol_convert ((struct local_symbol *) s);
1997 return &s->sy_value;
2000 /* Set the value of a symbol to an expression. */
2002 void
2003 symbol_set_value_expression (symbolS *s, const expressionS *exp)
2005 if (LOCAL_SYMBOL_CHECK (s))
2006 s = local_symbol_convert ((struct local_symbol *) s);
2007 s->sy_value = *exp;
2010 /* Set the value of SYM to the current position in the current segment. */
2012 void
2013 symbol_set_value_now (symbolS *sym)
2015 S_SET_SEGMENT (sym, now_seg);
2016 S_SET_VALUE (sym, frag_now_fix ());
2017 symbol_set_frag (sym, frag_now);
2020 /* Set the frag of a symbol. */
2022 void
2023 symbol_set_frag (symbolS *s, fragS *f)
2025 #ifdef BFD_ASSEMBLER
2026 if (LOCAL_SYMBOL_CHECK (s))
2028 local_symbol_set_frag ((struct local_symbol *) s, f);
2029 return;
2031 #endif
2032 s->sy_frag = f;
2035 /* Return the frag of a symbol. */
2037 fragS *
2038 symbol_get_frag (symbolS *s)
2040 #ifdef BFD_ASSEMBLER
2041 if (LOCAL_SYMBOL_CHECK (s))
2042 return local_symbol_get_frag ((struct local_symbol *) s);
2043 #endif
2044 return s->sy_frag;
2047 /* Mark a symbol as having been used. */
2049 void
2050 symbol_mark_used (symbolS *s)
2052 if (LOCAL_SYMBOL_CHECK (s))
2053 return;
2054 s->sy_used = 1;
2057 /* Clear the mark of whether a symbol has been used. */
2059 void
2060 symbol_clear_used (symbolS *s)
2062 if (LOCAL_SYMBOL_CHECK (s))
2063 s = local_symbol_convert ((struct local_symbol *) s);
2064 s->sy_used = 0;
2067 /* Return whether a symbol has been used. */
2070 symbol_used_p (symbolS *s)
2072 if (LOCAL_SYMBOL_CHECK (s))
2073 return 1;
2074 return s->sy_used;
2077 /* Mark a symbol as having been used in a reloc. */
2079 void
2080 symbol_mark_used_in_reloc (symbolS *s)
2082 if (LOCAL_SYMBOL_CHECK (s))
2083 s = local_symbol_convert ((struct local_symbol *) s);
2084 s->sy_used_in_reloc = 1;
2087 /* Clear the mark of whether a symbol has been used in a reloc. */
2089 void
2090 symbol_clear_used_in_reloc (symbolS *s)
2092 if (LOCAL_SYMBOL_CHECK (s))
2093 return;
2094 s->sy_used_in_reloc = 0;
2097 /* Return whether a symbol has been used in a reloc. */
2100 symbol_used_in_reloc_p (symbolS *s)
2102 if (LOCAL_SYMBOL_CHECK (s))
2103 return 0;
2104 return s->sy_used_in_reloc;
2107 /* Mark a symbol as an MRI common symbol. */
2109 void
2110 symbol_mark_mri_common (symbolS *s)
2112 if (LOCAL_SYMBOL_CHECK (s))
2113 s = local_symbol_convert ((struct local_symbol *) s);
2114 s->sy_mri_common = 1;
2117 /* Clear the mark of whether a symbol is an MRI common symbol. */
2119 void
2120 symbol_clear_mri_common (symbolS *s)
2122 if (LOCAL_SYMBOL_CHECK (s))
2123 return;
2124 s->sy_mri_common = 0;
2127 /* Return whether a symbol is an MRI common symbol. */
2130 symbol_mri_common_p (symbolS *s)
2132 if (LOCAL_SYMBOL_CHECK (s))
2133 return 0;
2134 return s->sy_mri_common;
2137 /* Mark a symbol as having been written. */
2139 void
2140 symbol_mark_written (symbolS *s)
2142 if (LOCAL_SYMBOL_CHECK (s))
2143 return;
2144 s->written = 1;
2147 /* Clear the mark of whether a symbol has been written. */
2149 void
2150 symbol_clear_written (symbolS *s)
2152 if (LOCAL_SYMBOL_CHECK (s))
2153 return;
2154 s->written = 0;
2157 /* Return whether a symbol has been written. */
2160 symbol_written_p (symbolS *s)
2162 if (LOCAL_SYMBOL_CHECK (s))
2163 return 0;
2164 return s->written;
2167 /* Mark a symbol has having been resolved. */
2169 void
2170 symbol_mark_resolved (symbolS *s)
2172 #ifdef BFD_ASSEMBLER
2173 if (LOCAL_SYMBOL_CHECK (s))
2175 local_symbol_mark_resolved ((struct local_symbol *) s);
2176 return;
2178 #endif
2179 s->sy_resolved = 1;
2182 /* Return whether a symbol has been resolved. */
2185 symbol_resolved_p (symbolS *s)
2187 #ifdef BFD_ASSEMBLER
2188 if (LOCAL_SYMBOL_CHECK (s))
2189 return local_symbol_resolved_p ((struct local_symbol *) s);
2190 #endif
2191 return s->sy_resolved;
2194 /* Return whether a symbol is a section symbol. */
2197 symbol_section_p (symbolS *s ATTRIBUTE_UNUSED)
2199 if (LOCAL_SYMBOL_CHECK (s))
2200 return 0;
2201 #ifdef BFD_ASSEMBLER
2202 return (s->bsym->flags & BSF_SECTION_SYM) != 0;
2203 #else
2204 /* FIXME. */
2205 return 0;
2206 #endif
2209 /* Return whether a symbol is equated to another symbol. */
2212 symbol_equated_p (symbolS *s)
2214 if (LOCAL_SYMBOL_CHECK (s))
2215 return 0;
2216 return s->sy_value.X_op == O_symbol;
2219 /* Return whether a symbol is equated to another symbol, and should be
2220 treated specially when writing out relocs. */
2223 symbol_equated_reloc_p (symbolS *s)
2225 if (LOCAL_SYMBOL_CHECK (s))
2226 return 0;
2227 /* X_op_symbol, normally not used for O_symbol, is set by
2228 resolve_symbol_value to flag expression syms that have been
2229 equated. */
2230 return (s->sy_value.X_op == O_symbol
2231 && ((s->sy_resolved && s->sy_value.X_op_symbol != NULL)
2232 || ! S_IS_DEFINED (s)
2233 || S_IS_COMMON (s)));
2236 /* Return whether a symbol has a constant value. */
2239 symbol_constant_p (symbolS *s)
2241 if (LOCAL_SYMBOL_CHECK (s))
2242 return 1;
2243 return s->sy_value.X_op == O_constant;
2246 #ifdef BFD_ASSEMBLER
2248 /* Return the BFD symbol for a symbol. */
2250 asymbol *
2251 symbol_get_bfdsym (symbolS *s)
2253 if (LOCAL_SYMBOL_CHECK (s))
2254 s = local_symbol_convert ((struct local_symbol *) s);
2255 return s->bsym;
2258 /* Set the BFD symbol for a symbol. */
2260 void
2261 symbol_set_bfdsym (symbolS *s, asymbol *bsym)
2263 if (LOCAL_SYMBOL_CHECK (s))
2264 s = local_symbol_convert ((struct local_symbol *) s);
2265 /* Usually, it is harmless to reset a symbol to a BFD section
2266 symbol. For example, obj_elf_change_section sets the BFD symbol
2267 of an old symbol with the newly created section symbol. But when
2268 we have multiple sections with the same name, the newly created
2269 section may have the same name as an old section. We check if the
2270 old symbol has been already marked as a section symbol before
2271 resetting it. */
2272 if ((s->bsym->flags & BSF_SECTION_SYM) == 0)
2273 s->bsym = bsym;
2274 /* else XXX - What do we do now ? */
2277 #endif /* BFD_ASSEMBLER */
2279 #ifdef OBJ_SYMFIELD_TYPE
2281 /* Get a pointer to the object format information for a symbol. */
2283 OBJ_SYMFIELD_TYPE *
2284 symbol_get_obj (symbolS *s)
2286 if (LOCAL_SYMBOL_CHECK (s))
2287 s = local_symbol_convert ((struct local_symbol *) s);
2288 return &s->sy_obj;
2291 /* Set the object format information for a symbol. */
2293 void
2294 symbol_set_obj (symbolS *s, OBJ_SYMFIELD_TYPE *o)
2296 if (LOCAL_SYMBOL_CHECK (s))
2297 s = local_symbol_convert ((struct local_symbol *) s);
2298 s->sy_obj = *o;
2301 #endif /* OBJ_SYMFIELD_TYPE */
2303 #ifdef TC_SYMFIELD_TYPE
2305 /* Get a pointer to the processor information for a symbol. */
2307 TC_SYMFIELD_TYPE *
2308 symbol_get_tc (symbolS *s)
2310 if (LOCAL_SYMBOL_CHECK (s))
2311 s = local_symbol_convert ((struct local_symbol *) s);
2312 return &s->sy_tc;
2315 /* Set the processor information for a symbol. */
2317 void
2318 symbol_set_tc (symbolS *s, TC_SYMFIELD_TYPE *o)
2320 if (LOCAL_SYMBOL_CHECK (s))
2321 s = local_symbol_convert ((struct local_symbol *) s);
2322 s->sy_tc = *o;
2325 #endif /* TC_SYMFIELD_TYPE */
2327 void
2328 symbol_begin (void)
2330 symbol_lastP = NULL;
2331 symbol_rootP = NULL; /* In case we have 0 symbols (!!) */
2332 sy_hash = hash_new ();
2333 #ifdef BFD_ASSEMBLER
2334 local_hash = hash_new ();
2335 #endif
2337 memset ((char *) (&abs_symbol), '\0', sizeof (abs_symbol));
2338 #ifdef BFD_ASSEMBLER
2339 #if defined (EMIT_SECTION_SYMBOLS) || !defined (RELOC_REQUIRES_SYMBOL)
2340 abs_symbol.bsym = bfd_abs_section.symbol;
2341 #endif
2342 #else
2343 /* Can't initialise a union. Sigh. */
2344 S_SET_SEGMENT (&abs_symbol, absolute_section);
2345 #endif
2346 abs_symbol.sy_value.X_op = O_constant;
2347 abs_symbol.sy_frag = &zero_address_frag;
2349 if (LOCAL_LABELS_FB)
2350 fb_label_init ();
2353 int indent_level;
2355 /* Maximum indent level.
2356 Available for modification inside a gdb session. */
2357 int max_indent_level = 8;
2359 #if 0
2361 static void
2362 indent (void)
2364 printf ("%*s", indent_level * 4, "");
2367 #endif
2369 void
2370 print_symbol_value_1 (FILE *file, symbolS *sym)
2372 const char *name = S_GET_NAME (sym);
2373 if (!name || !name[0])
2374 name = "(unnamed)";
2375 fprintf (file, "sym %lx %s", (unsigned long) sym, name);
2377 if (LOCAL_SYMBOL_CHECK (sym))
2379 #ifdef BFD_ASSEMBLER
2380 struct local_symbol *locsym = (struct local_symbol *) sym;
2381 if (local_symbol_get_frag (locsym) != &zero_address_frag
2382 && local_symbol_get_frag (locsym) != NULL)
2383 fprintf (file, " frag %lx", (long) local_symbol_get_frag (locsym));
2384 if (local_symbol_resolved_p (locsym))
2385 fprintf (file, " resolved");
2386 fprintf (file, " local");
2387 #endif
2389 else
2391 if (sym->sy_frag != &zero_address_frag)
2392 fprintf (file, " frag %lx", (long) sym->sy_frag);
2393 if (sym->written)
2394 fprintf (file, " written");
2395 if (sym->sy_resolved)
2396 fprintf (file, " resolved");
2397 else if (sym->sy_resolving)
2398 fprintf (file, " resolving");
2399 if (sym->sy_used_in_reloc)
2400 fprintf (file, " used-in-reloc");
2401 if (sym->sy_used)
2402 fprintf (file, " used");
2403 if (S_IS_LOCAL (sym))
2404 fprintf (file, " local");
2405 if (S_IS_EXTERN (sym))
2406 fprintf (file, " extern");
2407 if (S_IS_DEBUG (sym))
2408 fprintf (file, " debug");
2409 if (S_IS_DEFINED (sym))
2410 fprintf (file, " defined");
2412 fprintf (file, " %s", segment_name (S_GET_SEGMENT (sym)));
2413 if (symbol_resolved_p (sym))
2415 segT s = S_GET_SEGMENT (sym);
2417 if (s != undefined_section
2418 && s != expr_section)
2419 fprintf (file, " %lx", (long) S_GET_VALUE (sym));
2421 else if (indent_level < max_indent_level
2422 && S_GET_SEGMENT (sym) != undefined_section)
2424 indent_level++;
2425 fprintf (file, "\n%*s<", indent_level * 4, "");
2426 #ifdef BFD_ASSEMBLER
2427 if (LOCAL_SYMBOL_CHECK (sym))
2428 fprintf (file, "constant %lx",
2429 (long) ((struct local_symbol *) sym)->lsy_value);
2430 else
2431 #endif
2432 print_expr_1 (file, &sym->sy_value);
2433 fprintf (file, ">");
2434 indent_level--;
2436 fflush (file);
2439 void
2440 print_symbol_value (symbolS *sym)
2442 indent_level = 0;
2443 print_symbol_value_1 (stderr, sym);
2444 fprintf (stderr, "\n");
2447 static void
2448 print_binary (FILE *file, const char *name, expressionS *exp)
2450 indent_level++;
2451 fprintf (file, "%s\n%*s<", name, indent_level * 4, "");
2452 print_symbol_value_1 (file, exp->X_add_symbol);
2453 fprintf (file, ">\n%*s<", indent_level * 4, "");
2454 print_symbol_value_1 (file, exp->X_op_symbol);
2455 fprintf (file, ">");
2456 indent_level--;
2459 void
2460 print_expr_1 (FILE *file, expressionS *exp)
2462 fprintf (file, "expr %lx ", (long) exp);
2463 switch (exp->X_op)
2465 case O_illegal:
2466 fprintf (file, "illegal");
2467 break;
2468 case O_absent:
2469 fprintf (file, "absent");
2470 break;
2471 case O_constant:
2472 fprintf (file, "constant %lx", (long) exp->X_add_number);
2473 break;
2474 case O_symbol:
2475 indent_level++;
2476 fprintf (file, "symbol\n%*s<", indent_level * 4, "");
2477 print_symbol_value_1 (file, exp->X_add_symbol);
2478 fprintf (file, ">");
2479 maybe_print_addnum:
2480 if (exp->X_add_number)
2481 fprintf (file, "\n%*s%lx", indent_level * 4, "",
2482 (long) exp->X_add_number);
2483 indent_level--;
2484 break;
2485 case O_register:
2486 fprintf (file, "register #%d", (int) exp->X_add_number);
2487 break;
2488 case O_big:
2489 fprintf (file, "big");
2490 break;
2491 case O_uminus:
2492 fprintf (file, "uminus -<");
2493 indent_level++;
2494 print_symbol_value_1 (file, exp->X_add_symbol);
2495 fprintf (file, ">");
2496 goto maybe_print_addnum;
2497 case O_bit_not:
2498 fprintf (file, "bit_not");
2499 break;
2500 case O_multiply:
2501 print_binary (file, "multiply", exp);
2502 break;
2503 case O_divide:
2504 print_binary (file, "divide", exp);
2505 break;
2506 case O_modulus:
2507 print_binary (file, "modulus", exp);
2508 break;
2509 case O_left_shift:
2510 print_binary (file, "lshift", exp);
2511 break;
2512 case O_right_shift:
2513 print_binary (file, "rshift", exp);
2514 break;
2515 case O_bit_inclusive_or:
2516 print_binary (file, "bit_ior", exp);
2517 break;
2518 case O_bit_exclusive_or:
2519 print_binary (file, "bit_xor", exp);
2520 break;
2521 case O_bit_and:
2522 print_binary (file, "bit_and", exp);
2523 break;
2524 case O_eq:
2525 print_binary (file, "eq", exp);
2526 break;
2527 case O_ne:
2528 print_binary (file, "ne", exp);
2529 break;
2530 case O_lt:
2531 print_binary (file, "lt", exp);
2532 break;
2533 case O_le:
2534 print_binary (file, "le", exp);
2535 break;
2536 case O_ge:
2537 print_binary (file, "ge", exp);
2538 break;
2539 case O_gt:
2540 print_binary (file, "gt", exp);
2541 break;
2542 case O_logical_and:
2543 print_binary (file, "logical_and", exp);
2544 break;
2545 case O_logical_or:
2546 print_binary (file, "logical_or", exp);
2547 break;
2548 case O_add:
2549 indent_level++;
2550 fprintf (file, "add\n%*s<", indent_level * 4, "");
2551 print_symbol_value_1 (file, exp->X_add_symbol);
2552 fprintf (file, ">\n%*s<", indent_level * 4, "");
2553 print_symbol_value_1 (file, exp->X_op_symbol);
2554 fprintf (file, ">");
2555 goto maybe_print_addnum;
2556 case O_subtract:
2557 indent_level++;
2558 fprintf (file, "subtract\n%*s<", indent_level * 4, "");
2559 print_symbol_value_1 (file, exp->X_add_symbol);
2560 fprintf (file, ">\n%*s<", indent_level * 4, "");
2561 print_symbol_value_1 (file, exp->X_op_symbol);
2562 fprintf (file, ">");
2563 goto maybe_print_addnum;
2564 default:
2565 fprintf (file, "{unknown opcode %d}", (int) exp->X_op);
2566 break;
2568 fflush (stdout);
2571 void
2572 print_expr (expressionS *exp)
2574 print_expr_1 (stderr, exp);
2575 fprintf (stderr, "\n");
2578 void
2579 symbol_print_statistics (FILE *file)
2581 hash_print_statistics (file, "symbol table", sy_hash);
2582 #ifdef BFD_ASSEMBLER
2583 hash_print_statistics (file, "mini local symbol table", local_hash);
2584 fprintf (file, "%lu mini local symbols created, %lu converted\n",
2585 local_symbol_count, local_symbol_conversion_count);
2586 #endif