1 /* symbols.c -symbol table-
2 Copyright 1987, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
3 1999, 2000, 2001, 2002, 2003, 2004, 2005
4 Free Software Foundation, Inc.
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)
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, 51 Franklin Street - Fifth Floor, Boston, MA
23 /* #define DEBUG_SYMS / * to debug symbol list maintenance. */
27 #include "safe-ctype.h"
28 #include "obstack.h" /* For "symbols.h" */
31 #include "struc-symbol.h"
33 /* This is non-zero if symbols are case sensitive, which is the
35 int symbols_case_sensitive = 1;
37 #ifndef WORKING_DOT_WORD
38 extern int new_broken_words;
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;
53 #define debug_verify_symchain verify_symbol_chain
55 #define debug_verify_symchain(root, last) ((void) 0)
58 #define DOLLAR_LABEL_CHAR '\001'
59 #define LOCAL_LABEL_CHAR '\002'
63 /* The name of an external symbol which is
64 used to make weak PE symbol names unique. */
65 const char * an_external_name;
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);
73 static void print_binary (FILE *, const char *, expressionS *);
74 static void report_op_error (symbolS *, symbolS *, symbolS *);
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
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. */
86 symbol_new (const char *name, segT segment, valueT valu, fragS *frag)
88 symbolS *symbolP = symbol_create (name, segment, valu, frag);
90 /* Link to end of symbol chain. */
92 extern int symbol_table_frozen;
93 if (symbol_table_frozen)
96 symbol_append (symbolP, symbol_lastP, &symbol_rootP, &symbol_lastP);
101 /* Save a symbol name on a permanent obstack, and convert it according
102 to the object file format. */
105 save_symbol_name (const char *name)
107 unsigned int name_length;
110 name_length = strlen (name) + 1; /* +1 for \0. */
111 obstack_grow (¬es, name, name_length);
112 ret = obstack_finish (¬es);
114 #ifdef tc_canonicalize_symbol_name
115 ret = tc_canonicalize_symbol_name (ret);
118 if (! symbols_case_sensitive)
122 for (s = ret; *s != '\0'; s++)
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. */)
135 char *preserved_copy_of_name;
138 preserved_copy_of_name = save_symbol_name (name);
140 symbolP = (symbolS *) obstack_alloc (¬es, sizeof (symbolS));
142 /* symbol must be born in some fixed state. This seems as good as any. */
143 memset (symbolP, 0, sizeof (symbolS));
145 symbolP->bsym = bfd_make_empty_symbol (stdoutput);
146 if (symbolP->bsym == NULL)
147 as_perror ("%s", "bfd_make_empty_symbol");
148 symbolP->bsym->udata.p = (PTR) symbolP;
149 S_SET_NAME (symbolP, preserved_copy_of_name);
151 S_SET_SEGMENT (symbolP, segment);
152 S_SET_VALUE (symbolP, valu);
153 symbol_clear_list_pointers (symbolP);
155 symbolP->sy_frag = frag;
157 obj_symbol_new_hook (symbolP);
159 #ifdef tc_symbol_new_hook
160 tc_symbol_new_hook (symbolP);
167 /* Local symbol support. If we can get away with it, we keep only a
168 small amount of information for local symbols. */
170 static symbolS *local_symbol_convert (struct local_symbol *);
172 /* Used for statistics. */
174 static unsigned long local_symbol_count;
175 static unsigned long local_symbol_conversion_count;
177 /* This macro is called with a symbol argument passed by reference.
178 It returns whether this is a local symbol. If necessary, it
179 changes its argument to the real symbol. */
181 #define LOCAL_SYMBOL_CHECK(s) \
183 ? (local_symbol_converted_p ((struct local_symbol *) s) \
184 ? (s = local_symbol_get_real_symbol ((struct local_symbol *) s), \
189 /* Create a local symbol and insert it into the local hash table. */
191 static struct local_symbol *
192 local_symbol_make (const char *name, segT section, valueT value, fragS *frag)
195 struct local_symbol *ret;
197 ++local_symbol_count;
199 name_copy = save_symbol_name (name);
201 ret = (struct local_symbol *) obstack_alloc (¬es, sizeof *ret);
202 ret->lsy_marker = NULL;
203 ret->lsy_name = name_copy;
204 ret->lsy_section = section;
205 local_symbol_set_frag (ret, frag);
206 ret->lsy_value = value;
208 hash_jam (local_hash, name_copy, (PTR) ret);
213 /* Convert a local symbol into a real symbol. Note that we do not
214 reclaim the space used by the local symbol. */
217 local_symbol_convert (struct local_symbol *locsym)
221 assert (locsym->lsy_marker == NULL);
222 if (local_symbol_converted_p (locsym))
223 return local_symbol_get_real_symbol (locsym);
225 ++local_symbol_conversion_count;
227 ret = symbol_new (locsym->lsy_name, locsym->lsy_section, locsym->lsy_value,
228 local_symbol_get_frag (locsym));
230 if (local_symbol_resolved_p (locsym))
231 ret->sy_resolved = 1;
233 /* Local symbols are always either defined or used. */
236 #ifdef TC_LOCAL_SYMFIELD_CONVERT
237 TC_LOCAL_SYMFIELD_CONVERT (locsym, ret);
240 symbol_table_insert (ret);
242 local_symbol_mark_converted (locsym);
243 local_symbol_set_real_symbol (locsym, ret);
245 hash_jam (local_hash, locsym->lsy_name, NULL);
250 /* We have just seen "<name>:".
251 Creates a struct symbol unless it already exists.
253 Gripes if we are redefining a symbol incompatibly (and ignores it). */
256 colon (/* Just seen "x:" - rattle symbols & frags. */
257 const char *sym_name /* Symbol name, as a cannonical string. */
258 /* We copy this string: OK to alter later. */)
260 register symbolS *symbolP; /* Symbol we are working with. */
262 /* Sun local labels go out of scope whenever a non-local symbol is
264 if (LOCAL_LABELS_DOLLAR
265 && !bfd_is_local_label_name (stdoutput, sym_name))
266 dollar_label_clear ();
268 #ifndef WORKING_DOT_WORD
269 if (new_broken_words)
271 struct broken_word *a;
276 if (now_seg == absolute_section)
278 as_bad (_("cannot define symbol `%s' in absolute section"), sym_name);
282 possible_bytes = (md_short_jump_size
283 + new_broken_words * md_long_jump_size);
286 frag_opcode = frag_var (rs_broken_word,
290 (symbolS *) broken_words,
294 /* We want to store the pointer to where to insert the jump
295 table in the fr_opcode of the rs_broken_word frag. This
296 requires a little hackery. */
298 && (frag_tmp->fr_type != rs_broken_word
299 || frag_tmp->fr_opcode))
300 frag_tmp = frag_tmp->fr_next;
302 frag_tmp->fr_opcode = frag_opcode;
303 new_broken_words = 0;
305 for (a = broken_words; a && a->dispfrag == 0; a = a->next_broken_word)
306 a->dispfrag = frag_tmp;
308 #endif /* WORKING_DOT_WORD */
310 if ((symbolP = symbol_find (sym_name)) != 0)
312 S_CLEAR_WEAKREFR (symbolP);
313 #ifdef RESOLVE_SYMBOL_REDEFINITION
314 if (RESOLVE_SYMBOL_REDEFINITION (symbolP))
317 /* Now check for undefined symbols. */
318 if (LOCAL_SYMBOL_CHECK (symbolP))
320 struct local_symbol *locsym = (struct local_symbol *) symbolP;
322 if (locsym->lsy_section != undefined_section
323 && (local_symbol_get_frag (locsym) != frag_now
324 || locsym->lsy_section != now_seg
325 || locsym->lsy_value != frag_now_fix ()))
327 as_bad (_("symbol `%s' is already defined"), sym_name);
331 locsym->lsy_section = now_seg;
332 local_symbol_set_frag (locsym, frag_now);
333 locsym->lsy_value = frag_now_fix ();
335 else if (!(S_IS_DEFINED (symbolP) || symbol_equated_p (symbolP))
336 || S_IS_COMMON (symbolP))
338 if (S_GET_VALUE (symbolP) == 0)
340 symbolP->sy_frag = frag_now;
342 S_SET_OTHER (symbolP, const_flag);
344 S_SET_VALUE (symbolP, (valueT) frag_now_fix ());
345 S_SET_SEGMENT (symbolP, now_seg);
348 #endif /* if we have one, it better be zero. */
353 /* There are still several cases to check:
355 A .comm/.lcomm symbol being redefined as initialized
358 A .comm/.lcomm symbol being redefined with a larger
361 This only used to be allowed on VMS gas, but Sun cc
362 on the sparc also depends on it. */
364 if (((!S_IS_DEBUG (symbolP)
365 && (!S_IS_DEFINED (symbolP) || S_IS_COMMON (symbolP))
366 && S_IS_EXTERNAL (symbolP))
367 || S_GET_SEGMENT (symbolP) == bss_section)
368 && (now_seg == data_section
369 || now_seg == S_GET_SEGMENT (symbolP)))
371 /* Select which of the 2 cases this is. */
372 if (now_seg != data_section)
374 /* New .comm for prev .comm symbol.
376 If the new size is larger we just change its
377 value. If the new size is smaller, we ignore
379 if (S_GET_VALUE (symbolP)
380 < ((unsigned) frag_now_fix ()))
382 S_SET_VALUE (symbolP, (valueT) frag_now_fix ());
387 /* It is a .comm/.lcomm being converted to initialized
389 symbolP->sy_frag = frag_now;
391 S_SET_OTHER (symbolP, const_flag);
393 S_SET_VALUE (symbolP, (valueT) frag_now_fix ());
394 S_SET_SEGMENT (symbolP, now_seg); /* Keep N_EXT bit. */
399 #if (!defined (OBJ_AOUT) && !defined (OBJ_MAYBE_AOUT) \
400 && !defined (OBJ_BOUT) && !defined (OBJ_MAYBE_BOUT))
401 static const char *od_buf = "";
405 if (OUTPUT_FLAVOR == bfd_target_aout_flavour)
406 sprintf (od_buf, "%d.%d.",
407 S_GET_OTHER (symbolP),
408 S_GET_DESC (symbolP));
410 as_bad (_("symbol `%s' is already defined as \"%s\"/%s%ld"),
412 segment_name (S_GET_SEGMENT (symbolP)),
414 (long) S_GET_VALUE (symbolP));
416 } /* if the undefined symbol has no value */
420 /* Don't blow up if the definition is the same. */
421 if (!(frag_now == symbolP->sy_frag
422 && S_GET_VALUE (symbolP) == frag_now_fix ()
423 && S_GET_SEGMENT (symbolP) == now_seg))
424 as_bad (_("symbol `%s' is already defined"), sym_name);
428 else if (! flag_keep_locals && bfd_is_local_label_name (stdoutput, sym_name))
430 symbolP = (symbolS *) local_symbol_make (sym_name, now_seg,
431 (valueT) frag_now_fix (),
436 symbolP = symbol_new (sym_name, now_seg, (valueT) frag_now_fix (),
439 S_SET_OTHER (symbolP, const_flag);
442 symbol_table_insert (symbolP);
445 if (mri_common_symbol != NULL)
447 /* This symbol is actually being defined within an MRI common
448 section. This requires special handling. */
449 if (LOCAL_SYMBOL_CHECK (symbolP))
450 symbolP = local_symbol_convert ((struct local_symbol *) symbolP);
451 symbolP->sy_value.X_op = O_symbol;
452 symbolP->sy_value.X_add_symbol = mri_common_symbol;
453 symbolP->sy_value.X_add_number = S_GET_VALUE (mri_common_symbol);
454 symbolP->sy_frag = &zero_address_frag;
455 S_SET_SEGMENT (symbolP, expr_section);
456 symbolP->sy_mri_common = 1;
460 tc_frob_label (symbolP);
462 #ifdef obj_frob_label
463 obj_frob_label (symbolP);
469 /* Die if we can't insert the symbol. */
472 symbol_table_insert (symbolS *symbolP)
474 register const char *error_string;
477 know (S_GET_NAME (symbolP));
479 if (LOCAL_SYMBOL_CHECK (symbolP))
481 error_string = hash_jam (local_hash, S_GET_NAME (symbolP),
483 if (error_string != NULL)
484 as_fatal (_("inserting \"%s\" into symbol table failed: %s"),
485 S_GET_NAME (symbolP), error_string);
489 if ((error_string = hash_jam (sy_hash, S_GET_NAME (symbolP), (PTR) symbolP)))
491 as_fatal (_("inserting \"%s\" into symbol table failed: %s"),
492 S_GET_NAME (symbolP), error_string);
496 /* If a symbol name does not exist, create it as undefined, and insert
497 it into the symbol table. Return a pointer to it. */
500 symbol_find_or_make (const char *name)
502 register symbolS *symbolP;
504 symbolP = symbol_find (name);
508 if (! flag_keep_locals && bfd_is_local_label_name (stdoutput, name))
510 symbolP = md_undefined_symbol ((char *) name);
514 symbolP = (symbolS *) local_symbol_make (name, undefined_section,
520 symbolP = symbol_make (name);
522 symbol_table_insert (symbolP);
523 } /* if symbol wasn't found */
529 symbol_make (const char *name)
533 /* Let the machine description default it, e.g. for register names. */
534 symbolP = md_undefined_symbol ((char *) name);
537 symbolP = symbol_new (name, undefined_section, (valueT) 0, &zero_address_frag);
543 symbol_clone (symbolS *orgsymP, int replace)
546 asymbol *bsymorg, *bsymnew;
548 /* Running local_symbol_convert on a clone that's not the one currently
549 in local_hash would incorrectly replace the hash entry. Thus the
550 symbol must be converted here. Note that the rest of the function
551 depends on not encountering an unconverted symbol. */
552 if (LOCAL_SYMBOL_CHECK (orgsymP))
553 orgsymP = local_symbol_convert ((struct local_symbol *) orgsymP);
554 bsymorg = orgsymP->bsym;
556 know (S_IS_DEFINED (orgsymP));
558 newsymP = obstack_alloc (¬es, sizeof (*newsymP));
560 bsymnew = bfd_make_empty_symbol (bfd_asymbol_bfd (bsymorg));
562 as_perror ("%s", "bfd_make_empty_symbol");
563 newsymP->bsym = bsymnew;
564 bsymnew->name = bsymorg->name;
565 bsymnew->flags = bsymorg->flags;
566 bsymnew->section = bsymorg->section;
567 bsymnew->udata.p = (PTR) newsymP;
568 bfd_copy_private_symbol_data (bfd_asymbol_bfd (bsymorg), bsymorg,
569 bfd_asymbol_bfd (bsymnew), bsymnew);
571 #ifdef obj_symbol_clone_hook
572 obj_symbol_clone_hook (newsymP, orgsymP);
575 #ifdef tc_symbol_clone_hook
576 tc_symbol_clone_hook (newsymP, orgsymP);
581 if (symbol_rootP == orgsymP)
582 symbol_rootP = newsymP;
583 else if (orgsymP->sy_previous)
585 orgsymP->sy_previous->sy_next = newsymP;
586 orgsymP->sy_previous = NULL;
588 if (symbol_lastP == orgsymP)
589 symbol_lastP = newsymP;
590 else if (orgsymP->sy_next)
591 orgsymP->sy_next->sy_previous = newsymP;
592 orgsymP->sy_next = NULL;
593 debug_verify_symchain (symbol_rootP, symbol_lastP);
595 symbol_table_insert (newsymP);
601 /* Referenced symbols, if they are forward references, need to be cloned
602 (without replacing the original) so that the value of the referenced
603 symbols at the point of use . */
605 #undef symbol_clone_if_forward_ref
607 symbol_clone_if_forward_ref (symbolS *symbolP, int is_forward)
609 if (symbolP && !LOCAL_SYMBOL_CHECK (symbolP))
611 symbolS *add_symbol = symbolP->sy_value.X_add_symbol;
612 symbolS *op_symbol = symbolP->sy_value.X_op_symbol;
614 if (symbolP->sy_forward_ref)
619 /* assign_symbol() clones volatile symbols; pre-existing expressions
620 hold references to the original instance, but want the current
621 value. Just repeat the lookup. */
622 if (add_symbol && S_IS_VOLATILE (add_symbol))
623 add_symbol = symbol_find_exact (S_GET_NAME (add_symbol));
624 if (op_symbol && S_IS_VOLATILE (op_symbol))
625 op_symbol = symbol_find_exact (S_GET_NAME (op_symbol));
628 /* Re-using sy_resolving here, as this routine cannot get called from
629 symbol resolution code. */
630 if (symbolP->bsym->section == expr_section && !symbolP->sy_resolving)
632 symbolP->sy_resolving = 1;
633 add_symbol = symbol_clone_if_forward_ref (add_symbol, is_forward);
634 op_symbol = symbol_clone_if_forward_ref (op_symbol, is_forward);
635 symbolP->sy_resolving = 0;
638 if (symbolP->sy_forward_ref
639 || add_symbol != symbolP->sy_value.X_add_symbol
640 || op_symbol != symbolP->sy_value.X_op_symbol)
641 symbolP = symbol_clone (symbolP, 0);
643 symbolP->sy_value.X_add_symbol = add_symbol;
644 symbolP->sy_value.X_op_symbol = op_symbol;
651 symbol_temp_new (segT seg, valueT ofs, fragS *frag)
653 return symbol_new (FAKE_LABEL_NAME, seg, ofs, frag);
657 symbol_temp_new_now (void)
659 return symbol_temp_new (now_seg, frag_now_fix (), frag_now);
663 symbol_temp_make (void)
665 return symbol_make (FAKE_LABEL_NAME);
668 /* Implement symbol table lookup.
669 In: A symbol's name as a string: '\0' can't be part of a symbol name.
670 Out: NULL if the name was not in the symbol table, else the address
671 of a struct symbol associated with that name. */
674 symbol_find_exact (const char *name)
676 return symbol_find_exact_noref (name, 0);
680 symbol_find_exact_noref (const char *name, int noref)
682 struct local_symbol *locsym;
685 locsym = (struct local_symbol *) hash_find (local_hash, name);
687 return (symbolS *) locsym;
689 sym = ((symbolS *) hash_find (sy_hash, name));
691 /* Any references to the symbol, except for the reference in
692 .weakref, must clear this flag, such that the symbol does not
693 turn into a weak symbol. Note that we don't have to handle the
694 local_symbol case, since a weakrefd is always promoted out of the
695 local_symbol table when it is turned into a weak symbol. */
697 S_CLEAR_WEAKREFD (sym);
703 symbol_find (const char *name)
705 return symbol_find_noref (name, 0);
709 symbol_find_noref (const char *name, int noref)
711 #ifdef tc_canonicalize_symbol_name
714 size_t len = strlen (name) + 1;
716 copy = (char *) alloca (len);
717 memcpy (copy, name, len);
718 name = tc_canonicalize_symbol_name (copy);
722 if (! symbols_case_sensitive)
729 name = copy = (char *) alloca (strlen (name) + 1);
731 while ((c = *orig++) != '\0')
733 *copy++ = TOUPPER (c);
738 return symbol_find_exact_noref (name, noref);
741 /* Once upon a time, symbols were kept in a singly linked list. At
742 least coff needs to be able to rearrange them from time to time, for
743 which a doubly linked list is much more convenient. Loic did these
744 as macros which seemed dangerous to me so they're now functions.
747 /* Link symbol ADDME after symbol TARGET in the chain. */
750 symbol_append (symbolS *addme, symbolS *target,
751 symbolS **rootPP, symbolS **lastPP)
753 if (LOCAL_SYMBOL_CHECK (addme))
755 if (target != NULL && LOCAL_SYMBOL_CHECK (target))
760 know (*rootPP == NULL);
761 know (*lastPP == NULL);
762 addme->sy_next = NULL;
763 addme->sy_previous = NULL;
767 } /* if the list is empty */
769 if (target->sy_next != NULL)
771 target->sy_next->sy_previous = addme;
775 know (*lastPP == target);
777 } /* if we have a next */
779 addme->sy_next = target->sy_next;
780 target->sy_next = addme;
781 addme->sy_previous = target;
783 debug_verify_symchain (symbol_rootP, symbol_lastP);
786 /* Set the chain pointers of SYMBOL to null. */
789 symbol_clear_list_pointers (symbolS *symbolP)
791 if (LOCAL_SYMBOL_CHECK (symbolP))
793 symbolP->sy_next = NULL;
794 symbolP->sy_previous = NULL;
797 /* Remove SYMBOLP from the list. */
800 symbol_remove (symbolS *symbolP, symbolS **rootPP, symbolS **lastPP)
802 if (LOCAL_SYMBOL_CHECK (symbolP))
805 if (symbolP == *rootPP)
807 *rootPP = symbolP->sy_next;
808 } /* if it was the root */
810 if (symbolP == *lastPP)
812 *lastPP = symbolP->sy_previous;
813 } /* if it was the tail */
815 if (symbolP->sy_next != NULL)
817 symbolP->sy_next->sy_previous = symbolP->sy_previous;
820 if (symbolP->sy_previous != NULL)
822 symbolP->sy_previous->sy_next = symbolP->sy_next;
825 debug_verify_symchain (*rootPP, *lastPP);
828 /* Link symbol ADDME before symbol TARGET in the chain. */
831 symbol_insert (symbolS *addme, symbolS *target,
832 symbolS **rootPP, symbolS **lastPP ATTRIBUTE_UNUSED)
834 if (LOCAL_SYMBOL_CHECK (addme))
836 if (LOCAL_SYMBOL_CHECK (target))
839 if (target->sy_previous != NULL)
841 target->sy_previous->sy_next = addme;
845 know (*rootPP == target);
849 addme->sy_previous = target->sy_previous;
850 target->sy_previous = addme;
851 addme->sy_next = target;
853 debug_verify_symchain (*rootPP, *lastPP);
857 verify_symbol_chain (symbolS *rootP, symbolS *lastP)
859 symbolS *symbolP = rootP;
864 for (; symbol_next (symbolP) != NULL; symbolP = symbol_next (symbolP))
866 assert (symbolP->bsym != NULL);
867 assert (symbolP->sy_next->sy_previous == symbolP);
870 assert (lastP == symbolP);
874 report_op_error (symbolS *symp, symbolS *left, symbolS *right)
878 segT seg_left = S_GET_SEGMENT (left);
879 segT seg_right = right ? S_GET_SEGMENT (right) : 0;
881 if (expr_symbol_where (symp, &file, &line))
883 if (seg_left == undefined_section)
884 as_bad_where (file, line,
885 _("undefined symbol `%s' in operation"),
887 if (seg_right == undefined_section)
888 as_bad_where (file, line,
889 _("undefined symbol `%s' in operation"),
891 if (seg_left != undefined_section
892 && seg_right != undefined_section)
895 as_bad_where (file, line,
896 _("invalid sections for operation on `%s' and `%s'"),
897 S_GET_NAME (left), S_GET_NAME (right));
899 as_bad_where (file, line,
900 _("invalid section for operation on `%s'"),
907 if (seg_left == undefined_section)
908 as_bad (_("undefined symbol `%s' in operation setting `%s'"),
909 S_GET_NAME (left), S_GET_NAME (symp));
910 if (seg_right == undefined_section)
911 as_bad (_("undefined symbol `%s' in operation setting `%s'"),
912 S_GET_NAME (right), S_GET_NAME (symp));
913 if (seg_left != undefined_section
914 && seg_right != undefined_section)
917 as_bad_where (file, line,
918 _("invalid sections for operation on `%s' and `%s' setting `%s'"),
919 S_GET_NAME (left), S_GET_NAME (right), S_GET_NAME (symp));
921 as_bad_where (file, line,
922 _("invalid section for operation on `%s' setting `%s'"),
923 S_GET_NAME (left), S_GET_NAME (symp));
928 /* Resolve the value of a symbol. This is called during the final
929 pass over the symbol table to resolve any symbols with complex
933 resolve_symbol_value (symbolS *symp)
936 valueT final_val = 0;
939 if (LOCAL_SYMBOL_CHECK (symp))
941 struct local_symbol *locsym = (struct local_symbol *) symp;
943 final_val = locsym->lsy_value;
944 if (local_symbol_resolved_p (locsym))
947 final_val += local_symbol_get_frag (locsym)->fr_address / OCTETS_PER_BYTE;
951 locsym->lsy_value = final_val;
952 local_symbol_mark_resolved (locsym);
958 if (symp->sy_resolved)
960 if (symp->sy_value.X_op == O_constant)
961 return (valueT) symp->sy_value.X_add_number;
967 final_seg = S_GET_SEGMENT (symp);
969 if (symp->sy_resolving)
972 as_bad (_("symbol definition loop encountered at `%s'"),
979 symbolS *add_symbol, *op_symbol;
981 segT seg_left, seg_right;
985 symp->sy_resolving = 1;
987 /* Help out with CSE. */
988 add_symbol = symp->sy_value.X_add_symbol;
989 op_symbol = symp->sy_value.X_op_symbol;
990 final_val = symp->sy_value.X_add_number;
991 op = symp->sy_value.X_op;
1004 final_val += symp->sy_frag->fr_address / OCTETS_PER_BYTE;
1005 if (final_seg == expr_section)
1006 final_seg = absolute_section;
1012 left = resolve_symbol_value (add_symbol);
1013 seg_left = S_GET_SEGMENT (add_symbol);
1015 symp->sy_value.X_op_symbol = NULL;
1018 if (S_IS_WEAKREFR (symp))
1020 assert (final_val == 0);
1021 if (S_IS_WEAKREFR (add_symbol))
1023 assert (add_symbol->sy_value.X_op == O_symbol
1024 && add_symbol->sy_value.X_add_number == 0);
1025 add_symbol = add_symbol->sy_value.X_add_symbol;
1026 assert (! S_IS_WEAKREFR (add_symbol));
1027 symp->sy_value.X_add_symbol = add_symbol;
1031 if (symp->sy_mri_common)
1033 /* This is a symbol inside an MRI common section. The
1034 relocation routines are going to handle it specially.
1035 Don't change the value. */
1036 resolved = symbol_resolved_p (add_symbol);
1040 if (finalize_syms && final_val == 0)
1042 if (LOCAL_SYMBOL_CHECK (add_symbol))
1043 add_symbol = local_symbol_convert ((struct local_symbol *)
1045 copy_symbol_attributes (symp, add_symbol);
1048 /* If we have equated this symbol to an undefined or common
1049 symbol, keep X_op set to O_symbol, and don't change
1050 X_add_number. This permits the routine which writes out
1051 relocation to detect this case, and convert the
1052 relocation to be against the symbol to which this symbol
1054 if (! S_IS_DEFINED (add_symbol)
1055 #if defined (OBJ_COFF) && defined (TE_PE)
1056 || S_IS_WEAK (add_symbol)
1058 || S_IS_COMMON (add_symbol))
1062 symp->sy_value.X_op = O_symbol;
1063 symp->sy_value.X_add_symbol = add_symbol;
1064 symp->sy_value.X_add_number = final_val;
1065 /* Use X_op_symbol as a flag. */
1066 symp->sy_value.X_op_symbol = add_symbol;
1067 final_seg = seg_left;
1070 resolved = symbol_resolved_p (add_symbol);
1071 symp->sy_resolving = 0;
1072 goto exit_dont_set_value;
1074 else if (finalize_syms && final_seg == expr_section
1075 && seg_left != expr_section)
1077 /* If the symbol is an expression symbol, do similarly
1078 as for undefined and common syms above. Handles
1079 "sym +/- expr" where "expr" cannot be evaluated
1080 immediately, and we want relocations to be against
1081 "sym", eg. because it is weak. */
1082 symp->sy_value.X_op = O_symbol;
1083 symp->sy_value.X_add_symbol = add_symbol;
1084 symp->sy_value.X_add_number = final_val;
1085 symp->sy_value.X_op_symbol = add_symbol;
1086 final_seg = seg_left;
1087 final_val += symp->sy_frag->fr_address + left;
1088 resolved = symbol_resolved_p (add_symbol);
1089 symp->sy_resolving = 0;
1090 goto exit_dont_set_value;
1094 final_val += symp->sy_frag->fr_address + left;
1095 if (final_seg == expr_section || final_seg == undefined_section)
1096 final_seg = seg_left;
1099 resolved = symbol_resolved_p (add_symbol);
1100 if (S_IS_WEAKREFR (symp))
1101 goto exit_dont_set_value;
1107 left = resolve_symbol_value (add_symbol);
1108 seg_left = S_GET_SEGMENT (add_symbol);
1110 /* By reducing these to the relevant dyadic operator, we get
1111 !S -> S == 0 permitted on anything,
1112 -S -> 0 - S only permitted on absolute
1113 ~S -> S ^ ~0 only permitted on absolute */
1114 if (op != O_logical_not && seg_left != absolute_section
1116 report_op_error (symp, add_symbol, NULL);
1118 if (final_seg == expr_section || final_seg == undefined_section)
1119 final_seg = absolute_section;
1123 else if (op == O_logical_not)
1128 final_val += left + symp->sy_frag->fr_address;
1130 resolved = symbol_resolved_p (add_symbol);
1138 case O_bit_inclusive_or:
1140 case O_bit_exclusive_or:
1152 left = resolve_symbol_value (add_symbol);
1153 right = resolve_symbol_value (op_symbol);
1154 seg_left = S_GET_SEGMENT (add_symbol);
1155 seg_right = S_GET_SEGMENT (op_symbol);
1157 /* Simplify addition or subtraction of a constant by folding the
1158 constant into X_add_number. */
1161 if (seg_right == absolute_section)
1166 else if (seg_left == absolute_section)
1169 add_symbol = op_symbol;
1171 seg_left = seg_right;
1175 else if (op == O_subtract)
1177 if (seg_right == absolute_section)
1185 /* Equality and non-equality tests are permitted on anything.
1186 Subtraction, and other comparison operators are permitted if
1187 both operands are in the same section. Otherwise, both
1188 operands must be absolute. We already handled the case of
1189 addition or subtraction of a constant above. This will
1190 probably need to be changed for an object file format which
1191 supports arbitrary expressions, such as IEEE-695. */
1192 if (!(seg_left == absolute_section
1193 && seg_right == absolute_section)
1194 && !(op == O_eq || op == O_ne)
1195 && !((op == O_subtract
1196 || op == O_lt || op == O_le || op == O_ge || op == O_gt)
1197 && seg_left == seg_right
1198 && (seg_left != undefined_section
1199 || add_symbol == op_symbol)))
1201 /* Don't emit messages unless we're finalizing the symbol value,
1202 otherwise we may get the same message multiple times. */
1204 report_op_error (symp, add_symbol, op_symbol);
1205 /* However do not move the symbol into the absolute section
1206 if it cannot currently be resolved - this would confuse
1207 other parts of the assembler into believing that the
1208 expression had been evaluated to zero. */
1214 && (final_seg == expr_section || final_seg == undefined_section))
1215 final_seg = absolute_section;
1217 /* Check for division by zero. */
1218 if ((op == O_divide || op == O_modulus) && right == 0)
1220 /* If seg_right is not absolute_section, then we've
1221 already issued a warning about using a bad symbol. */
1222 if (seg_right == absolute_section && finalize_syms)
1227 if (expr_symbol_where (symp, &file, &line))
1228 as_bad_where (file, line, _("division by zero"));
1230 as_bad (_("division by zero when setting `%s'"),
1237 switch (symp->sy_value.X_op)
1239 case O_multiply: left *= right; break;
1240 case O_divide: left /= right; break;
1241 case O_modulus: left %= right; break;
1242 case O_left_shift: left <<= right; break;
1243 case O_right_shift: left >>= right; break;
1244 case O_bit_inclusive_or: left |= right; break;
1245 case O_bit_or_not: left |= ~right; break;
1246 case O_bit_exclusive_or: left ^= right; break;
1247 case O_bit_and: left &= right; break;
1248 case O_add: left += right; break;
1249 case O_subtract: left -= right; break;
1252 left = (left == right && seg_left == seg_right
1253 && (seg_left != undefined_section
1254 || add_symbol == op_symbol)
1255 ? ~ (offsetT) 0 : 0);
1256 if (symp->sy_value.X_op == O_ne)
1259 case O_lt: left = left < right ? ~ (offsetT) 0 : 0; break;
1260 case O_le: left = left <= right ? ~ (offsetT) 0 : 0; break;
1261 case O_ge: left = left >= right ? ~ (offsetT) 0 : 0; break;
1262 case O_gt: left = left > right ? ~ (offsetT) 0 : 0; break;
1263 case O_logical_and: left = left && right; break;
1264 case O_logical_or: left = left || right; break;
1268 final_val += symp->sy_frag->fr_address + left;
1269 if (final_seg == expr_section || final_seg == undefined_section)
1271 if (seg_left == undefined_section
1272 || seg_right == undefined_section)
1273 final_seg = undefined_section;
1274 else if (seg_left == absolute_section)
1275 final_seg = seg_right;
1277 final_seg = seg_left;
1279 resolved = (symbol_resolved_p (add_symbol)
1280 && symbol_resolved_p (op_symbol));
1286 /* Give an error (below) if not in expr_section. We don't
1287 want to worry about expr_section symbols, because they
1288 are fictional (they are created as part of expression
1289 resolution), and any problems may not actually mean
1294 symp->sy_resolving = 0;
1298 S_SET_VALUE (symp, final_val);
1300 exit_dont_set_value:
1301 /* Always set the segment, even if not finalizing the value.
1302 The segment is used to determine whether a symbol is defined. */
1303 S_SET_SEGMENT (symp, final_seg);
1305 /* Don't worry if we can't resolve an expr_section symbol. */
1309 symp->sy_resolved = 1;
1310 else if (S_GET_SEGMENT (symp) != expr_section)
1312 as_bad (_("can't resolve value for symbol `%s'"),
1314 symp->sy_resolved = 1;
1321 static void resolve_local_symbol (const char *, PTR);
1323 /* A static function passed to hash_traverse. */
1326 resolve_local_symbol (const char *key ATTRIBUTE_UNUSED, PTR value)
1329 resolve_symbol_value (value);
1332 /* Resolve all local symbols. */
1335 resolve_local_symbol_values (void)
1337 hash_traverse (local_hash, resolve_local_symbol);
1340 /* Obtain the current value of a symbol without changing any
1341 sub-expressions used. */
1344 snapshot_symbol (symbolS *symbolP, valueT *valueP, segT *segP, fragS **fragPP)
1346 if (LOCAL_SYMBOL_CHECK (symbolP))
1348 struct local_symbol *locsym = (struct local_symbol *) symbolP;
1350 *valueP = locsym->lsy_value;
1351 *segP = locsym->lsy_section;
1352 *fragPP = local_symbol_get_frag (locsym);
1356 expressionS expr = symbolP->sy_value;
1358 if (!symbolP->sy_resolved && expr.X_op != O_illegal)
1362 if (symbolP->sy_resolving)
1364 symbolP->sy_resolving = 1;
1365 resolved = resolve_expression (&expr);
1366 symbolP->sy_resolving = 0;
1374 /* This check wouldn't be needed if pseudo_set() didn't set
1375 symbols equated to bare symbols to undefined_section. */
1376 if (symbolP->bsym->section != undefined_section
1377 || symbolP->sy_value.X_op != O_symbol)
1382 symbolP = expr.X_add_symbol;
1389 *valueP = expr.X_add_number;
1390 *segP = symbolP->bsym->section;
1391 *fragPP = symbolP->sy_frag;
1393 if (*segP == expr_section)
1396 case O_constant: *segP = absolute_section; break;
1397 case O_register: *segP = reg_section; break;
1405 /* Dollar labels look like a number followed by a dollar sign. Eg, "42$".
1406 They are *really* local. That is, they go out of scope whenever we see a
1407 label that isn't local. Also, like fb labels, there can be multiple
1408 instances of a dollar label. Therefor, we name encode each instance with
1409 the instance number, keep a list of defined symbols separate from the real
1410 symbol table, and we treat these buggers as a sparse array. */
1412 static long *dollar_labels;
1413 static long *dollar_label_instances;
1414 static char *dollar_label_defines;
1415 static unsigned long dollar_label_count;
1416 static unsigned long dollar_label_max;
1419 dollar_label_defined (long label)
1423 know ((dollar_labels != NULL) || (dollar_label_count == 0));
1425 for (i = dollar_labels; i < dollar_labels + dollar_label_count; ++i)
1427 return dollar_label_defines[i - dollar_labels];
1429 /* If we get here, label isn't defined. */
1434 dollar_label_instance (long label)
1438 know ((dollar_labels != NULL) || (dollar_label_count == 0));
1440 for (i = dollar_labels; i < dollar_labels + dollar_label_count; ++i)
1442 return (dollar_label_instances[i - dollar_labels]);
1444 /* If we get here, we haven't seen the label before.
1445 Therefore its instance count is zero. */
1450 dollar_label_clear (void)
1452 memset (dollar_label_defines, '\0', (unsigned int) dollar_label_count);
1455 #define DOLLAR_LABEL_BUMP_BY 10
1458 define_dollar_label (long label)
1462 for (i = dollar_labels; i < dollar_labels + dollar_label_count; ++i)
1465 ++dollar_label_instances[i - dollar_labels];
1466 dollar_label_defines[i - dollar_labels] = 1;
1470 /* If we get to here, we don't have label listed yet. */
1472 if (dollar_labels == NULL)
1474 dollar_labels = (long *) xmalloc (DOLLAR_LABEL_BUMP_BY * sizeof (long));
1475 dollar_label_instances = (long *) xmalloc (DOLLAR_LABEL_BUMP_BY * sizeof (long));
1476 dollar_label_defines = xmalloc (DOLLAR_LABEL_BUMP_BY);
1477 dollar_label_max = DOLLAR_LABEL_BUMP_BY;
1478 dollar_label_count = 0;
1480 else if (dollar_label_count == dollar_label_max)
1482 dollar_label_max += DOLLAR_LABEL_BUMP_BY;
1483 dollar_labels = (long *) xrealloc ((char *) dollar_labels,
1484 dollar_label_max * sizeof (long));
1485 dollar_label_instances = (long *) xrealloc ((char *) dollar_label_instances,
1486 dollar_label_max * sizeof (long));
1487 dollar_label_defines = xrealloc (dollar_label_defines, dollar_label_max);
1488 } /* if we needed to grow */
1490 dollar_labels[dollar_label_count] = label;
1491 dollar_label_instances[dollar_label_count] = 1;
1492 dollar_label_defines[dollar_label_count] = 1;
1493 ++dollar_label_count;
1496 /* Caller must copy returned name: we re-use the area for the next name.
1498 The mth occurence of label n: is turned into the symbol "Ln^Am"
1499 where n is the label number and m is the instance number. "L" makes
1500 it a label discarded unless debugging and "^A"('\1') ensures no
1501 ordinary symbol SHOULD get the same name as a local label
1502 symbol. The first "4:" is "L4^A1" - the m numbers begin at 1.
1504 fb labels get the same treatment, except that ^B is used in place
1507 char * /* Return local label name. */
1508 dollar_label_name (register long n, /* we just saw "n$:" : n a number. */
1509 register int augend /* 0 for current instance, 1 for new instance. */)
1512 /* Returned to caller, then copied. Used for created names ("4f"). */
1513 static char symbol_name_build[24];
1516 char symbol_name_temporary[20]; /* Build up a number, BACKWARDS. */
1519 know (augend == 0 || augend == 1);
1520 p = symbol_name_build;
1521 #ifdef LOCAL_LABEL_PREFIX
1522 *p++ = LOCAL_LABEL_PREFIX;
1526 /* Next code just does sprintf( {}, "%d", n); */
1528 q = symbol_name_temporary;
1529 for (*q++ = 0, i = n; i; ++q)
1534 while ((*p = *--q) != '\0')
1537 *p++ = DOLLAR_LABEL_CHAR; /* ^A */
1539 /* Instance number. */
1540 q = symbol_name_temporary;
1541 for (*q++ = 0, i = dollar_label_instance (n) + augend; i; ++q)
1546 while ((*p++ = *--q) != '\0');;
1548 /* The label, as a '\0' ended string, starts at symbol_name_build. */
1549 return symbol_name_build;
1552 /* Somebody else's idea of local labels. They are made by "n:" where n
1553 is any decimal digit. Refer to them with
1554 "nb" for previous (backward) n:
1555 or "nf" for next (forward) n:.
1557 We do a little better and let n be any number, not just a single digit, but
1558 since the other guy's assembler only does ten, we treat the first ten
1561 Like someone else's assembler, we have one set of local label counters for
1562 entire assembly, not one set per (sub)segment like in most assemblers. This
1563 implies that one can refer to a label in another segment, and indeed some
1564 crufty compilers have done just that.
1566 Since there could be a LOT of these things, treat them as a sparse
1569 #define FB_LABEL_SPECIAL (10)
1571 static long fb_low_counter[FB_LABEL_SPECIAL];
1572 static long *fb_labels;
1573 static long *fb_label_instances;
1574 static long fb_label_count;
1575 static long fb_label_max;
1577 /* This must be more than FB_LABEL_SPECIAL. */
1578 #define FB_LABEL_BUMP_BY (FB_LABEL_SPECIAL + 6)
1581 fb_label_init (void)
1583 memset ((void *) fb_low_counter, '\0', sizeof (fb_low_counter));
1586 /* Add one to the instance number of this fb label. */
1589 fb_label_instance_inc (long label)
1593 if (label < FB_LABEL_SPECIAL)
1595 ++fb_low_counter[label];
1599 if (fb_labels != NULL)
1601 for (i = fb_labels + FB_LABEL_SPECIAL;
1602 i < fb_labels + fb_label_count; ++i)
1606 ++fb_label_instances[i - fb_labels];
1608 } /* if we find it */
1609 } /* for each existing label */
1612 /* If we get to here, we don't have label listed yet. */
1614 if (fb_labels == NULL)
1616 fb_labels = (long *) xmalloc (FB_LABEL_BUMP_BY * sizeof (long));
1617 fb_label_instances = (long *) xmalloc (FB_LABEL_BUMP_BY * sizeof (long));
1618 fb_label_max = FB_LABEL_BUMP_BY;
1619 fb_label_count = FB_LABEL_SPECIAL;
1622 else if (fb_label_count == fb_label_max)
1624 fb_label_max += FB_LABEL_BUMP_BY;
1625 fb_labels = (long *) xrealloc ((char *) fb_labels,
1626 fb_label_max * sizeof (long));
1627 fb_label_instances = (long *) xrealloc ((char *) fb_label_instances,
1628 fb_label_max * sizeof (long));
1629 } /* if we needed to grow */
1631 fb_labels[fb_label_count] = label;
1632 fb_label_instances[fb_label_count] = 1;
1637 fb_label_instance (long label)
1641 if (label < FB_LABEL_SPECIAL)
1643 return (fb_low_counter[label]);
1646 if (fb_labels != NULL)
1648 for (i = fb_labels + FB_LABEL_SPECIAL;
1649 i < fb_labels + fb_label_count; ++i)
1653 return (fb_label_instances[i - fb_labels]);
1654 } /* if we find it */
1655 } /* for each existing label */
1658 /* We didn't find the label, so this must be a reference to the
1663 /* Caller must copy returned name: we re-use the area for the next name.
1665 The mth occurence of label n: is turned into the symbol "Ln^Bm"
1666 where n is the label number and m is the instance number. "L" makes
1667 it a label discarded unless debugging and "^B"('\2') ensures no
1668 ordinary symbol SHOULD get the same name as a local label
1669 symbol. The first "4:" is "L4^B1" - the m numbers begin at 1.
1671 dollar labels get the same treatment, except that ^A is used in
1674 char * /* Return local label name. */
1675 fb_label_name (long n, /* We just saw "n:", "nf" or "nb" : n a number. */
1676 long augend /* 0 for nb, 1 for n:, nf. */)
1679 /* Returned to caller, then copied. Used for created names ("4f"). */
1680 static char symbol_name_build[24];
1683 char symbol_name_temporary[20]; /* Build up a number, BACKWARDS. */
1687 know ((unsigned long) augend <= 2 /* See mmix_fb_label. */);
1689 know ((unsigned long) augend <= 1);
1691 p = symbol_name_build;
1692 #ifdef LOCAL_LABEL_PREFIX
1693 *p++ = LOCAL_LABEL_PREFIX;
1697 /* Next code just does sprintf( {}, "%d", n); */
1699 q = symbol_name_temporary;
1700 for (*q++ = 0, i = n; i; ++q)
1705 while ((*p = *--q) != '\0')
1708 *p++ = LOCAL_LABEL_CHAR; /* ^B */
1710 /* Instance number. */
1711 q = symbol_name_temporary;
1712 for (*q++ = 0, i = fb_label_instance (n) + augend; i; ++q)
1717 while ((*p++ = *--q) != '\0');;
1719 /* The label, as a '\0' ended string, starts at symbol_name_build. */
1720 return (symbol_name_build);
1723 /* Decode name that may have been generated by foo_label_name() above.
1724 If the name wasn't generated by foo_label_name(), then return it
1725 unaltered. This is used for error messages. */
1728 decode_local_label_name (char *s)
1731 char *symbol_decode;
1733 int instance_number;
1735 const char *message_format;
1738 #ifdef LOCAL_LABEL_PREFIX
1739 if (s[index] == LOCAL_LABEL_PREFIX)
1743 if (s[index] != 'L')
1746 for (label_number = 0, p = s + index + 1; ISDIGIT (*p); ++p)
1747 label_number = (10 * label_number) + *p - '0';
1749 if (*p == DOLLAR_LABEL_CHAR)
1751 else if (*p == LOCAL_LABEL_CHAR)
1756 for (instance_number = 0, p++; ISDIGIT (*p); ++p)
1757 instance_number = (10 * instance_number) + *p - '0';
1759 message_format = _("\"%d\" (instance number %d of a %s label)");
1760 symbol_decode = obstack_alloc (¬es, strlen (message_format) + 30);
1761 sprintf (symbol_decode, message_format, label_number, instance_number, type);
1763 return symbol_decode;
1766 /* Get the value of a symbol. */
1769 S_GET_VALUE (symbolS *s)
1771 if (LOCAL_SYMBOL_CHECK (s))
1772 return resolve_symbol_value (s);
1774 if (!s->sy_resolved)
1776 valueT val = resolve_symbol_value (s);
1780 if (S_IS_WEAKREFR (s))
1781 return S_GET_VALUE (s->sy_value.X_add_symbol);
1783 if (s->sy_value.X_op != O_constant)
1785 static symbolS *recur;
1787 /* FIXME: In non BFD assemblers, S_IS_DEFINED and S_IS_COMMON
1788 may call S_GET_VALUE. We use a static symbol to avoid the
1789 immediate recursion. */
1791 return (valueT) s->sy_value.X_add_number;
1793 if (! s->sy_resolved
1794 || s->sy_value.X_op != O_symbol
1795 || (S_IS_DEFINED (s) && ! S_IS_COMMON (s)))
1796 as_bad (_("attempt to get value of unresolved symbol `%s'"),
1800 return (valueT) s->sy_value.X_add_number;
1803 /* Set the value of a symbol. */
1806 S_SET_VALUE (symbolS *s, valueT val)
1808 if (LOCAL_SYMBOL_CHECK (s))
1810 ((struct local_symbol *) s)->lsy_value = val;
1814 s->sy_value.X_op = O_constant;
1815 s->sy_value.X_add_number = (offsetT) val;
1816 s->sy_value.X_unsigned = 0;
1817 S_CLEAR_WEAKREFR (s);
1821 copy_symbol_attributes (symbolS *dest, symbolS *src)
1823 if (LOCAL_SYMBOL_CHECK (dest))
1824 dest = local_symbol_convert ((struct local_symbol *) dest);
1825 if (LOCAL_SYMBOL_CHECK (src))
1826 src = local_symbol_convert ((struct local_symbol *) src);
1828 /* In an expression, transfer the settings of these flags.
1829 The user can override later, of course. */
1830 #define COPIED_SYMFLAGS (BSF_FUNCTION | BSF_OBJECT)
1831 dest->bsym->flags |= src->bsym->flags & COPIED_SYMFLAGS;
1833 #ifdef OBJ_COPY_SYMBOL_ATTRIBUTES
1834 OBJ_COPY_SYMBOL_ATTRIBUTES (dest, src);
1839 S_IS_FUNCTION (symbolS *s)
1843 if (LOCAL_SYMBOL_CHECK (s))
1846 flags = s->bsym->flags;
1848 return (flags & BSF_FUNCTION) != 0;
1852 S_IS_EXTERNAL (symbolS *s)
1856 if (LOCAL_SYMBOL_CHECK (s))
1859 flags = s->bsym->flags;
1862 if ((flags & BSF_LOCAL) && (flags & BSF_GLOBAL))
1865 return (flags & BSF_GLOBAL) != 0;
1869 S_IS_WEAK (symbolS *s)
1871 if (LOCAL_SYMBOL_CHECK (s))
1873 /* Conceptually, a weakrefr is weak if the referenced symbol is. We
1874 could probably handle a WEAKREFR as always weak though. E.g., if
1875 the referenced symbol has lost its weak status, there's no reason
1876 to keep handling the weakrefr as if it was weak. */
1877 if (S_IS_WEAKREFR (s))
1878 return S_IS_WEAK (s->sy_value.X_add_symbol);
1879 return (s->bsym->flags & BSF_WEAK) != 0;
1883 S_IS_WEAKREFR (symbolS *s)
1885 if (LOCAL_SYMBOL_CHECK (s))
1887 return s->sy_weakrefr != 0;
1891 S_IS_WEAKREFD (symbolS *s)
1893 if (LOCAL_SYMBOL_CHECK (s))
1895 return s->sy_weakrefd != 0;
1899 S_IS_COMMON (symbolS *s)
1901 if (LOCAL_SYMBOL_CHECK (s))
1903 return bfd_is_com_section (s->bsym->section);
1907 S_IS_DEFINED (symbolS *s)
1909 if (LOCAL_SYMBOL_CHECK (s))
1910 return ((struct local_symbol *) s)->lsy_section != undefined_section;
1911 return s->bsym->section != undefined_section;
1915 #ifndef EXTERN_FORCE_RELOC
1916 #define EXTERN_FORCE_RELOC IS_ELF
1919 /* Return true for symbols that should not be reduced to section
1920 symbols or eliminated from expressions, because they may be
1921 overridden by the linker. */
1923 S_FORCE_RELOC (symbolS *s, int strict)
1925 if (LOCAL_SYMBOL_CHECK (s))
1926 return ((struct local_symbol *) s)->lsy_section == undefined_section;
1929 && ((s->bsym->flags & BSF_WEAK) != 0
1930 || (EXTERN_FORCE_RELOC
1931 && (s->bsym->flags & BSF_GLOBAL) != 0)))
1932 || s->bsym->section == undefined_section
1933 || bfd_is_com_section (s->bsym->section));
1937 S_IS_DEBUG (symbolS *s)
1939 if (LOCAL_SYMBOL_CHECK (s))
1941 if (s->bsym->flags & BSF_DEBUGGING)
1947 S_IS_LOCAL (symbolS *s)
1952 if (LOCAL_SYMBOL_CHECK (s))
1955 flags = s->bsym->flags;
1958 if ((flags & BSF_LOCAL) && (flags & BSF_GLOBAL))
1961 if (bfd_get_section (s->bsym) == reg_section)
1964 if (flag_strip_local_absolute
1965 /* Keep BSF_FILE symbols in order to allow debuggers to identify
1966 the source file even when the object file is stripped. */
1967 && (flags & (BSF_GLOBAL | BSF_FILE)) == 0
1968 && bfd_get_section (s->bsym) == absolute_section)
1971 name = S_GET_NAME (s);
1972 return (name != NULL
1974 && (strchr (name, DOLLAR_LABEL_CHAR)
1975 || strchr (name, LOCAL_LABEL_CHAR)
1976 || (! flag_keep_locals
1977 && (bfd_is_local_label (stdoutput, s->bsym)
1980 && name[1] == '?')))));
1984 S_IS_STABD (symbolS *s)
1986 return S_GET_NAME (s) == 0;
1990 S_IS_VOLATILE (const symbolS *s)
1992 if (LOCAL_SYMBOL_CHECK (s))
1994 return s->sy_volatile;
1998 S_IS_FORWARD_REF (const symbolS *s)
2000 if (LOCAL_SYMBOL_CHECK (s))
2002 return s->sy_forward_ref;
2006 S_GET_NAME (symbolS *s)
2008 if (LOCAL_SYMBOL_CHECK (s))
2009 return ((struct local_symbol *) s)->lsy_name;
2010 return s->bsym->name;
2014 S_GET_SEGMENT (symbolS *s)
2016 if (LOCAL_SYMBOL_CHECK (s))
2017 return ((struct local_symbol *) s)->lsy_section;
2018 return s->bsym->section;
2022 S_SET_SEGMENT (symbolS *s, segT seg)
2024 /* Don't reassign section symbols. The direct reason is to prevent seg
2025 faults assigning back to const global symbols such as *ABS*, but it
2026 shouldn't happen anyway. */
2028 if (LOCAL_SYMBOL_CHECK (s))
2030 if (seg == reg_section)
2031 s = local_symbol_convert ((struct local_symbol *) s);
2034 ((struct local_symbol *) s)->lsy_section = seg;
2039 if (s->bsym->flags & BSF_SECTION_SYM)
2041 if (s->bsym->section != seg)
2045 s->bsym->section = seg;
2049 S_SET_EXTERNAL (symbolS *s)
2051 if (LOCAL_SYMBOL_CHECK (s))
2052 s = local_symbol_convert ((struct local_symbol *) s);
2053 if ((s->bsym->flags & BSF_WEAK) != 0)
2055 /* Let .weak override .global. */
2058 if (s->bsym->flags & BSF_SECTION_SYM)
2063 /* Do not reassign section symbols. */
2064 as_where (& file, & line);
2065 as_warn_where (file, line,
2066 _("section symbols are already global"));
2069 s->bsym->flags |= BSF_GLOBAL;
2070 s->bsym->flags &= ~(BSF_LOCAL | BSF_WEAK);
2073 if (! an_external_name && S_GET_NAME(s)[0] != '.')
2074 an_external_name = S_GET_NAME (s);
2079 S_CLEAR_EXTERNAL (symbolS *s)
2081 if (LOCAL_SYMBOL_CHECK (s))
2083 if ((s->bsym->flags & BSF_WEAK) != 0)
2085 /* Let .weak override. */
2088 s->bsym->flags |= BSF_LOCAL;
2089 s->bsym->flags &= ~(BSF_GLOBAL | BSF_WEAK);
2093 S_SET_WEAK (symbolS *s)
2095 if (LOCAL_SYMBOL_CHECK (s))
2096 s = local_symbol_convert ((struct local_symbol *) s);
2097 #ifdef obj_set_weak_hook
2098 obj_set_weak_hook (s);
2100 s->bsym->flags |= BSF_WEAK;
2101 s->bsym->flags &= ~(BSF_GLOBAL | BSF_LOCAL);
2105 S_SET_WEAKREFR (symbolS *s)
2107 if (LOCAL_SYMBOL_CHECK (s))
2108 s = local_symbol_convert ((struct local_symbol *) s);
2110 /* If the alias was already used, make sure we mark the target as
2111 used as well, otherwise it might be dropped from the symbol
2112 table. This may have unintended side effects if the alias is
2113 later redirected to another symbol, such as keeping the unused
2114 previous target in the symbol table. Since it will be weak, it's
2117 symbol_mark_used (s->sy_value.X_add_symbol);
2121 S_CLEAR_WEAKREFR (symbolS *s)
2123 if (LOCAL_SYMBOL_CHECK (s))
2129 S_SET_WEAKREFD (symbolS *s)
2131 if (LOCAL_SYMBOL_CHECK (s))
2132 s = local_symbol_convert ((struct local_symbol *) s);
2138 S_CLEAR_WEAKREFD (symbolS *s)
2140 if (LOCAL_SYMBOL_CHECK (s))
2145 /* If a weakref target symbol is weak, then it was never
2146 referenced directly before, not even in a .global directive,
2147 so decay it to local. If it remains undefined, it will be
2148 later turned into a global, like any other undefined
2150 if (s->bsym->flags & BSF_WEAK)
2152 #ifdef obj_clear_weak_hook
2153 obj_clear_weak_hook (s);
2155 s->bsym->flags &= ~BSF_WEAK;
2156 s->bsym->flags |= BSF_LOCAL;
2162 S_SET_THREAD_LOCAL (symbolS *s)
2164 if (LOCAL_SYMBOL_CHECK (s))
2165 s = local_symbol_convert ((struct local_symbol *) s);
2166 if (bfd_is_com_section (s->bsym->section)
2167 && (s->bsym->flags & BSF_THREAD_LOCAL) != 0)
2169 s->bsym->flags |= BSF_THREAD_LOCAL;
2170 if ((s->bsym->flags & BSF_FUNCTION) != 0)
2171 as_bad (_("Accessing function `%s' as thread-local object"),
2173 else if (! bfd_is_und_section (s->bsym->section)
2174 && (s->bsym->section->flags & SEC_THREAD_LOCAL) == 0)
2175 as_bad (_("Accessing `%s' as thread-local object"),
2180 S_SET_NAME (symbolS *s, const char *name)
2182 if (LOCAL_SYMBOL_CHECK (s))
2184 ((struct local_symbol *) s)->lsy_name = name;
2187 s->bsym->name = name;
2191 S_SET_VOLATILE (symbolS *s)
2193 if (LOCAL_SYMBOL_CHECK (s))
2194 s = local_symbol_convert ((struct local_symbol *) s);
2199 S_SET_FORWARD_REF (symbolS *s)
2201 if (LOCAL_SYMBOL_CHECK (s))
2202 s = local_symbol_convert ((struct local_symbol *) s);
2203 s->sy_forward_ref = 1;
2206 /* Return the previous symbol in a chain. */
2209 symbol_previous (symbolS *s)
2211 if (LOCAL_SYMBOL_CHECK (s))
2213 return s->sy_previous;
2216 /* Return the next symbol in a chain. */
2219 symbol_next (symbolS *s)
2221 if (LOCAL_SYMBOL_CHECK (s))
2226 /* Return a pointer to the value of a symbol as an expression. */
2229 symbol_get_value_expression (symbolS *s)
2231 if (LOCAL_SYMBOL_CHECK (s))
2232 s = local_symbol_convert ((struct local_symbol *) s);
2233 return &s->sy_value;
2236 /* Set the value of a symbol to an expression. */
2239 symbol_set_value_expression (symbolS *s, const expressionS *exp)
2241 if (LOCAL_SYMBOL_CHECK (s))
2242 s = local_symbol_convert ((struct local_symbol *) s);
2244 S_CLEAR_WEAKREFR (s);
2247 /* Return a pointer to the X_add_number component of a symbol. */
2250 symbol_X_add_number (symbolS *s)
2252 if (LOCAL_SYMBOL_CHECK (s))
2253 return (offsetT *) &((struct local_symbol *) s)->lsy_value;
2255 return &s->sy_value.X_add_number;
2258 /* Set the value of SYM to the current position in the current segment. */
2261 symbol_set_value_now (symbolS *sym)
2263 S_SET_SEGMENT (sym, now_seg);
2264 S_SET_VALUE (sym, frag_now_fix ());
2265 symbol_set_frag (sym, frag_now);
2268 /* Set the frag of a symbol. */
2271 symbol_set_frag (symbolS *s, fragS *f)
2273 if (LOCAL_SYMBOL_CHECK (s))
2275 local_symbol_set_frag ((struct local_symbol *) s, f);
2279 S_CLEAR_WEAKREFR (s);
2282 /* Return the frag of a symbol. */
2285 symbol_get_frag (symbolS *s)
2287 if (LOCAL_SYMBOL_CHECK (s))
2288 return local_symbol_get_frag ((struct local_symbol *) s);
2292 /* Mark a symbol as having been used. */
2295 symbol_mark_used (symbolS *s)
2297 if (LOCAL_SYMBOL_CHECK (s))
2300 if (S_IS_WEAKREFR (s))
2301 symbol_mark_used (s->sy_value.X_add_symbol);
2304 /* Clear the mark of whether a symbol has been used. */
2307 symbol_clear_used (symbolS *s)
2309 if (LOCAL_SYMBOL_CHECK (s))
2310 s = local_symbol_convert ((struct local_symbol *) s);
2314 /* Return whether a symbol has been used. */
2317 symbol_used_p (symbolS *s)
2319 if (LOCAL_SYMBOL_CHECK (s))
2324 /* Mark a symbol as having been used in a reloc. */
2327 symbol_mark_used_in_reloc (symbolS *s)
2329 if (LOCAL_SYMBOL_CHECK (s))
2330 s = local_symbol_convert ((struct local_symbol *) s);
2331 s->sy_used_in_reloc = 1;
2334 /* Clear the mark of whether a symbol has been used in a reloc. */
2337 symbol_clear_used_in_reloc (symbolS *s)
2339 if (LOCAL_SYMBOL_CHECK (s))
2341 s->sy_used_in_reloc = 0;
2344 /* Return whether a symbol has been used in a reloc. */
2347 symbol_used_in_reloc_p (symbolS *s)
2349 if (LOCAL_SYMBOL_CHECK (s))
2351 return s->sy_used_in_reloc;
2354 /* Mark a symbol as an MRI common symbol. */
2357 symbol_mark_mri_common (symbolS *s)
2359 if (LOCAL_SYMBOL_CHECK (s))
2360 s = local_symbol_convert ((struct local_symbol *) s);
2361 s->sy_mri_common = 1;
2364 /* Clear the mark of whether a symbol is an MRI common symbol. */
2367 symbol_clear_mri_common (symbolS *s)
2369 if (LOCAL_SYMBOL_CHECK (s))
2371 s->sy_mri_common = 0;
2374 /* Return whether a symbol is an MRI common symbol. */
2377 symbol_mri_common_p (symbolS *s)
2379 if (LOCAL_SYMBOL_CHECK (s))
2381 return s->sy_mri_common;
2384 /* Mark a symbol as having been written. */
2387 symbol_mark_written (symbolS *s)
2389 if (LOCAL_SYMBOL_CHECK (s))
2394 /* Clear the mark of whether a symbol has been written. */
2397 symbol_clear_written (symbolS *s)
2399 if (LOCAL_SYMBOL_CHECK (s))
2404 /* Return whether a symbol has been written. */
2407 symbol_written_p (symbolS *s)
2409 if (LOCAL_SYMBOL_CHECK (s))
2414 /* Mark a symbol has having been resolved. */
2417 symbol_mark_resolved (symbolS *s)
2419 if (LOCAL_SYMBOL_CHECK (s))
2421 local_symbol_mark_resolved ((struct local_symbol *) s);
2427 /* Return whether a symbol has been resolved. */
2430 symbol_resolved_p (symbolS *s)
2432 if (LOCAL_SYMBOL_CHECK (s))
2433 return local_symbol_resolved_p ((struct local_symbol *) s);
2434 return s->sy_resolved;
2437 /* Return whether a symbol is a section symbol. */
2440 symbol_section_p (symbolS *s ATTRIBUTE_UNUSED)
2442 if (LOCAL_SYMBOL_CHECK (s))
2444 return (s->bsym->flags & BSF_SECTION_SYM) != 0;
2447 /* Return whether a symbol is equated to another symbol. */
2450 symbol_equated_p (symbolS *s)
2452 if (LOCAL_SYMBOL_CHECK (s))
2454 return s->sy_value.X_op == O_symbol;
2457 /* Return whether a symbol is equated to another symbol, and should be
2458 treated specially when writing out relocs. */
2461 symbol_equated_reloc_p (symbolS *s)
2463 if (LOCAL_SYMBOL_CHECK (s))
2465 /* X_op_symbol, normally not used for O_symbol, is set by
2466 resolve_symbol_value to flag expression syms that have been
2468 return (s->sy_value.X_op == O_symbol
2469 #if defined (OBJ_COFF) && defined (TE_PE)
2472 && ((s->sy_resolved && s->sy_value.X_op_symbol != NULL)
2473 || ! S_IS_DEFINED (s)
2474 || S_IS_COMMON (s)));
2477 /* Return whether a symbol has a constant value. */
2480 symbol_constant_p (symbolS *s)
2482 if (LOCAL_SYMBOL_CHECK (s))
2484 return s->sy_value.X_op == O_constant;
2487 /* Return the BFD symbol for a symbol. */
2490 symbol_get_bfdsym (symbolS *s)
2492 if (LOCAL_SYMBOL_CHECK (s))
2493 s = local_symbol_convert ((struct local_symbol *) s);
2497 /* Set the BFD symbol for a symbol. */
2500 symbol_set_bfdsym (symbolS *s, asymbol *bsym)
2502 if (LOCAL_SYMBOL_CHECK (s))
2503 s = local_symbol_convert ((struct local_symbol *) s);
2504 /* Usually, it is harmless to reset a symbol to a BFD section
2505 symbol. For example, obj_elf_change_section sets the BFD symbol
2506 of an old symbol with the newly created section symbol. But when
2507 we have multiple sections with the same name, the newly created
2508 section may have the same name as an old section. We check if the
2509 old symbol has been already marked as a section symbol before
2511 if ((s->bsym->flags & BSF_SECTION_SYM) == 0)
2513 /* else XXX - What do we do now ? */
2516 #ifdef OBJ_SYMFIELD_TYPE
2518 /* Get a pointer to the object format information for a symbol. */
2521 symbol_get_obj (symbolS *s)
2523 if (LOCAL_SYMBOL_CHECK (s))
2524 s = local_symbol_convert ((struct local_symbol *) s);
2528 /* Set the object format information for a symbol. */
2531 symbol_set_obj (symbolS *s, OBJ_SYMFIELD_TYPE *o)
2533 if (LOCAL_SYMBOL_CHECK (s))
2534 s = local_symbol_convert ((struct local_symbol *) s);
2538 #endif /* OBJ_SYMFIELD_TYPE */
2540 #ifdef TC_SYMFIELD_TYPE
2542 /* Get a pointer to the processor information for a symbol. */
2545 symbol_get_tc (symbolS *s)
2547 if (LOCAL_SYMBOL_CHECK (s))
2548 s = local_symbol_convert ((struct local_symbol *) s);
2552 /* Set the processor information for a symbol. */
2555 symbol_set_tc (symbolS *s, TC_SYMFIELD_TYPE *o)
2557 if (LOCAL_SYMBOL_CHECK (s))
2558 s = local_symbol_convert ((struct local_symbol *) s);
2562 #endif /* TC_SYMFIELD_TYPE */
2567 symbol_lastP = NULL;
2568 symbol_rootP = NULL; /* In case we have 0 symbols (!!) */
2569 sy_hash = hash_new ();
2570 local_hash = hash_new ();
2572 memset ((char *) (&abs_symbol), '\0', sizeof (abs_symbol));
2573 #if defined (EMIT_SECTION_SYMBOLS) || !defined (RELOC_REQUIRES_SYMBOL)
2574 abs_symbol.bsym = bfd_abs_section.symbol;
2576 abs_symbol.sy_value.X_op = O_constant;
2577 abs_symbol.sy_frag = &zero_address_frag;
2579 if (LOCAL_LABELS_FB)
2585 /* Maximum indent level.
2586 Available for modification inside a gdb session. */
2587 static int max_indent_level = 8;
2590 print_symbol_value_1 (FILE *file, symbolS *sym)
2592 const char *name = S_GET_NAME (sym);
2593 if (!name || !name[0])
2595 fprintf (file, "sym %lx %s", (unsigned long) sym, name);
2597 if (LOCAL_SYMBOL_CHECK (sym))
2599 struct local_symbol *locsym = (struct local_symbol *) sym;
2600 if (local_symbol_get_frag (locsym) != &zero_address_frag
2601 && local_symbol_get_frag (locsym) != NULL)
2602 fprintf (file, " frag %lx", (long) local_symbol_get_frag (locsym));
2603 if (local_symbol_resolved_p (locsym))
2604 fprintf (file, " resolved");
2605 fprintf (file, " local");
2609 if (sym->sy_frag != &zero_address_frag)
2610 fprintf (file, " frag %lx", (long) sym->sy_frag);
2612 fprintf (file, " written");
2613 if (sym->sy_resolved)
2614 fprintf (file, " resolved");
2615 else if (sym->sy_resolving)
2616 fprintf (file, " resolving");
2617 if (sym->sy_used_in_reloc)
2618 fprintf (file, " used-in-reloc");
2620 fprintf (file, " used");
2621 if (S_IS_LOCAL (sym))
2622 fprintf (file, " local");
2623 if (S_IS_EXTERNAL (sym))
2624 fprintf (file, " extern");
2625 if (S_IS_WEAK (sym))
2626 fprintf (file, " weak");
2627 if (S_IS_DEBUG (sym))
2628 fprintf (file, " debug");
2629 if (S_IS_DEFINED (sym))
2630 fprintf (file, " defined");
2632 if (S_IS_WEAKREFR (sym))
2633 fprintf (file, " weakrefr");
2634 if (S_IS_WEAKREFD (sym))
2635 fprintf (file, " weakrefd");
2636 fprintf (file, " %s", segment_name (S_GET_SEGMENT (sym)));
2637 if (symbol_resolved_p (sym))
2639 segT s = S_GET_SEGMENT (sym);
2641 if (s != undefined_section
2642 && s != expr_section)
2643 fprintf (file, " %lx", (long) S_GET_VALUE (sym));
2645 else if (indent_level < max_indent_level
2646 && S_GET_SEGMENT (sym) != undefined_section)
2649 fprintf (file, "\n%*s<", indent_level * 4, "");
2650 if (LOCAL_SYMBOL_CHECK (sym))
2651 fprintf (file, "constant %lx",
2652 (long) ((struct local_symbol *) sym)->lsy_value);
2654 print_expr_1 (file, &sym->sy_value);
2655 fprintf (file, ">");
2662 print_symbol_value (symbolS *sym)
2665 print_symbol_value_1 (stderr, sym);
2666 fprintf (stderr, "\n");
2670 print_binary (FILE *file, const char *name, expressionS *exp)
2673 fprintf (file, "%s\n%*s<", name, indent_level * 4, "");
2674 print_symbol_value_1 (file, exp->X_add_symbol);
2675 fprintf (file, ">\n%*s<", indent_level * 4, "");
2676 print_symbol_value_1 (file, exp->X_op_symbol);
2677 fprintf (file, ">");
2682 print_expr_1 (FILE *file, expressionS *exp)
2684 fprintf (file, "expr %lx ", (long) exp);
2688 fprintf (file, "illegal");
2691 fprintf (file, "absent");
2694 fprintf (file, "constant %lx", (long) exp->X_add_number);
2698 fprintf (file, "symbol\n%*s<", indent_level * 4, "");
2699 print_symbol_value_1 (file, exp->X_add_symbol);
2700 fprintf (file, ">");
2702 if (exp->X_add_number)
2703 fprintf (file, "\n%*s%lx", indent_level * 4, "",
2704 (long) exp->X_add_number);
2708 fprintf (file, "register #%d", (int) exp->X_add_number);
2711 fprintf (file, "big");
2714 fprintf (file, "uminus -<");
2716 print_symbol_value_1 (file, exp->X_add_symbol);
2717 fprintf (file, ">");
2718 goto maybe_print_addnum;
2720 fprintf (file, "bit_not");
2723 print_binary (file, "multiply", exp);
2726 print_binary (file, "divide", exp);
2729 print_binary (file, "modulus", exp);
2732 print_binary (file, "lshift", exp);
2735 print_binary (file, "rshift", exp);
2737 case O_bit_inclusive_or:
2738 print_binary (file, "bit_ior", exp);
2740 case O_bit_exclusive_or:
2741 print_binary (file, "bit_xor", exp);
2744 print_binary (file, "bit_and", exp);
2747 print_binary (file, "eq", exp);
2750 print_binary (file, "ne", exp);
2753 print_binary (file, "lt", exp);
2756 print_binary (file, "le", exp);
2759 print_binary (file, "ge", exp);
2762 print_binary (file, "gt", exp);
2765 print_binary (file, "logical_and", exp);
2768 print_binary (file, "logical_or", exp);
2772 fprintf (file, "add\n%*s<", indent_level * 4, "");
2773 print_symbol_value_1 (file, exp->X_add_symbol);
2774 fprintf (file, ">\n%*s<", indent_level * 4, "");
2775 print_symbol_value_1 (file, exp->X_op_symbol);
2776 fprintf (file, ">");
2777 goto maybe_print_addnum;
2780 fprintf (file, "subtract\n%*s<", indent_level * 4, "");
2781 print_symbol_value_1 (file, exp->X_add_symbol);
2782 fprintf (file, ">\n%*s<", indent_level * 4, "");
2783 print_symbol_value_1 (file, exp->X_op_symbol);
2784 fprintf (file, ">");
2785 goto maybe_print_addnum;
2787 fprintf (file, "{unknown opcode %d}", (int) exp->X_op);
2794 print_expr (expressionS *exp)
2796 print_expr_1 (stderr, exp);
2797 fprintf (stderr, "\n");
2801 symbol_print_statistics (FILE *file)
2803 hash_print_statistics (file, "symbol table", sy_hash);
2804 hash_print_statistics (file, "mini local symbol table", local_hash);
2805 fprintf (file, "%lu mini local symbols created, %lu converted\n",
2806 local_symbol_count, local_symbol_conversion_count);