1 /* symbols.c -symbol table-
2 Copyright 1987, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
3 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
4 2011 Free Software Foundation, Inc.
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 3, 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. */
26 #include "safe-ctype.h"
27 #include "obstack.h" /* For "symbols.h" */
29 #include "struc-symbol.h"
31 /* This is non-zero if symbols are case sensitive, which is the
33 int symbols_case_sensitive = 1;
35 #ifndef WORKING_DOT_WORD
36 extern int new_broken_words;
39 /* symbol-name => struct symbol pointer */
40 static struct hash_control *sy_hash;
42 /* Table of local symbols. */
43 static struct hash_control *local_hash;
45 /* Below are commented in "symbols.h". */
46 symbolS *symbol_rootP;
47 symbolS *symbol_lastP;
52 #define debug_verify_symchain verify_symbol_chain
54 #define debug_verify_symchain(root, last) ((void) 0)
57 #define DOLLAR_LABEL_CHAR '\001'
58 #define LOCAL_LABEL_CHAR '\002'
60 #ifndef TC_LABEL_IS_LOCAL
61 #define TC_LABEL_IS_LOCAL(name) 0
66 /* The name of an external symbol which is
67 used to make weak PE symbol names unique. */
68 const char * an_external_name;
71 static char *save_symbol_name (const char *);
72 static void fb_label_init (void);
73 static long dollar_label_instance (long);
74 static long fb_label_instance (long);
76 static void print_binary (FILE *, const char *, expressionS *);
78 /* Return a pointer to a new symbol. Die if we can't make a new
79 symbol. Fill in the symbol's values. Add symbol to end of symbol
82 This function should be called in the general case of creating a
83 symbol. However, if the output file symbol table has already been
84 set, and you are certain that this symbol won't be wanted in the
85 output file, you can call symbol_create. */
88 symbol_new (const char *name, segT segment, valueT valu, fragS *frag)
90 symbolS *symbolP = symbol_create (name, segment, valu, frag);
92 /* Link to end of symbol chain. */
94 extern int symbol_table_frozen;
95 if (symbol_table_frozen)
98 symbol_append (symbolP, symbol_lastP, &symbol_rootP, &symbol_lastP);
103 /* Save a symbol name on a permanent obstack, and convert it according
104 to the object file format. */
107 save_symbol_name (const char *name)
109 unsigned int name_length;
112 name_length = strlen (name) + 1; /* +1 for \0. */
113 obstack_grow (¬es, name, name_length);
114 ret = (char *) obstack_finish (¬es);
116 #ifdef tc_canonicalize_symbol_name
117 ret = tc_canonicalize_symbol_name (ret);
120 if (! symbols_case_sensitive)
124 for (s = ret; *s != '\0'; s++)
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;
140 preserved_copy_of_name = save_symbol_name (name);
142 symbolP = (symbolS *) obstack_alloc (¬es, sizeof (symbolS));
144 /* symbol must be born in some fixed state. This seems as good as any. */
145 memset (symbolP, 0, sizeof (symbolS));
147 symbolP->bsym = bfd_make_empty_symbol (stdoutput);
148 if (symbolP->bsym == NULL)
149 as_fatal ("bfd_make_empty_symbol: %s", bfd_errmsg (bfd_get_error ()));
150 S_SET_NAME (symbolP, preserved_copy_of_name);
152 S_SET_SEGMENT (symbolP, segment);
153 S_SET_VALUE (symbolP, valu);
154 symbol_clear_list_pointers (symbolP);
156 symbolP->sy_frag = frag;
158 obj_symbol_new_hook (symbolP);
160 #ifdef tc_symbol_new_hook
161 tc_symbol_new_hook (symbolP);
168 /* Local symbol support. If we can get away with it, we keep only a
169 small amount of information for local symbols. */
171 static symbolS *local_symbol_convert (struct local_symbol *);
173 /* Used for statistics. */
175 static unsigned long local_symbol_count;
176 static unsigned long local_symbol_conversion_count;
178 /* This macro is called with a symbol argument passed by reference.
179 It returns whether this is a local symbol. If necessary, it
180 changes its argument to the real symbol. */
182 #define LOCAL_SYMBOL_CHECK(s) \
183 (s->sy_flags.sy_local_symbol \
184 ? (local_symbol_converted_p ((struct local_symbol *) s) \
185 ? (s = local_symbol_get_real_symbol ((struct local_symbol *) s), \
190 /* Create a local symbol and insert it into the local hash table. */
192 struct local_symbol *
193 local_symbol_make (const char *name, segT section, valueT val, fragS *frag)
196 struct local_symbol *ret;
198 ++local_symbol_count;
200 name_copy = save_symbol_name (name);
202 ret = (struct local_symbol *) obstack_alloc (¬es, sizeof *ret);
203 ret->lsy_flags.sy_local_symbol = 1;
204 ret->lsy_flags.sy_resolved = 0;
205 ret->lsy_name = name_copy;
206 ret->lsy_section = section;
207 local_symbol_set_frag (ret, frag);
208 ret->lsy_value = val;
210 hash_jam (local_hash, name_copy, (void *) ret);
215 /* Convert a local symbol into a real symbol. Note that we do not
216 reclaim the space used by the local symbol. */
219 local_symbol_convert (struct local_symbol *locsym)
223 gas_assert (locsym->lsy_flags.sy_local_symbol);
224 if (local_symbol_converted_p (locsym))
225 return local_symbol_get_real_symbol (locsym);
227 ++local_symbol_conversion_count;
229 ret = symbol_new (locsym->lsy_name, locsym->lsy_section, locsym->lsy_value,
230 local_symbol_get_frag (locsym));
232 if (local_symbol_resolved_p (locsym))
233 ret->sy_flags.sy_resolved = 1;
235 /* Local symbols are always either defined or used. */
236 ret->sy_flags.sy_used = 1;
238 #ifdef TC_LOCAL_SYMFIELD_CONVERT
239 TC_LOCAL_SYMFIELD_CONVERT (locsym, ret);
242 symbol_table_insert (ret);
244 local_symbol_mark_converted (locsym);
245 local_symbol_set_real_symbol (locsym, ret);
247 hash_jam (local_hash, locsym->lsy_name, NULL);
253 define_sym_at_dot (symbolS *symbolP)
255 symbolP->sy_frag = frag_now;
256 S_SET_VALUE (symbolP, (valueT) frag_now_fix ());
257 S_SET_SEGMENT (symbolP, now_seg);
260 /* We have just seen "<name>:".
261 Creates a struct symbol unless it already exists.
263 Gripes if we are redefining a symbol incompatibly (and ignores it). */
266 colon (/* Just seen "x:" - rattle symbols & frags. */
267 const char *sym_name /* Symbol name, as a cannonical string. */
268 /* We copy this string: OK to alter later. */)
270 register symbolS *symbolP; /* Symbol we are working with. */
272 /* Sun local labels go out of scope whenever a non-local symbol is
274 if (LOCAL_LABELS_DOLLAR
275 && !bfd_is_local_label_name (stdoutput, sym_name))
276 dollar_label_clear ();
278 #ifndef WORKING_DOT_WORD
279 if (new_broken_words)
281 struct broken_word *a;
286 if (now_seg == absolute_section)
288 as_bad (_("cannot define symbol `%s' in absolute section"), sym_name);
292 possible_bytes = (md_short_jump_size
293 + new_broken_words * md_long_jump_size);
296 frag_opcode = frag_var (rs_broken_word,
300 (symbolS *) broken_words,
304 /* We want to store the pointer to where to insert the jump
305 table in the fr_opcode of the rs_broken_word frag. This
306 requires a little hackery. */
308 && (frag_tmp->fr_type != rs_broken_word
309 || frag_tmp->fr_opcode))
310 frag_tmp = frag_tmp->fr_next;
312 frag_tmp->fr_opcode = frag_opcode;
313 new_broken_words = 0;
315 for (a = broken_words; a && a->dispfrag == 0; a = a->next_broken_word)
316 a->dispfrag = frag_tmp;
318 #endif /* WORKING_DOT_WORD */
320 if ((symbolP = symbol_find (sym_name)) != 0)
322 S_CLEAR_WEAKREFR (symbolP);
323 #ifdef RESOLVE_SYMBOL_REDEFINITION
324 if (RESOLVE_SYMBOL_REDEFINITION (symbolP))
327 /* Now check for undefined symbols. */
328 if (LOCAL_SYMBOL_CHECK (symbolP))
330 struct local_symbol *locsym = (struct local_symbol *) symbolP;
332 if (locsym->lsy_section != undefined_section
333 && (local_symbol_get_frag (locsym) != frag_now
334 || locsym->lsy_section != now_seg
335 || locsym->lsy_value != frag_now_fix ()))
337 as_bad (_("symbol `%s' is already defined"), sym_name);
341 locsym->lsy_section = now_seg;
342 local_symbol_set_frag (locsym, frag_now);
343 locsym->lsy_value = frag_now_fix ();
345 else if (!(S_IS_DEFINED (symbolP) || symbol_equated_p (symbolP))
346 || S_IS_COMMON (symbolP)
347 || S_IS_VOLATILE (symbolP))
349 if (S_IS_VOLATILE (symbolP))
351 symbolP = symbol_clone (symbolP, 1);
352 S_SET_VALUE (symbolP, 0);
353 S_CLEAR_VOLATILE (symbolP);
355 if (S_GET_VALUE (symbolP) == 0)
357 define_sym_at_dot (symbolP);
360 #endif /* if we have one, it better be zero. */
365 /* There are still several cases to check:
367 A .comm/.lcomm symbol being redefined as initialized
370 A .comm/.lcomm symbol being redefined with a larger
373 This only used to be allowed on VMS gas, but Sun cc
374 on the sparc also depends on it. */
376 if (((!S_IS_DEBUG (symbolP)
377 && (!S_IS_DEFINED (symbolP) || S_IS_COMMON (symbolP))
378 && S_IS_EXTERNAL (symbolP))
379 || S_GET_SEGMENT (symbolP) == bss_section)
380 && (now_seg == data_section
381 || now_seg == bss_section
382 || now_seg == S_GET_SEGMENT (symbolP)))
384 /* Select which of the 2 cases this is. */
385 if (now_seg != data_section)
387 /* New .comm for prev .comm symbol.
389 If the new size is larger we just change its
390 value. If the new size is smaller, we ignore
392 if (S_GET_VALUE (symbolP)
393 < ((unsigned) frag_now_fix ()))
395 S_SET_VALUE (symbolP, (valueT) frag_now_fix ());
400 /* It is a .comm/.lcomm being converted to initialized
402 define_sym_at_dot (symbolP);
407 #if (!defined (OBJ_AOUT) && !defined (OBJ_MAYBE_AOUT) \
408 && !defined (OBJ_BOUT) && !defined (OBJ_MAYBE_BOUT))
409 static const char *od_buf = "";
413 if (OUTPUT_FLAVOR == bfd_target_aout_flavour)
414 sprintf (od_buf, "%d.%d.",
415 S_GET_OTHER (symbolP),
416 S_GET_DESC (symbolP));
418 as_bad (_("symbol `%s' is already defined as \"%s\"/%s%ld"),
420 segment_name (S_GET_SEGMENT (symbolP)),
422 (long) S_GET_VALUE (symbolP));
424 } /* if the undefined symbol has no value */
428 /* Don't blow up if the definition is the same. */
429 if (!(frag_now == symbolP->sy_frag
430 && S_GET_VALUE (symbolP) == frag_now_fix ()
431 && S_GET_SEGMENT (symbolP) == now_seg))
433 as_bad (_("symbol `%s' is already defined"), sym_name);
434 symbolP = symbol_clone (symbolP, 0);
435 define_sym_at_dot (symbolP);
440 else if (! flag_keep_locals && bfd_is_local_label_name (stdoutput, sym_name))
442 symbolP = (symbolS *) local_symbol_make (sym_name, now_seg,
443 (valueT) frag_now_fix (),
448 symbolP = symbol_new (sym_name, now_seg, (valueT) frag_now_fix (),
451 symbol_table_insert (symbolP);
454 if (mri_common_symbol != NULL)
456 /* This symbol is actually being defined within an MRI common
457 section. This requires special handling. */
458 if (LOCAL_SYMBOL_CHECK (symbolP))
459 symbolP = local_symbol_convert ((struct local_symbol *) symbolP);
460 symbolP->sy_value.X_op = O_symbol;
461 symbolP->sy_value.X_add_symbol = mri_common_symbol;
462 symbolP->sy_value.X_add_number = S_GET_VALUE (mri_common_symbol);
463 symbolP->sy_frag = &zero_address_frag;
464 S_SET_SEGMENT (symbolP, expr_section);
465 symbolP->sy_flags.sy_mri_common = 1;
469 tc_frob_label (symbolP);
471 #ifdef obj_frob_label
472 obj_frob_label (symbolP);
478 /* Die if we can't insert the symbol. */
481 symbol_table_insert (symbolS *symbolP)
483 register const char *error_string;
486 know (S_GET_NAME (symbolP));
488 if (LOCAL_SYMBOL_CHECK (symbolP))
490 error_string = hash_jam (local_hash, S_GET_NAME (symbolP),
492 if (error_string != NULL)
493 as_fatal (_("inserting \"%s\" into symbol table failed: %s"),
494 S_GET_NAME (symbolP), error_string);
498 if ((error_string = hash_jam (sy_hash, S_GET_NAME (symbolP), (void *) symbolP)))
500 as_fatal (_("inserting \"%s\" into symbol table failed: %s"),
501 S_GET_NAME (symbolP), error_string);
505 /* If a symbol name does not exist, create it as undefined, and insert
506 it into the symbol table. Return a pointer to it. */
509 symbol_find_or_make (const char *name)
511 register symbolS *symbolP;
513 symbolP = symbol_find (name);
517 if (! flag_keep_locals && bfd_is_local_label_name (stdoutput, name))
519 symbolP = md_undefined_symbol ((char *) name);
523 symbolP = (symbolS *) local_symbol_make (name, undefined_section,
529 symbolP = symbol_make (name);
531 symbol_table_insert (symbolP);
532 } /* if symbol wasn't found */
538 symbol_make (const char *name)
542 /* Let the machine description default it, e.g. for register names. */
543 symbolP = md_undefined_symbol ((char *) name);
546 symbolP = symbol_new (name, undefined_section, (valueT) 0, &zero_address_frag);
552 symbol_clone (symbolS *orgsymP, int replace)
555 asymbol *bsymorg, *bsymnew;
557 /* Make sure we never clone the dot special symbol. */
558 gas_assert (orgsymP != &dot_symbol);
560 /* Running local_symbol_convert on a clone that's not the one currently
561 in local_hash would incorrectly replace the hash entry. Thus the
562 symbol must be converted here. Note that the rest of the function
563 depends on not encountering an unconverted symbol. */
564 if (LOCAL_SYMBOL_CHECK (orgsymP))
565 orgsymP = local_symbol_convert ((struct local_symbol *) orgsymP);
566 bsymorg = orgsymP->bsym;
568 newsymP = (symbolS *) obstack_alloc (¬es, sizeof (*newsymP));
570 bsymnew = bfd_make_empty_symbol (bfd_asymbol_bfd (bsymorg));
572 as_fatal ("bfd_make_empty_symbol: %s", bfd_errmsg (bfd_get_error ()));
573 newsymP->bsym = bsymnew;
574 bsymnew->name = bsymorg->name;
575 bsymnew->flags = bsymorg->flags & ~BSF_SECTION_SYM;
576 bsymnew->section = bsymorg->section;
577 bfd_copy_private_symbol_data (bfd_asymbol_bfd (bsymorg), bsymorg,
578 bfd_asymbol_bfd (bsymnew), bsymnew);
580 #ifdef obj_symbol_clone_hook
581 obj_symbol_clone_hook (newsymP, orgsymP);
584 #ifdef tc_symbol_clone_hook
585 tc_symbol_clone_hook (newsymP, orgsymP);
590 if (symbol_rootP == orgsymP)
591 symbol_rootP = newsymP;
592 else if (orgsymP->sy_previous)
594 orgsymP->sy_previous->sy_next = newsymP;
595 orgsymP->sy_previous = NULL;
597 if (symbol_lastP == orgsymP)
598 symbol_lastP = newsymP;
599 else if (orgsymP->sy_next)
600 orgsymP->sy_next->sy_previous = newsymP;
602 /* Symbols that won't be output can't be external. */
603 S_CLEAR_EXTERNAL (orgsymP);
604 orgsymP->sy_previous = orgsymP->sy_next = orgsymP;
605 debug_verify_symchain (symbol_rootP, symbol_lastP);
607 symbol_table_insert (newsymP);
611 /* Symbols that won't be output can't be external. */
612 S_CLEAR_EXTERNAL (newsymP);
613 newsymP->sy_previous = newsymP->sy_next = newsymP;
619 /* Referenced symbols, if they are forward references, need to be cloned
620 (without replacing the original) so that the value of the referenced
621 symbols at the point of use . */
623 #undef symbol_clone_if_forward_ref
625 symbol_clone_if_forward_ref (symbolS *symbolP, int is_forward)
627 if (symbolP && !LOCAL_SYMBOL_CHECK (symbolP))
629 symbolS *add_symbol = symbolP->sy_value.X_add_symbol;
630 symbolS *op_symbol = symbolP->sy_value.X_op_symbol;
632 if (symbolP->sy_flags.sy_forward_ref)
637 /* assign_symbol() clones volatile symbols; pre-existing expressions
638 hold references to the original instance, but want the current
639 value. Just repeat the lookup. */
640 if (add_symbol && S_IS_VOLATILE (add_symbol))
641 add_symbol = symbol_find_exact (S_GET_NAME (add_symbol));
642 if (op_symbol && S_IS_VOLATILE (op_symbol))
643 op_symbol = symbol_find_exact (S_GET_NAME (op_symbol));
646 /* Re-using sy_resolving here, as this routine cannot get called from
647 symbol resolution code. */
648 if ((symbolP->bsym->section == expr_section
649 || symbolP->sy_flags.sy_forward_ref)
650 && !symbolP->sy_flags.sy_resolving)
652 symbolP->sy_flags.sy_resolving = 1;
653 add_symbol = symbol_clone_if_forward_ref (add_symbol, is_forward);
654 op_symbol = symbol_clone_if_forward_ref (op_symbol, is_forward);
655 symbolP->sy_flags.sy_resolving = 0;
658 if (symbolP->sy_flags.sy_forward_ref
659 || add_symbol != symbolP->sy_value.X_add_symbol
660 || op_symbol != symbolP->sy_value.X_op_symbol)
662 if (symbolP != &dot_symbol)
664 symbolP = symbol_clone (symbolP, 0);
665 symbolP->sy_flags.sy_resolving = 0;
669 symbolP = symbol_temp_new_now ();
670 #ifdef tc_new_dot_label
671 tc_new_dot_label (symbolP);
676 symbolP->sy_value.X_add_symbol = add_symbol;
677 symbolP->sy_value.X_op_symbol = op_symbol;
684 symbol_temp_new (segT seg, valueT ofs, fragS *frag)
686 return symbol_new (FAKE_LABEL_NAME, seg, ofs, frag);
690 symbol_temp_new_now (void)
692 return symbol_temp_new (now_seg, frag_now_fix (), frag_now);
696 symbol_temp_make (void)
698 return symbol_make (FAKE_LABEL_NAME);
701 /* Implement symbol table lookup.
702 In: A symbol's name as a string: '\0' can't be part of a symbol name.
703 Out: NULL if the name was not in the symbol table, else the address
704 of a struct symbol associated with that name. */
707 symbol_find_exact (const char *name)
709 return symbol_find_exact_noref (name, 0);
713 symbol_find_exact_noref (const char *name, int noref)
715 struct local_symbol *locsym;
718 locsym = (struct local_symbol *) hash_find (local_hash, name);
720 return (symbolS *) locsym;
722 sym = ((symbolS *) hash_find (sy_hash, name));
724 /* Any references to the symbol, except for the reference in
725 .weakref, must clear this flag, such that the symbol does not
726 turn into a weak symbol. Note that we don't have to handle the
727 local_symbol case, since a weakrefd is always promoted out of the
728 local_symbol table when it is turned into a weak symbol. */
730 S_CLEAR_WEAKREFD (sym);
736 symbol_find (const char *name)
738 return symbol_find_noref (name, 0);
742 symbol_find_noref (const char *name, int noref)
744 #ifdef tc_canonicalize_symbol_name
747 size_t len = strlen (name) + 1;
749 copy = (char *) alloca (len);
750 memcpy (copy, name, len);
751 name = tc_canonicalize_symbol_name (copy);
755 if (! symbols_case_sensitive)
762 name = copy = (char *) alloca (strlen (name) + 1);
764 while ((c = *orig++) != '\0')
766 *copy++ = TOUPPER (c);
771 return symbol_find_exact_noref (name, noref);
774 /* Once upon a time, symbols were kept in a singly linked list. At
775 least coff needs to be able to rearrange them from time to time, for
776 which a doubly linked list is much more convenient. Loic did these
777 as macros which seemed dangerous to me so they're now functions.
780 /* Link symbol ADDME after symbol TARGET in the chain. */
783 symbol_append (symbolS *addme, symbolS *target,
784 symbolS **rootPP, symbolS **lastPP)
786 if (LOCAL_SYMBOL_CHECK (addme))
788 if (target != NULL && LOCAL_SYMBOL_CHECK (target))
793 know (*rootPP == NULL);
794 know (*lastPP == NULL);
795 addme->sy_next = NULL;
796 addme->sy_previous = NULL;
800 } /* if the list is empty */
802 if (target->sy_next != NULL)
804 target->sy_next->sy_previous = addme;
808 know (*lastPP == target);
810 } /* if we have a next */
812 addme->sy_next = target->sy_next;
813 target->sy_next = addme;
814 addme->sy_previous = target;
816 debug_verify_symchain (symbol_rootP, symbol_lastP);
819 /* Set the chain pointers of SYMBOL to null. */
822 symbol_clear_list_pointers (symbolS *symbolP)
824 if (LOCAL_SYMBOL_CHECK (symbolP))
826 symbolP->sy_next = NULL;
827 symbolP->sy_previous = NULL;
830 /* Remove SYMBOLP from the list. */
833 symbol_remove (symbolS *symbolP, symbolS **rootPP, symbolS **lastPP)
835 if (LOCAL_SYMBOL_CHECK (symbolP))
838 if (symbolP == *rootPP)
840 *rootPP = symbolP->sy_next;
841 } /* if it was the root */
843 if (symbolP == *lastPP)
845 *lastPP = symbolP->sy_previous;
846 } /* if it was the tail */
848 if (symbolP->sy_next != NULL)
850 symbolP->sy_next->sy_previous = symbolP->sy_previous;
853 if (symbolP->sy_previous != NULL)
855 symbolP->sy_previous->sy_next = symbolP->sy_next;
858 debug_verify_symchain (*rootPP, *lastPP);
861 /* Link symbol ADDME before symbol TARGET in the chain. */
864 symbol_insert (symbolS *addme, symbolS *target,
865 symbolS **rootPP, symbolS **lastPP ATTRIBUTE_UNUSED)
867 if (LOCAL_SYMBOL_CHECK (addme))
869 if (LOCAL_SYMBOL_CHECK (target))
872 if (target->sy_previous != NULL)
874 target->sy_previous->sy_next = addme;
878 know (*rootPP == target);
882 addme->sy_previous = target->sy_previous;
883 target->sy_previous = addme;
884 addme->sy_next = target;
886 debug_verify_symchain (*rootPP, *lastPP);
890 verify_symbol_chain (symbolS *rootP, symbolS *lastP)
892 symbolS *symbolP = rootP;
897 for (; symbol_next (symbolP) != NULL; symbolP = symbol_next (symbolP))
899 gas_assert (symbolP->bsym != NULL);
900 gas_assert (symbolP->sy_flags.sy_local_symbol == 0);
901 gas_assert (symbolP->sy_next->sy_previous == symbolP);
904 gas_assert (lastP == symbolP);
907 #ifdef OBJ_COMPLEX_RELC
910 use_complex_relocs_for (symbolS * symp)
912 switch (symp->sy_value.X_op)
922 if ( (S_IS_COMMON (symp->sy_value.X_add_symbol)
923 || S_IS_LOCAL (symp->sy_value.X_add_symbol))
925 (S_IS_DEFINED (symp->sy_value.X_add_symbol)
926 && S_GET_SEGMENT (symp->sy_value.X_add_symbol) != expr_section))
935 case O_bit_inclusive_or:
937 case O_bit_exclusive_or:
950 if ( (S_IS_COMMON (symp->sy_value.X_add_symbol)
951 || S_IS_LOCAL (symp->sy_value.X_add_symbol))
953 (S_IS_COMMON (symp->sy_value.X_op_symbol)
954 || S_IS_LOCAL (symp->sy_value.X_op_symbol))
956 && S_IS_DEFINED (symp->sy_value.X_add_symbol)
957 && S_IS_DEFINED (symp->sy_value.X_op_symbol)
958 && S_GET_SEGMENT (symp->sy_value.X_add_symbol) != expr_section
959 && S_GET_SEGMENT (symp->sy_value.X_op_symbol) != expr_section)
971 report_op_error (symbolS *symp, symbolS *left, operatorT op, symbolS *right)
975 segT seg_left = left ? S_GET_SEGMENT (left) : 0;
976 segT seg_right = S_GET_SEGMENT (right);
985 case O_uminus: opname = "-"; break;
986 case O_bit_not: opname = "~"; break;
987 case O_logical_not: opname = "!"; break;
988 case O_multiply: opname = "*"; break;
989 case O_divide: opname = "/"; break;
990 case O_modulus: opname = "%"; break;
991 case O_left_shift: opname = "<<"; break;
992 case O_right_shift: opname = ">>"; break;
993 case O_bit_inclusive_or: opname = "|"; break;
994 case O_bit_or_not: opname = "|~"; break;
995 case O_bit_exclusive_or: opname = "^"; break;
996 case O_bit_and: opname = "&"; break;
997 case O_add: opname = "+"; break;
998 case O_subtract: opname = "-"; break;
999 case O_eq: opname = "=="; break;
1000 case O_ne: opname = "!="; break;
1001 case O_lt: opname = "<"; break;
1002 case O_le: opname = "<="; break;
1003 case O_ge: opname = ">="; break;
1004 case O_gt: opname = ">"; break;
1005 case O_logical_and: opname = "&&"; break;
1006 case O_logical_or: opname = "||"; break;
1009 if (expr_symbol_where (symp, &file, &line))
1012 as_bad_where (file, line,
1013 _("invalid operands (%s and %s sections) for `%s'"),
1014 seg_left->name, seg_right->name, opname);
1016 as_bad_where (file, line,
1017 _("invalid operand (%s section) for `%s'"),
1018 seg_right->name, opname);
1022 const char *sname = S_GET_NAME (symp);
1025 as_bad (_("invalid operands (%s and %s sections) for `%s' when setting `%s'"),
1026 seg_left->name, seg_right->name, opname, sname);
1028 as_bad (_("invalid operand (%s section) for `%s' when setting `%s'"),
1029 seg_right->name, opname, sname);
1033 /* Resolve the value of a symbol. This is called during the final
1034 pass over the symbol table to resolve any symbols with complex
1038 resolve_symbol_value (symbolS *symp)
1041 valueT final_val = 0;
1044 if (LOCAL_SYMBOL_CHECK (symp))
1046 struct local_symbol *locsym = (struct local_symbol *) symp;
1048 final_val = locsym->lsy_value;
1049 if (local_symbol_resolved_p (locsym))
1052 final_val += local_symbol_get_frag (locsym)->fr_address / OCTETS_PER_BYTE;
1056 locsym->lsy_value = final_val;
1057 local_symbol_mark_resolved (locsym);
1063 if (symp->sy_flags.sy_resolved)
1065 if (symp->sy_value.X_op == O_constant)
1066 return (valueT) symp->sy_value.X_add_number;
1072 final_seg = S_GET_SEGMENT (symp);
1074 if (symp->sy_flags.sy_resolving)
1077 as_bad (_("symbol definition loop encountered at `%s'"),
1082 #ifdef OBJ_COMPLEX_RELC
1083 else if (final_seg == expr_section
1084 && use_complex_relocs_for (symp))
1086 symbolS * relc_symbol = NULL;
1087 char * relc_symbol_name = NULL;
1089 relc_symbol_name = symbol_relc_make_expr (& symp->sy_value);
1091 /* For debugging, print out conversion input & output. */
1093 print_expr (& symp->sy_value);
1094 if (relc_symbol_name)
1095 fprintf (stderr, "-> relc symbol: %s\n", relc_symbol_name);
1098 if (relc_symbol_name != NULL)
1099 relc_symbol = symbol_new (relc_symbol_name, undefined_section,
1100 0, & zero_address_frag);
1102 if (relc_symbol == NULL)
1104 as_bad (_("cannot convert expression symbol %s to complex relocation"),
1110 symbol_table_insert (relc_symbol);
1112 /* S_CLEAR_EXTERNAL (relc_symbol); */
1113 if (symp->bsym->flags & BSF_SRELC)
1114 relc_symbol->bsym->flags |= BSF_SRELC;
1116 relc_symbol->bsym->flags |= BSF_RELC;
1117 /* symp->bsym->flags |= BSF_RELC; */
1118 copy_symbol_attributes (symp, relc_symbol);
1119 symp->sy_value.X_op = O_symbol;
1120 symp->sy_value.X_add_symbol = relc_symbol;
1121 symp->sy_value.X_add_number = 0;
1125 final_seg = undefined_section;
1126 goto exit_dont_set_value;
1131 symbolS *add_symbol, *op_symbol;
1132 offsetT left, right;
1133 segT seg_left, seg_right;
1137 symp->sy_flags.sy_resolving = 1;
1139 /* Help out with CSE. */
1140 add_symbol = symp->sy_value.X_add_symbol;
1141 op_symbol = symp->sy_value.X_op_symbol;
1142 final_val = symp->sy_value.X_add_number;
1143 op = symp->sy_value.X_op;
1156 final_val += symp->sy_frag->fr_address / OCTETS_PER_BYTE;
1157 if (final_seg == expr_section)
1158 final_seg = absolute_section;
1167 left = resolve_symbol_value (add_symbol);
1168 seg_left = S_GET_SEGMENT (add_symbol);
1170 symp->sy_value.X_op_symbol = NULL;
1173 if (S_IS_WEAKREFR (symp))
1175 gas_assert (final_val == 0);
1176 if (S_IS_WEAKREFR (add_symbol))
1178 gas_assert (add_symbol->sy_value.X_op == O_symbol
1179 && add_symbol->sy_value.X_add_number == 0);
1180 add_symbol = add_symbol->sy_value.X_add_symbol;
1181 gas_assert (! S_IS_WEAKREFR (add_symbol));
1182 symp->sy_value.X_add_symbol = add_symbol;
1186 if (symp->sy_flags.sy_mri_common)
1188 /* This is a symbol inside an MRI common section. The
1189 relocation routines are going to handle it specially.
1190 Don't change the value. */
1191 resolved = symbol_resolved_p (add_symbol);
1195 if (finalize_syms && final_val == 0)
1197 if (LOCAL_SYMBOL_CHECK (add_symbol))
1198 add_symbol = local_symbol_convert ((struct local_symbol *)
1200 copy_symbol_attributes (symp, add_symbol);
1203 /* If we have equated this symbol to an undefined or common
1204 symbol, keep X_op set to O_symbol, and don't change
1205 X_add_number. This permits the routine which writes out
1206 relocation to detect this case, and convert the
1207 relocation to be against the symbol to which this symbol
1209 if (! S_IS_DEFINED (add_symbol)
1210 #if defined (OBJ_COFF) && defined (TE_PE)
1211 || S_IS_WEAK (add_symbol)
1213 || S_IS_COMMON (add_symbol))
1217 symp->sy_value.X_op = O_symbol;
1218 symp->sy_value.X_add_symbol = add_symbol;
1219 symp->sy_value.X_add_number = final_val;
1220 /* Use X_op_symbol as a flag. */
1221 symp->sy_value.X_op_symbol = add_symbol;
1223 final_seg = seg_left;
1225 resolved = symbol_resolved_p (add_symbol);
1226 symp->sy_flags.sy_resolving = 0;
1227 goto exit_dont_set_value;
1229 else if (finalize_syms
1230 && ((final_seg == expr_section && seg_left != expr_section)
1231 || symbol_shadow_p (symp)))
1233 /* If the symbol is an expression symbol, do similarly
1234 as for undefined and common syms above. Handles
1235 "sym +/- expr" where "expr" cannot be evaluated
1236 immediately, and we want relocations to be against
1237 "sym", eg. because it is weak. */
1238 symp->sy_value.X_op = O_symbol;
1239 symp->sy_value.X_add_symbol = add_symbol;
1240 symp->sy_value.X_add_number = final_val;
1241 symp->sy_value.X_op_symbol = add_symbol;
1242 final_seg = seg_left;
1243 final_val += symp->sy_frag->fr_address + left;
1244 resolved = symbol_resolved_p (add_symbol);
1245 symp->sy_flags.sy_resolving = 0;
1246 goto exit_dont_set_value;
1250 final_val += symp->sy_frag->fr_address + left;
1251 if (final_seg == expr_section || final_seg == undefined_section)
1252 final_seg = seg_left;
1255 resolved = symbol_resolved_p (add_symbol);
1256 if (S_IS_WEAKREFR (symp))
1257 goto exit_dont_set_value;
1263 left = resolve_symbol_value (add_symbol);
1264 seg_left = S_GET_SEGMENT (add_symbol);
1266 /* By reducing these to the relevant dyadic operator, we get
1267 !S -> S == 0 permitted on anything,
1268 -S -> 0 - S only permitted on absolute
1269 ~S -> S ^ ~0 only permitted on absolute */
1270 if (op != O_logical_not && seg_left != absolute_section
1272 report_op_error (symp, NULL, op, add_symbol);
1274 if (final_seg == expr_section || final_seg == undefined_section)
1275 final_seg = absolute_section;
1279 else if (op == O_logical_not)
1284 final_val += left + symp->sy_frag->fr_address;
1286 resolved = symbol_resolved_p (add_symbol);
1294 case O_bit_inclusive_or:
1296 case O_bit_exclusive_or:
1308 left = resolve_symbol_value (add_symbol);
1309 right = resolve_symbol_value (op_symbol);
1310 seg_left = S_GET_SEGMENT (add_symbol);
1311 seg_right = S_GET_SEGMENT (op_symbol);
1313 /* Simplify addition or subtraction of a constant by folding the
1314 constant into X_add_number. */
1317 if (seg_right == absolute_section)
1322 else if (seg_left == absolute_section)
1325 add_symbol = op_symbol;
1327 seg_left = seg_right;
1331 else if (op == O_subtract)
1333 if (seg_right == absolute_section)
1341 /* Equality and non-equality tests are permitted on anything.
1342 Subtraction, and other comparison operators are permitted if
1343 both operands are in the same section. Otherwise, both
1344 operands must be absolute. We already handled the case of
1345 addition or subtraction of a constant above. This will
1346 probably need to be changed for an object file format which
1347 supports arbitrary expressions, such as IEEE-695. */
1348 if (!(seg_left == absolute_section
1349 && seg_right == absolute_section)
1350 && !(op == O_eq || op == O_ne)
1351 && !((op == O_subtract
1352 || op == O_lt || op == O_le || op == O_ge || op == O_gt)
1353 && seg_left == seg_right
1354 && (seg_left != undefined_section
1355 || add_symbol == op_symbol)))
1357 /* Don't emit messages unless we're finalizing the symbol value,
1358 otherwise we may get the same message multiple times. */
1360 report_op_error (symp, add_symbol, op, op_symbol);
1361 /* However do not move the symbol into the absolute section
1362 if it cannot currently be resolved - this would confuse
1363 other parts of the assembler into believing that the
1364 expression had been evaluated to zero. */
1370 && (final_seg == expr_section || final_seg == undefined_section))
1371 final_seg = absolute_section;
1373 /* Check for division by zero. */
1374 if ((op == O_divide || op == O_modulus) && right == 0)
1376 /* If seg_right is not absolute_section, then we've
1377 already issued a warning about using a bad symbol. */
1378 if (seg_right == absolute_section && finalize_syms)
1383 if (expr_symbol_where (symp, &file, &line))
1384 as_bad_where (file, line, _("division by zero"));
1386 as_bad (_("division by zero when setting `%s'"),
1393 switch (symp->sy_value.X_op)
1395 case O_multiply: left *= right; break;
1396 case O_divide: left /= right; break;
1397 case O_modulus: left %= right; break;
1398 case O_left_shift: left <<= right; break;
1399 case O_right_shift: left >>= right; break;
1400 case O_bit_inclusive_or: left |= right; break;
1401 case O_bit_or_not: left |= ~right; break;
1402 case O_bit_exclusive_or: left ^= right; break;
1403 case O_bit_and: left &= right; break;
1404 case O_add: left += right; break;
1405 case O_subtract: left -= right; break;
1408 left = (left == right && seg_left == seg_right
1409 && (seg_left != undefined_section
1410 || add_symbol == op_symbol)
1411 ? ~ (offsetT) 0 : 0);
1412 if (symp->sy_value.X_op == O_ne)
1415 case O_lt: left = left < right ? ~ (offsetT) 0 : 0; break;
1416 case O_le: left = left <= right ? ~ (offsetT) 0 : 0; break;
1417 case O_ge: left = left >= right ? ~ (offsetT) 0 : 0; break;
1418 case O_gt: left = left > right ? ~ (offsetT) 0 : 0; break;
1419 case O_logical_and: left = left && right; break;
1420 case O_logical_or: left = left || right; break;
1424 final_val += symp->sy_frag->fr_address + left;
1425 if (final_seg == expr_section || final_seg == undefined_section)
1427 if (seg_left == undefined_section
1428 || seg_right == undefined_section)
1429 final_seg = undefined_section;
1430 else if (seg_left == absolute_section)
1431 final_seg = seg_right;
1433 final_seg = seg_left;
1435 resolved = (symbol_resolved_p (add_symbol)
1436 && symbol_resolved_p (op_symbol));
1441 /* Give an error (below) if not in expr_section. We don't
1442 want to worry about expr_section symbols, because they
1443 are fictional (they are created as part of expression
1444 resolution), and any problems may not actually mean
1449 symp->sy_flags.sy_resolving = 0;
1453 S_SET_VALUE (symp, final_val);
1455 exit_dont_set_value:
1456 /* Always set the segment, even if not finalizing the value.
1457 The segment is used to determine whether a symbol is defined. */
1458 S_SET_SEGMENT (symp, final_seg);
1460 /* Don't worry if we can't resolve an expr_section symbol. */
1464 symp->sy_flags.sy_resolved = 1;
1465 else if (S_GET_SEGMENT (symp) != expr_section)
1467 as_bad (_("can't resolve value for symbol `%s'"),
1469 symp->sy_flags.sy_resolved = 1;
1476 static void resolve_local_symbol (const char *, void *);
1478 /* A static function passed to hash_traverse. */
1481 resolve_local_symbol (const char *key ATTRIBUTE_UNUSED, void *value)
1484 resolve_symbol_value ((symbolS *) value);
1487 /* Resolve all local symbols. */
1490 resolve_local_symbol_values (void)
1492 hash_traverse (local_hash, resolve_local_symbol);
1495 /* Obtain the current value of a symbol without changing any
1496 sub-expressions used. */
1499 snapshot_symbol (symbolS **symbolPP, valueT *valueP, segT *segP, fragS **fragPP)
1501 symbolS *symbolP = *symbolPP;
1503 if (LOCAL_SYMBOL_CHECK (symbolP))
1505 struct local_symbol *locsym = (struct local_symbol *) symbolP;
1507 *valueP = locsym->lsy_value;
1508 *segP = locsym->lsy_section;
1509 *fragPP = local_symbol_get_frag (locsym);
1513 expressionS exp = symbolP->sy_value;
1515 if (!symbolP->sy_flags.sy_resolved && exp.X_op != O_illegal)
1519 if (symbolP->sy_flags.sy_resolving)
1521 symbolP->sy_flags.sy_resolving = 1;
1522 resolved = resolve_expression (&exp);
1523 symbolP->sy_flags.sy_resolving = 0;
1531 if (!symbol_equated_p (symbolP))
1536 symbolP = exp.X_add_symbol;
1543 *symbolPP = symbolP;
1544 *valueP = exp.X_add_number;
1545 *segP = symbolP->bsym->section;
1546 *fragPP = symbolP->sy_frag;
1548 if (*segP == expr_section)
1551 case O_constant: *segP = absolute_section; break;
1552 case O_register: *segP = reg_section; break;
1560 /* Dollar labels look like a number followed by a dollar sign. Eg, "42$".
1561 They are *really* local. That is, they go out of scope whenever we see a
1562 label that isn't local. Also, like fb labels, there can be multiple
1563 instances of a dollar label. Therefor, we name encode each instance with
1564 the instance number, keep a list of defined symbols separate from the real
1565 symbol table, and we treat these buggers as a sparse array. */
1567 static long *dollar_labels;
1568 static long *dollar_label_instances;
1569 static char *dollar_label_defines;
1570 static unsigned long dollar_label_count;
1571 static unsigned long dollar_label_max;
1574 dollar_label_defined (long label)
1578 know ((dollar_labels != NULL) || (dollar_label_count == 0));
1580 for (i = dollar_labels; i < dollar_labels + dollar_label_count; ++i)
1582 return dollar_label_defines[i - dollar_labels];
1584 /* If we get here, label isn't defined. */
1589 dollar_label_instance (long label)
1593 know ((dollar_labels != NULL) || (dollar_label_count == 0));
1595 for (i = dollar_labels; i < dollar_labels + dollar_label_count; ++i)
1597 return (dollar_label_instances[i - dollar_labels]);
1599 /* If we get here, we haven't seen the label before.
1600 Therefore its instance count is zero. */
1605 dollar_label_clear (void)
1607 memset (dollar_label_defines, '\0', (unsigned int) dollar_label_count);
1610 #define DOLLAR_LABEL_BUMP_BY 10
1613 define_dollar_label (long label)
1617 for (i = dollar_labels; i < dollar_labels + dollar_label_count; ++i)
1620 ++dollar_label_instances[i - dollar_labels];
1621 dollar_label_defines[i - dollar_labels] = 1;
1625 /* If we get to here, we don't have label listed yet. */
1627 if (dollar_labels == NULL)
1629 dollar_labels = (long *) xmalloc (DOLLAR_LABEL_BUMP_BY * sizeof (long));
1630 dollar_label_instances = (long *) xmalloc (DOLLAR_LABEL_BUMP_BY * sizeof (long));
1631 dollar_label_defines = (char *) xmalloc (DOLLAR_LABEL_BUMP_BY);
1632 dollar_label_max = DOLLAR_LABEL_BUMP_BY;
1633 dollar_label_count = 0;
1635 else if (dollar_label_count == dollar_label_max)
1637 dollar_label_max += DOLLAR_LABEL_BUMP_BY;
1638 dollar_labels = (long *) xrealloc ((char *) dollar_labels,
1639 dollar_label_max * sizeof (long));
1640 dollar_label_instances = (long *) xrealloc ((char *) dollar_label_instances,
1641 dollar_label_max * sizeof (long));
1642 dollar_label_defines = (char *) xrealloc (dollar_label_defines, dollar_label_max);
1643 } /* if we needed to grow */
1645 dollar_labels[dollar_label_count] = label;
1646 dollar_label_instances[dollar_label_count] = 1;
1647 dollar_label_defines[dollar_label_count] = 1;
1648 ++dollar_label_count;
1651 /* Caller must copy returned name: we re-use the area for the next name.
1653 The mth occurence of label n: is turned into the symbol "Ln^Am"
1654 where n is the label number and m is the instance number. "L" makes
1655 it a label discarded unless debugging and "^A"('\1') ensures no
1656 ordinary symbol SHOULD get the same name as a local label
1657 symbol. The first "4:" is "L4^A1" - the m numbers begin at 1.
1659 fb labels get the same treatment, except that ^B is used in place
1662 char * /* Return local label name. */
1663 dollar_label_name (register long n, /* we just saw "n$:" : n a number. */
1664 register int augend /* 0 for current instance, 1 for new instance. */)
1667 /* Returned to caller, then copied. Used for created names ("4f"). */
1668 static char symbol_name_build[24];
1671 char symbol_name_temporary[20]; /* Build up a number, BACKWARDS. */
1674 know (augend == 0 || augend == 1);
1675 p = symbol_name_build;
1676 #ifdef LOCAL_LABEL_PREFIX
1677 *p++ = LOCAL_LABEL_PREFIX;
1681 /* Next code just does sprintf( {}, "%d", n); */
1683 q = symbol_name_temporary;
1684 for (*q++ = 0, i = n; i; ++q)
1689 while ((*p = *--q) != '\0')
1692 *p++ = DOLLAR_LABEL_CHAR; /* ^A */
1694 /* Instance number. */
1695 q = symbol_name_temporary;
1696 for (*q++ = 0, i = dollar_label_instance (n) + augend; i; ++q)
1701 while ((*p++ = *--q) != '\0');;
1703 /* The label, as a '\0' ended string, starts at symbol_name_build. */
1704 return symbol_name_build;
1707 /* Somebody else's idea of local labels. They are made by "n:" where n
1708 is any decimal digit. Refer to them with
1709 "nb" for previous (backward) n:
1710 or "nf" for next (forward) n:.
1712 We do a little better and let n be any number, not just a single digit, but
1713 since the other guy's assembler only does ten, we treat the first ten
1716 Like someone else's assembler, we have one set of local label counters for
1717 entire assembly, not one set per (sub)segment like in most assemblers. This
1718 implies that one can refer to a label in another segment, and indeed some
1719 crufty compilers have done just that.
1721 Since there could be a LOT of these things, treat them as a sparse
1724 #define FB_LABEL_SPECIAL (10)
1726 static long fb_low_counter[FB_LABEL_SPECIAL];
1727 static long *fb_labels;
1728 static long *fb_label_instances;
1729 static long fb_label_count;
1730 static long fb_label_max;
1732 /* This must be more than FB_LABEL_SPECIAL. */
1733 #define FB_LABEL_BUMP_BY (FB_LABEL_SPECIAL + 6)
1736 fb_label_init (void)
1738 memset ((void *) fb_low_counter, '\0', sizeof (fb_low_counter));
1741 /* Add one to the instance number of this fb label. */
1744 fb_label_instance_inc (long label)
1748 if (label < FB_LABEL_SPECIAL)
1750 ++fb_low_counter[label];
1754 if (fb_labels != NULL)
1756 for (i = fb_labels + FB_LABEL_SPECIAL;
1757 i < fb_labels + fb_label_count; ++i)
1761 ++fb_label_instances[i - fb_labels];
1763 } /* if we find it */
1764 } /* for each existing label */
1767 /* If we get to here, we don't have label listed yet. */
1769 if (fb_labels == NULL)
1771 fb_labels = (long *) xmalloc (FB_LABEL_BUMP_BY * sizeof (long));
1772 fb_label_instances = (long *) xmalloc (FB_LABEL_BUMP_BY * sizeof (long));
1773 fb_label_max = FB_LABEL_BUMP_BY;
1774 fb_label_count = FB_LABEL_SPECIAL;
1777 else if (fb_label_count == fb_label_max)
1779 fb_label_max += FB_LABEL_BUMP_BY;
1780 fb_labels = (long *) xrealloc ((char *) fb_labels,
1781 fb_label_max * sizeof (long));
1782 fb_label_instances = (long *) xrealloc ((char *) fb_label_instances,
1783 fb_label_max * sizeof (long));
1784 } /* if we needed to grow */
1786 fb_labels[fb_label_count] = label;
1787 fb_label_instances[fb_label_count] = 1;
1792 fb_label_instance (long label)
1796 if (label < FB_LABEL_SPECIAL)
1798 return (fb_low_counter[label]);
1801 if (fb_labels != NULL)
1803 for (i = fb_labels + FB_LABEL_SPECIAL;
1804 i < fb_labels + fb_label_count; ++i)
1808 return (fb_label_instances[i - fb_labels]);
1809 } /* if we find it */
1810 } /* for each existing label */
1813 /* We didn't find the label, so this must be a reference to the
1818 /* Caller must copy returned name: we re-use the area for the next name.
1820 The mth occurence of label n: is turned into the symbol "Ln^Bm"
1821 where n is the label number and m is the instance number. "L" makes
1822 it a label discarded unless debugging and "^B"('\2') ensures no
1823 ordinary symbol SHOULD get the same name as a local label
1824 symbol. The first "4:" is "L4^B1" - the m numbers begin at 1.
1826 dollar labels get the same treatment, except that ^A is used in
1829 char * /* Return local label name. */
1830 fb_label_name (long n, /* We just saw "n:", "nf" or "nb" : n a number. */
1831 long augend /* 0 for nb, 1 for n:, nf. */)
1834 /* Returned to caller, then copied. Used for created names ("4f"). */
1835 static char symbol_name_build[24];
1838 char symbol_name_temporary[20]; /* Build up a number, BACKWARDS. */
1842 know ((unsigned long) augend <= 2 /* See mmix_fb_label. */);
1844 know ((unsigned long) augend <= 1);
1846 p = symbol_name_build;
1847 #ifdef LOCAL_LABEL_PREFIX
1848 *p++ = LOCAL_LABEL_PREFIX;
1852 /* Next code just does sprintf( {}, "%d", n); */
1854 q = symbol_name_temporary;
1855 for (*q++ = 0, i = n; i; ++q)
1860 while ((*p = *--q) != '\0')
1863 *p++ = LOCAL_LABEL_CHAR; /* ^B */
1865 /* Instance number. */
1866 q = symbol_name_temporary;
1867 for (*q++ = 0, i = fb_label_instance (n) + augend; i; ++q)
1872 while ((*p++ = *--q) != '\0');;
1874 /* The label, as a '\0' ended string, starts at symbol_name_build. */
1875 return (symbol_name_build);
1878 /* Decode name that may have been generated by foo_label_name() above.
1879 If the name wasn't generated by foo_label_name(), then return it
1880 unaltered. This is used for error messages. */
1883 decode_local_label_name (char *s)
1886 char *symbol_decode;
1888 int instance_number;
1890 const char *message_format;
1893 #ifdef LOCAL_LABEL_PREFIX
1894 if (s[lindex] == LOCAL_LABEL_PREFIX)
1898 if (s[lindex] != 'L')
1901 for (label_number = 0, p = s + lindex + 1; ISDIGIT (*p); ++p)
1902 label_number = (10 * label_number) + *p - '0';
1904 if (*p == DOLLAR_LABEL_CHAR)
1906 else if (*p == LOCAL_LABEL_CHAR)
1911 for (instance_number = 0, p++; ISDIGIT (*p); ++p)
1912 instance_number = (10 * instance_number) + *p - '0';
1914 message_format = _("\"%d\" (instance number %d of a %s label)");
1915 symbol_decode = (char *) obstack_alloc (¬es, strlen (message_format) + 30);
1916 sprintf (symbol_decode, message_format, label_number, instance_number, type);
1918 return symbol_decode;
1921 /* Get the value of a symbol. */
1924 S_GET_VALUE (symbolS *s)
1926 if (LOCAL_SYMBOL_CHECK (s))
1927 return resolve_symbol_value (s);
1929 if (!s->sy_flags.sy_resolved)
1931 valueT val = resolve_symbol_value (s);
1935 if (S_IS_WEAKREFR (s))
1936 return S_GET_VALUE (s->sy_value.X_add_symbol);
1938 if (s->sy_value.X_op != O_constant)
1940 if (! s->sy_flags.sy_resolved
1941 || s->sy_value.X_op != O_symbol
1942 || (S_IS_DEFINED (s) && ! S_IS_COMMON (s)))
1943 as_bad (_("attempt to get value of unresolved symbol `%s'"),
1946 return (valueT) s->sy_value.X_add_number;
1949 /* Set the value of a symbol. */
1952 S_SET_VALUE (symbolS *s, valueT val)
1954 if (LOCAL_SYMBOL_CHECK (s))
1956 ((struct local_symbol *) s)->lsy_value = val;
1960 s->sy_value.X_op = O_constant;
1961 s->sy_value.X_add_number = (offsetT) val;
1962 s->sy_value.X_unsigned = 0;
1963 S_CLEAR_WEAKREFR (s);
1967 copy_symbol_attributes (symbolS *dest, symbolS *src)
1969 if (LOCAL_SYMBOL_CHECK (dest))
1970 dest = local_symbol_convert ((struct local_symbol *) dest);
1971 if (LOCAL_SYMBOL_CHECK (src))
1972 src = local_symbol_convert ((struct local_symbol *) src);
1974 /* In an expression, transfer the settings of these flags.
1975 The user can override later, of course. */
1976 #define COPIED_SYMFLAGS (BSF_FUNCTION | BSF_OBJECT \
1977 | BSF_GNU_INDIRECT_FUNCTION)
1978 dest->bsym->flags |= src->bsym->flags & COPIED_SYMFLAGS;
1980 #ifdef OBJ_COPY_SYMBOL_ATTRIBUTES
1981 OBJ_COPY_SYMBOL_ATTRIBUTES (dest, src);
1984 #ifdef TC_COPY_SYMBOL_ATTRIBUTES
1985 TC_COPY_SYMBOL_ATTRIBUTES (dest, src);
1990 S_IS_FUNCTION (symbolS *s)
1994 if (LOCAL_SYMBOL_CHECK (s))
1997 flags = s->bsym->flags;
1999 return (flags & BSF_FUNCTION) != 0;
2003 S_IS_EXTERNAL (symbolS *s)
2007 if (LOCAL_SYMBOL_CHECK (s))
2010 flags = s->bsym->flags;
2013 if ((flags & BSF_LOCAL) && (flags & BSF_GLOBAL))
2016 return (flags & BSF_GLOBAL) != 0;
2020 S_IS_WEAK (symbolS *s)
2022 if (LOCAL_SYMBOL_CHECK (s))
2024 /* Conceptually, a weakrefr is weak if the referenced symbol is. We
2025 could probably handle a WEAKREFR as always weak though. E.g., if
2026 the referenced symbol has lost its weak status, there's no reason
2027 to keep handling the weakrefr as if it was weak. */
2028 if (S_IS_WEAKREFR (s))
2029 return S_IS_WEAK (s->sy_value.X_add_symbol);
2030 return (s->bsym->flags & BSF_WEAK) != 0;
2034 S_IS_WEAKREFR (symbolS *s)
2036 if (LOCAL_SYMBOL_CHECK (s))
2038 return s->sy_flags.sy_weakrefr != 0;
2042 S_IS_WEAKREFD (symbolS *s)
2044 if (LOCAL_SYMBOL_CHECK (s))
2046 return s->sy_flags.sy_weakrefd != 0;
2050 S_IS_COMMON (symbolS *s)
2052 if (LOCAL_SYMBOL_CHECK (s))
2054 return bfd_is_com_section (s->bsym->section);
2058 S_IS_DEFINED (symbolS *s)
2060 if (LOCAL_SYMBOL_CHECK (s))
2061 return ((struct local_symbol *) s)->lsy_section != undefined_section;
2062 return s->bsym->section != undefined_section;
2066 #ifndef EXTERN_FORCE_RELOC
2067 #define EXTERN_FORCE_RELOC IS_ELF
2070 /* Return true for symbols that should not be reduced to section
2071 symbols or eliminated from expressions, because they may be
2072 overridden by the linker. */
2074 S_FORCE_RELOC (symbolS *s, int strict)
2076 if (LOCAL_SYMBOL_CHECK (s))
2077 return ((struct local_symbol *) s)->lsy_section == undefined_section;
2080 && ((s->bsym->flags & BSF_WEAK) != 0
2081 || (EXTERN_FORCE_RELOC
2082 && (s->bsym->flags & BSF_GLOBAL) != 0)))
2083 || (s->bsym->flags & BSF_GNU_INDIRECT_FUNCTION) != 0
2084 || s->bsym->section == undefined_section
2085 || bfd_is_com_section (s->bsym->section));
2089 S_IS_DEBUG (symbolS *s)
2091 if (LOCAL_SYMBOL_CHECK (s))
2093 if (s->bsym->flags & BSF_DEBUGGING)
2099 S_IS_LOCAL (symbolS *s)
2104 if (LOCAL_SYMBOL_CHECK (s))
2107 flags = s->bsym->flags;
2110 if ((flags & BSF_LOCAL) && (flags & BSF_GLOBAL))
2113 if (bfd_get_section (s->bsym) == reg_section)
2116 if (flag_strip_local_absolute
2117 /* Keep BSF_FILE symbols in order to allow debuggers to identify
2118 the source file even when the object file is stripped. */
2119 && (flags & (BSF_GLOBAL | BSF_FILE)) == 0
2120 && bfd_get_section (s->bsym) == absolute_section)
2123 name = S_GET_NAME (s);
2124 return (name != NULL
2126 && (strchr (name, DOLLAR_LABEL_CHAR)
2127 || strchr (name, LOCAL_LABEL_CHAR)
2128 || TC_LABEL_IS_LOCAL (name)
2129 || (! flag_keep_locals
2130 && (bfd_is_local_label (stdoutput, s->bsym)
2133 && name[1] == '?')))));
2137 S_IS_STABD (symbolS *s)
2139 return S_GET_NAME (s) == 0;
2143 S_CAN_BE_REDEFINED (const symbolS *s)
2145 if (LOCAL_SYMBOL_CHECK (s))
2146 return (local_symbol_get_frag ((struct local_symbol *) s)
2147 == &predefined_address_frag);
2148 /* Permit register names to be redefined. */
2149 return s->bsym->section == reg_section;
2153 S_IS_VOLATILE (const symbolS *s)
2155 if (LOCAL_SYMBOL_CHECK (s))
2157 return s->sy_flags.sy_volatile;
2161 S_IS_FORWARD_REF (const symbolS *s)
2163 if (LOCAL_SYMBOL_CHECK (s))
2165 return s->sy_flags.sy_forward_ref;
2169 S_GET_NAME (symbolS *s)
2171 if (LOCAL_SYMBOL_CHECK (s))
2172 return ((struct local_symbol *) s)->lsy_name;
2173 return s->bsym->name;
2177 S_GET_SEGMENT (symbolS *s)
2179 if (LOCAL_SYMBOL_CHECK (s))
2180 return ((struct local_symbol *) s)->lsy_section;
2181 return s->bsym->section;
2185 S_SET_SEGMENT (symbolS *s, segT seg)
2187 /* Don't reassign section symbols. The direct reason is to prevent seg
2188 faults assigning back to const global symbols such as *ABS*, but it
2189 shouldn't happen anyway. */
2191 if (LOCAL_SYMBOL_CHECK (s))
2193 if (seg == reg_section)
2194 s = local_symbol_convert ((struct local_symbol *) s);
2197 ((struct local_symbol *) s)->lsy_section = seg;
2202 if (s->bsym->flags & BSF_SECTION_SYM)
2204 if (s->bsym->section != seg)
2208 s->bsym->section = seg;
2212 S_SET_EXTERNAL (symbolS *s)
2214 if (LOCAL_SYMBOL_CHECK (s))
2215 s = local_symbol_convert ((struct local_symbol *) s);
2216 if ((s->bsym->flags & BSF_WEAK) != 0)
2218 /* Let .weak override .global. */
2221 if (s->bsym->flags & BSF_SECTION_SYM)
2226 /* Do not reassign section symbols. */
2227 as_where (& file, & line);
2228 as_warn_where (file, line,
2229 _("section symbols are already global"));
2232 #ifndef TC_GLOBAL_REGISTER_SYMBOL_OK
2233 if (S_GET_SEGMENT (s) == reg_section)
2235 as_bad ("can't make register symbol `%s' global",
2240 s->bsym->flags |= BSF_GLOBAL;
2241 s->bsym->flags &= ~(BSF_LOCAL | BSF_WEAK);
2244 if (! an_external_name && S_GET_NAME(s)[0] != '.')
2245 an_external_name = S_GET_NAME (s);
2250 S_CLEAR_EXTERNAL (symbolS *s)
2252 if (LOCAL_SYMBOL_CHECK (s))
2254 if ((s->bsym->flags & BSF_WEAK) != 0)
2256 /* Let .weak override. */
2259 s->bsym->flags |= BSF_LOCAL;
2260 s->bsym->flags &= ~(BSF_GLOBAL | BSF_WEAK);
2264 S_SET_WEAK (symbolS *s)
2266 if (LOCAL_SYMBOL_CHECK (s))
2267 s = local_symbol_convert ((struct local_symbol *) s);
2268 #ifdef obj_set_weak_hook
2269 obj_set_weak_hook (s);
2271 s->bsym->flags |= BSF_WEAK;
2272 s->bsym->flags &= ~(BSF_GLOBAL | BSF_LOCAL);
2276 S_SET_WEAKREFR (symbolS *s)
2278 if (LOCAL_SYMBOL_CHECK (s))
2279 s = local_symbol_convert ((struct local_symbol *) s);
2280 s->sy_flags.sy_weakrefr = 1;
2281 /* If the alias was already used, make sure we mark the target as
2282 used as well, otherwise it might be dropped from the symbol
2283 table. This may have unintended side effects if the alias is
2284 later redirected to another symbol, such as keeping the unused
2285 previous target in the symbol table. Since it will be weak, it's
2287 if (s->sy_flags.sy_used)
2288 symbol_mark_used (s->sy_value.X_add_symbol);
2292 S_CLEAR_WEAKREFR (symbolS *s)
2294 if (LOCAL_SYMBOL_CHECK (s))
2296 s->sy_flags.sy_weakrefr = 0;
2300 S_SET_WEAKREFD (symbolS *s)
2302 if (LOCAL_SYMBOL_CHECK (s))
2303 s = local_symbol_convert ((struct local_symbol *) s);
2304 s->sy_flags.sy_weakrefd = 1;
2309 S_CLEAR_WEAKREFD (symbolS *s)
2311 if (LOCAL_SYMBOL_CHECK (s))
2313 if (s->sy_flags.sy_weakrefd)
2315 s->sy_flags.sy_weakrefd = 0;
2316 /* If a weakref target symbol is weak, then it was never
2317 referenced directly before, not even in a .global directive,
2318 so decay it to local. If it remains undefined, it will be
2319 later turned into a global, like any other undefined
2321 if (s->bsym->flags & BSF_WEAK)
2323 #ifdef obj_clear_weak_hook
2324 obj_clear_weak_hook (s);
2326 s->bsym->flags &= ~BSF_WEAK;
2327 s->bsym->flags |= BSF_LOCAL;
2333 S_SET_THREAD_LOCAL (symbolS *s)
2335 if (LOCAL_SYMBOL_CHECK (s))
2336 s = local_symbol_convert ((struct local_symbol *) s);
2337 if (bfd_is_com_section (s->bsym->section)
2338 && (s->bsym->flags & BSF_THREAD_LOCAL) != 0)
2340 s->bsym->flags |= BSF_THREAD_LOCAL;
2341 if ((s->bsym->flags & BSF_FUNCTION) != 0)
2342 as_bad (_("Accessing function `%s' as thread-local object"),
2344 else if (! bfd_is_und_section (s->bsym->section)
2345 && (s->bsym->section->flags & SEC_THREAD_LOCAL) == 0)
2346 as_bad (_("Accessing `%s' as thread-local object"),
2351 S_SET_NAME (symbolS *s, const char *name)
2353 if (LOCAL_SYMBOL_CHECK (s))
2355 ((struct local_symbol *) s)->lsy_name = name;
2358 s->bsym->name = name;
2362 S_SET_VOLATILE (symbolS *s)
2364 if (LOCAL_SYMBOL_CHECK (s))
2365 s = local_symbol_convert ((struct local_symbol *) s);
2366 s->sy_flags.sy_volatile = 1;
2370 S_CLEAR_VOLATILE (symbolS *s)
2372 if (!LOCAL_SYMBOL_CHECK (s))
2373 s->sy_flags.sy_volatile = 0;
2377 S_SET_FORWARD_REF (symbolS *s)
2379 if (LOCAL_SYMBOL_CHECK (s))
2380 s = local_symbol_convert ((struct local_symbol *) s);
2381 s->sy_flags.sy_forward_ref = 1;
2384 /* Return the previous symbol in a chain. */
2387 symbol_previous (symbolS *s)
2389 if (LOCAL_SYMBOL_CHECK (s))
2391 return s->sy_previous;
2394 /* Return the next symbol in a chain. */
2397 symbol_next (symbolS *s)
2399 if (LOCAL_SYMBOL_CHECK (s))
2404 /* Return a pointer to the value of a symbol as an expression. */
2407 symbol_get_value_expression (symbolS *s)
2409 if (LOCAL_SYMBOL_CHECK (s))
2410 s = local_symbol_convert ((struct local_symbol *) s);
2411 return &s->sy_value;
2414 /* Set the value of a symbol to an expression. */
2417 symbol_set_value_expression (symbolS *s, const expressionS *exp)
2419 if (LOCAL_SYMBOL_CHECK (s))
2420 s = local_symbol_convert ((struct local_symbol *) s);
2422 S_CLEAR_WEAKREFR (s);
2425 /* Return whether 2 symbols are the same. */
2428 symbol_same_p (symbolS *s1, symbolS *s2)
2430 if (s1->sy_flags.sy_local_symbol
2431 && local_symbol_converted_p ((struct local_symbol *) s1))
2432 s1 = local_symbol_get_real_symbol ((struct local_symbol *) s1);
2433 if (s2->sy_flags.sy_local_symbol
2434 && local_symbol_converted_p ((struct local_symbol *) s2))
2435 s2 = local_symbol_get_real_symbol ((struct local_symbol *) s2);
2439 /* Return a pointer to the X_add_number component of a symbol. */
2442 symbol_X_add_number (symbolS *s)
2444 if (LOCAL_SYMBOL_CHECK (s))
2445 return (offsetT *) &((struct local_symbol *) s)->lsy_value;
2447 return &s->sy_value.X_add_number;
2450 /* Set the value of SYM to the current position in the current segment. */
2453 symbol_set_value_now (symbolS *sym)
2455 S_SET_SEGMENT (sym, now_seg);
2456 S_SET_VALUE (sym, frag_now_fix ());
2457 symbol_set_frag (sym, frag_now);
2460 /* Set the frag of a symbol. */
2463 symbol_set_frag (symbolS *s, fragS *f)
2465 if (LOCAL_SYMBOL_CHECK (s))
2467 local_symbol_set_frag ((struct local_symbol *) s, f);
2471 S_CLEAR_WEAKREFR (s);
2474 /* Return the frag of a symbol. */
2477 symbol_get_frag (symbolS *s)
2479 if (LOCAL_SYMBOL_CHECK (s))
2480 return local_symbol_get_frag ((struct local_symbol *) s);
2484 /* Mark a symbol as having been used. */
2487 symbol_mark_used (symbolS *s)
2489 if (LOCAL_SYMBOL_CHECK (s))
2491 s->sy_flags.sy_used = 1;
2492 if (S_IS_WEAKREFR (s))
2493 symbol_mark_used (s->sy_value.X_add_symbol);
2496 /* Clear the mark of whether a symbol has been used. */
2499 symbol_clear_used (symbolS *s)
2501 if (LOCAL_SYMBOL_CHECK (s))
2502 s = local_symbol_convert ((struct local_symbol *) s);
2503 s->sy_flags.sy_used = 0;
2506 /* Return whether a symbol has been used. */
2509 symbol_used_p (symbolS *s)
2511 if (LOCAL_SYMBOL_CHECK (s))
2513 return s->sy_flags.sy_used;
2516 /* Mark a symbol as having been used in a reloc. */
2519 symbol_mark_used_in_reloc (symbolS *s)
2521 if (LOCAL_SYMBOL_CHECK (s))
2522 s = local_symbol_convert ((struct local_symbol *) s);
2523 s->sy_flags.sy_used_in_reloc = 1;
2526 /* Clear the mark of whether a symbol has been used in a reloc. */
2529 symbol_clear_used_in_reloc (symbolS *s)
2531 if (LOCAL_SYMBOL_CHECK (s))
2533 s->sy_flags.sy_used_in_reloc = 0;
2536 /* Return whether a symbol has been used in a reloc. */
2539 symbol_used_in_reloc_p (symbolS *s)
2541 if (LOCAL_SYMBOL_CHECK (s))
2543 return s->sy_flags.sy_used_in_reloc;
2546 /* Mark a symbol as an MRI common symbol. */
2549 symbol_mark_mri_common (symbolS *s)
2551 if (LOCAL_SYMBOL_CHECK (s))
2552 s = local_symbol_convert ((struct local_symbol *) s);
2553 s->sy_flags.sy_mri_common = 1;
2556 /* Clear the mark of whether a symbol is an MRI common symbol. */
2559 symbol_clear_mri_common (symbolS *s)
2561 if (LOCAL_SYMBOL_CHECK (s))
2563 s->sy_flags.sy_mri_common = 0;
2566 /* Return whether a symbol is an MRI common symbol. */
2569 symbol_mri_common_p (symbolS *s)
2571 if (LOCAL_SYMBOL_CHECK (s))
2573 return s->sy_flags.sy_mri_common;
2576 /* Mark a symbol as having been written. */
2579 symbol_mark_written (symbolS *s)
2581 if (LOCAL_SYMBOL_CHECK (s))
2583 s->sy_flags.sy_written = 1;
2586 /* Clear the mark of whether a symbol has been written. */
2589 symbol_clear_written (symbolS *s)
2591 if (LOCAL_SYMBOL_CHECK (s))
2593 s->sy_flags.sy_written = 0;
2596 /* Return whether a symbol has been written. */
2599 symbol_written_p (symbolS *s)
2601 if (LOCAL_SYMBOL_CHECK (s))
2603 return s->sy_flags.sy_written;
2606 /* Mark a symbol has having been resolved. */
2609 symbol_mark_resolved (symbolS *s)
2611 if (LOCAL_SYMBOL_CHECK (s))
2613 local_symbol_mark_resolved ((struct local_symbol *) s);
2616 s->sy_flags.sy_resolved = 1;
2619 /* Return whether a symbol has been resolved. */
2622 symbol_resolved_p (symbolS *s)
2624 if (LOCAL_SYMBOL_CHECK (s))
2625 return local_symbol_resolved_p ((struct local_symbol *) s);
2626 return s->sy_flags.sy_resolved;
2629 /* Return whether a symbol is a section symbol. */
2632 symbol_section_p (symbolS *s ATTRIBUTE_UNUSED)
2634 if (LOCAL_SYMBOL_CHECK (s))
2636 return (s->bsym->flags & BSF_SECTION_SYM) != 0;
2639 /* Return whether a symbol is equated to another symbol. */
2642 symbol_equated_p (symbolS *s)
2644 if (LOCAL_SYMBOL_CHECK (s))
2646 return s->sy_value.X_op == O_symbol;
2649 /* Return whether a symbol is equated to another symbol, and should be
2650 treated specially when writing out relocs. */
2653 symbol_equated_reloc_p (symbolS *s)
2655 if (LOCAL_SYMBOL_CHECK (s))
2657 /* X_op_symbol, normally not used for O_symbol, is set by
2658 resolve_symbol_value to flag expression syms that have been
2660 return (s->sy_value.X_op == O_symbol
2661 #if defined (OBJ_COFF) && defined (TE_PE)
2664 && ((s->sy_flags.sy_resolved && s->sy_value.X_op_symbol != NULL)
2665 || ! S_IS_DEFINED (s)
2666 || S_IS_COMMON (s)));
2669 /* Return whether a symbol has a constant value. */
2672 symbol_constant_p (symbolS *s)
2674 if (LOCAL_SYMBOL_CHECK (s))
2676 return s->sy_value.X_op == O_constant;
2679 /* Return whether a symbol was cloned and thus removed from the global
2683 symbol_shadow_p (symbolS *s)
2685 if (LOCAL_SYMBOL_CHECK (s))
2687 return s->sy_next == s;
2690 /* Return the BFD symbol for a symbol. */
2693 symbol_get_bfdsym (symbolS *s)
2695 if (LOCAL_SYMBOL_CHECK (s))
2696 s = local_symbol_convert ((struct local_symbol *) s);
2700 /* Set the BFD symbol for a symbol. */
2703 symbol_set_bfdsym (symbolS *s, asymbol *bsym)
2705 if (LOCAL_SYMBOL_CHECK (s))
2706 s = local_symbol_convert ((struct local_symbol *) s);
2707 /* Usually, it is harmless to reset a symbol to a BFD section
2708 symbol. For example, obj_elf_change_section sets the BFD symbol
2709 of an old symbol with the newly created section symbol. But when
2710 we have multiple sections with the same name, the newly created
2711 section may have the same name as an old section. We check if the
2712 old symbol has been already marked as a section symbol before
2714 if ((s->bsym->flags & BSF_SECTION_SYM) == 0)
2716 /* else XXX - What do we do now ? */
2719 #ifdef OBJ_SYMFIELD_TYPE
2721 /* Get a pointer to the object format information for a symbol. */
2724 symbol_get_obj (symbolS *s)
2726 if (LOCAL_SYMBOL_CHECK (s))
2727 s = local_symbol_convert ((struct local_symbol *) s);
2731 /* Set the object format information for a symbol. */
2734 symbol_set_obj (symbolS *s, OBJ_SYMFIELD_TYPE *o)
2736 if (LOCAL_SYMBOL_CHECK (s))
2737 s = local_symbol_convert ((struct local_symbol *) s);
2741 #endif /* OBJ_SYMFIELD_TYPE */
2743 #ifdef TC_SYMFIELD_TYPE
2745 /* Get a pointer to the processor information for a symbol. */
2748 symbol_get_tc (symbolS *s)
2750 if (LOCAL_SYMBOL_CHECK (s))
2751 s = local_symbol_convert ((struct local_symbol *) s);
2755 /* Set the processor information for a symbol. */
2758 symbol_set_tc (symbolS *s, TC_SYMFIELD_TYPE *o)
2760 if (LOCAL_SYMBOL_CHECK (s))
2761 s = local_symbol_convert ((struct local_symbol *) s);
2765 #endif /* TC_SYMFIELD_TYPE */
2770 symbol_lastP = NULL;
2771 symbol_rootP = NULL; /* In case we have 0 symbols (!!) */
2772 sy_hash = hash_new ();
2773 local_hash = hash_new ();
2775 memset ((char *) (&abs_symbol), '\0', sizeof (abs_symbol));
2776 #if defined (EMIT_SECTION_SYMBOLS) || !defined (RELOC_REQUIRES_SYMBOL)
2777 abs_symbol.bsym = bfd_abs_section.symbol;
2779 abs_symbol.sy_value.X_op = O_constant;
2780 abs_symbol.sy_frag = &zero_address_frag;
2782 if (LOCAL_LABELS_FB)
2787 dot_symbol_init (void)
2789 dot_symbol.bsym = bfd_make_empty_symbol (stdoutput);
2790 if (dot_symbol.bsym == NULL)
2791 as_fatal ("bfd_make_empty_symbol: %s", bfd_errmsg (bfd_get_error ()));
2792 dot_symbol.bsym->name = ".";
2793 dot_symbol.sy_flags.sy_forward_ref = 1;
2794 dot_symbol.sy_value.X_op = O_constant;
2799 /* Maximum indent level.
2800 Available for modification inside a gdb session. */
2801 static int max_indent_level = 8;
2804 print_symbol_value_1 (FILE *file, symbolS *sym)
2806 const char *name = S_GET_NAME (sym);
2807 if (!name || !name[0])
2809 fprintf (file, "sym ");
2810 fprintf_vma (file, (bfd_vma) ((bfd_hostptr_t) sym));
2811 fprintf (file, " %s", name);
2813 if (LOCAL_SYMBOL_CHECK (sym))
2815 struct local_symbol *locsym = (struct local_symbol *) sym;
2817 if (local_symbol_get_frag (locsym) != & zero_address_frag
2818 && local_symbol_get_frag (locsym) != NULL)
2820 fprintf (file, " frag ");
2821 fprintf_vma (file, (bfd_vma) ((bfd_hostptr_t) local_symbol_get_frag (locsym)));
2823 if (local_symbol_resolved_p (locsym))
2824 fprintf (file, " resolved");
2825 fprintf (file, " local");
2829 if (sym->sy_frag != &zero_address_frag)
2831 fprintf (file, " frag ");
2832 fprintf_vma (file, (bfd_vma) ((bfd_hostptr_t) sym->sy_frag));
2834 if (sym->sy_flags.sy_written)
2835 fprintf (file, " written");
2836 if (sym->sy_flags.sy_resolved)
2837 fprintf (file, " resolved");
2838 else if (sym->sy_flags.sy_resolving)
2839 fprintf (file, " resolving");
2840 if (sym->sy_flags.sy_used_in_reloc)
2841 fprintf (file, " used-in-reloc");
2842 if (sym->sy_flags.sy_used)
2843 fprintf (file, " used");
2844 if (S_IS_LOCAL (sym))
2845 fprintf (file, " local");
2846 if (S_IS_EXTERNAL (sym))
2847 fprintf (file, " extern");
2848 if (S_IS_WEAK (sym))
2849 fprintf (file, " weak");
2850 if (S_IS_DEBUG (sym))
2851 fprintf (file, " debug");
2852 if (S_IS_DEFINED (sym))
2853 fprintf (file, " defined");
2855 if (S_IS_WEAKREFR (sym))
2856 fprintf (file, " weakrefr");
2857 if (S_IS_WEAKREFD (sym))
2858 fprintf (file, " weakrefd");
2859 fprintf (file, " %s", segment_name (S_GET_SEGMENT (sym)));
2860 if (symbol_resolved_p (sym))
2862 segT s = S_GET_SEGMENT (sym);
2864 if (s != undefined_section
2865 && s != expr_section)
2866 fprintf (file, " %lx", (unsigned long) S_GET_VALUE (sym));
2868 else if (indent_level < max_indent_level
2869 && S_GET_SEGMENT (sym) != undefined_section)
2872 fprintf (file, "\n%*s<", indent_level * 4, "");
2873 if (LOCAL_SYMBOL_CHECK (sym))
2874 fprintf (file, "constant %lx",
2875 (unsigned long) ((struct local_symbol *) sym)->lsy_value);
2877 print_expr_1 (file, &sym->sy_value);
2878 fprintf (file, ">");
2885 print_symbol_value (symbolS *sym)
2888 print_symbol_value_1 (stderr, sym);
2889 fprintf (stderr, "\n");
2893 print_binary (FILE *file, const char *name, expressionS *exp)
2896 fprintf (file, "%s\n%*s<", name, indent_level * 4, "");
2897 print_symbol_value_1 (file, exp->X_add_symbol);
2898 fprintf (file, ">\n%*s<", indent_level * 4, "");
2899 print_symbol_value_1 (file, exp->X_op_symbol);
2900 fprintf (file, ">");
2905 print_expr_1 (FILE *file, expressionS *exp)
2907 fprintf (file, "expr ");
2908 fprintf_vma (file, (bfd_vma) ((bfd_hostptr_t) exp));
2909 fprintf (file, " ");
2913 fprintf (file, "illegal");
2916 fprintf (file, "absent");
2919 fprintf (file, "constant %lx", (unsigned long) exp->X_add_number);
2923 fprintf (file, "symbol\n%*s<", indent_level * 4, "");
2924 print_symbol_value_1 (file, exp->X_add_symbol);
2925 fprintf (file, ">");
2927 if (exp->X_add_number)
2928 fprintf (file, "\n%*s%lx", indent_level * 4, "",
2929 (unsigned long) exp->X_add_number);
2933 fprintf (file, "register #%d", (int) exp->X_add_number);
2936 fprintf (file, "big");
2939 fprintf (file, "uminus -<");
2941 print_symbol_value_1 (file, exp->X_add_symbol);
2942 fprintf (file, ">");
2943 goto maybe_print_addnum;
2945 fprintf (file, "bit_not");
2948 print_binary (file, "multiply", exp);
2951 print_binary (file, "divide", exp);
2954 print_binary (file, "modulus", exp);
2957 print_binary (file, "lshift", exp);
2960 print_binary (file, "rshift", exp);
2962 case O_bit_inclusive_or:
2963 print_binary (file, "bit_ior", exp);
2965 case O_bit_exclusive_or:
2966 print_binary (file, "bit_xor", exp);
2969 print_binary (file, "bit_and", exp);
2972 print_binary (file, "eq", exp);
2975 print_binary (file, "ne", exp);
2978 print_binary (file, "lt", exp);
2981 print_binary (file, "le", exp);
2984 print_binary (file, "ge", exp);
2987 print_binary (file, "gt", exp);
2990 print_binary (file, "logical_and", exp);
2993 print_binary (file, "logical_or", exp);
2997 fprintf (file, "add\n%*s<", indent_level * 4, "");
2998 print_symbol_value_1 (file, exp->X_add_symbol);
2999 fprintf (file, ">\n%*s<", indent_level * 4, "");
3000 print_symbol_value_1 (file, exp->X_op_symbol);
3001 fprintf (file, ">");
3002 goto maybe_print_addnum;
3005 fprintf (file, "subtract\n%*s<", indent_level * 4, "");
3006 print_symbol_value_1 (file, exp->X_add_symbol);
3007 fprintf (file, ">\n%*s<", indent_level * 4, "");
3008 print_symbol_value_1 (file, exp->X_op_symbol);
3009 fprintf (file, ">");
3010 goto maybe_print_addnum;
3012 fprintf (file, "{unknown opcode %d}", (int) exp->X_op);
3019 print_expr (expressionS *exp)
3021 print_expr_1 (stderr, exp);
3022 fprintf (stderr, "\n");
3026 symbol_print_statistics (FILE *file)
3028 hash_print_statistics (file, "symbol table", sy_hash);
3029 hash_print_statistics (file, "mini local symbol table", local_hash);
3030 fprintf (file, "%lu mini local symbols created, %lu converted\n",
3031 local_symbol_count, local_symbol_conversion_count);
3034 #ifdef OBJ_COMPLEX_RELC
3036 /* Convert given symbol to a new complex-relocation symbol name. This
3037 may be a recursive function, since it might be called for non-leaf
3038 nodes (plain symbols) in the expression tree. The caller owns the
3039 returning string, so should free it eventually. Errors are
3040 indicated via as_bad and a NULL return value. The given symbol
3041 is marked with sy_used_in_reloc. */
3044 symbol_relc_make_sym (symbolS * sym)
3046 char * terminal = NULL;
3051 gas_assert (sym != NULL);
3053 /* Recurse to symbol_relc_make_expr if this symbol
3054 is defined as an expression or a plain value. */
3055 if ( S_GET_SEGMENT (sym) == expr_section
3056 || S_GET_SEGMENT (sym) == absolute_section)
3057 return symbol_relc_make_expr (& sym->sy_value);
3059 /* This may be a "fake symbol" L0\001, referring to ".".
3060 Write out a special null symbol to refer to this position. */
3061 if (! strcmp (S_GET_NAME (sym), FAKE_LABEL_NAME))
3062 return xstrdup (".");
3064 /* We hope this is a plain leaf symbol. Construct the encoding
3065 as {S,s}II...:CCCCCCC....
3066 where 'S'/'s' means section symbol / plain symbol
3067 III is decimal for the symbol name length
3068 CCC is the symbol name itself. */
3069 symbol_mark_used_in_reloc (sym);
3071 sname = S_GET_NAME (sym);
3072 sname_len = strlen (sname);
3073 typetag = symbol_section_p (sym) ? 'S' : 's';
3075 terminal = xmalloc (1 /* S or s */
3076 + 8 /* sname_len in decimal */
3078 + sname_len /* name itself */
3081 sprintf (terminal, "%c%d:%s", typetag, sname_len, sname);
3085 /* Convert given value to a new complex-relocation symbol name. This
3086 is a non-recursive function, since it is be called for leaf nodes
3087 (plain values) in the expression tree. The caller owns the
3088 returning string, so should free() it eventually. No errors. */
3091 symbol_relc_make_value (offsetT val)
3093 char * terminal = xmalloc (28); /* Enough for long long. */
3096 bfd_sprintf_vma (stdoutput, terminal + 1, val);
3100 /* Convert given expression to a new complex-relocation symbol name.
3101 This is a recursive function, since it traverses the entire given
3102 expression tree. The caller owns the returning string, so should
3103 free() it eventually. Errors are indicated via as_bad() and a NULL
3107 symbol_relc_make_expr (expressionS * exp)
3109 char * opstr = NULL; /* Operator prefix string. */
3110 int arity = 0; /* Arity of this operator. */
3111 char * operands[3]; /* Up to three operands. */
3112 char * concat_string = NULL;
3114 operands[0] = operands[1] = operands[2] = NULL;
3116 gas_assert (exp != NULL);
3118 /* Match known operators -> fill in opstr, arity, operands[] and fall
3119 through to construct subexpression fragments; may instead return
3120 string directly for leaf nodes. */
3122 /* See expr.h for the meaning of all these enums. Many operators
3123 have an unnatural arity (X_add_number implicitly added). The
3124 conversion logic expands them to explicit "+" subexpressions. */
3129 as_bad ("Unknown expression operator (enum %d)", exp->X_op);
3134 return symbol_relc_make_value (exp->X_add_number);
3137 if (exp->X_add_number)
3141 operands[0] = symbol_relc_make_sym (exp->X_add_symbol);
3142 operands[1] = symbol_relc_make_value (exp->X_add_number);
3146 return symbol_relc_make_sym (exp->X_add_symbol);
3148 /* Helper macros for nesting nodes. */
3150 #define HANDLE_XADD_OPT1(str_) \
3151 if (exp->X_add_number) \
3154 opstr = "+:" str_; \
3155 operands[0] = symbol_relc_make_sym (exp->X_add_symbol); \
3156 operands[1] = symbol_relc_make_value (exp->X_add_number); \
3163 operands[0] = symbol_relc_make_sym (exp->X_add_symbol); \
3167 #define HANDLE_XADD_OPT2(str_) \
3168 if (exp->X_add_number) \
3171 opstr = "+:" str_; \
3172 operands[0] = symbol_relc_make_sym (exp->X_add_symbol); \
3173 operands[1] = symbol_relc_make_sym (exp->X_op_symbol); \
3174 operands[2] = symbol_relc_make_value (exp->X_add_number); \
3180 operands[0] = symbol_relc_make_sym (exp->X_add_symbol); \
3181 operands[1] = symbol_relc_make_sym (exp->X_op_symbol); \
3185 /* Nesting nodes. */
3187 case O_uminus: HANDLE_XADD_OPT1 ("0-");
3188 case O_bit_not: HANDLE_XADD_OPT1 ("~");
3189 case O_logical_not: HANDLE_XADD_OPT1 ("!");
3190 case O_multiply: HANDLE_XADD_OPT2 ("*");
3191 case O_divide: HANDLE_XADD_OPT2 ("/");
3192 case O_modulus: HANDLE_XADD_OPT2 ("%");
3193 case O_left_shift: HANDLE_XADD_OPT2 ("<<");
3194 case O_right_shift: HANDLE_XADD_OPT2 (">>");
3195 case O_bit_inclusive_or: HANDLE_XADD_OPT2 ("|");
3196 case O_bit_exclusive_or: HANDLE_XADD_OPT2 ("^");
3197 case O_bit_and: HANDLE_XADD_OPT2 ("&");
3198 case O_add: HANDLE_XADD_OPT2 ("+");
3199 case O_subtract: HANDLE_XADD_OPT2 ("-");
3200 case O_eq: HANDLE_XADD_OPT2 ("==");
3201 case O_ne: HANDLE_XADD_OPT2 ("!=");
3202 case O_lt: HANDLE_XADD_OPT2 ("<");
3203 case O_le: HANDLE_XADD_OPT2 ("<=");
3204 case O_ge: HANDLE_XADD_OPT2 (">=");
3205 case O_gt: HANDLE_XADD_OPT2 (">");
3206 case O_logical_and: HANDLE_XADD_OPT2 ("&&");
3207 case O_logical_or: HANDLE_XADD_OPT2 ("||");
3210 /* Validate & reject early. */
3211 if (arity >= 1 && ((operands[0] == NULL) || (strlen (operands[0]) == 0)))
3213 if (arity >= 2 && ((operands[1] == NULL) || (strlen (operands[1]) == 0)))
3215 if (arity >= 3 && ((operands[2] == NULL) || (strlen (operands[2]) == 0)))
3219 concat_string = NULL;
3222 /* Allocate new string; include inter-operand padding gaps etc. */
3223 concat_string = xmalloc (strlen (opstr)
3225 + (arity >= 1 ? (strlen (operands[0]) + 1 ) : 0)
3226 + (arity >= 2 ? (strlen (operands[1]) + 1 ) : 0)
3227 + (arity >= 3 ? (strlen (operands[2]) + 0 ) : 0)
3229 gas_assert (concat_string != NULL);
3231 /* Format the thing. */
3232 sprintf (concat_string,
3233 (arity == 0 ? "%s" :
3234 arity == 1 ? "%s:%s" :
3235 arity == 2 ? "%s:%s:%s" :
3236 /* arity == 3 */ "%s:%s:%s:%s"),
3237 opstr, operands[0], operands[1], operands[2]);
3240 /* Free operand strings (not opstr). */
3241 if (arity >= 1) xfree (operands[0]);
3242 if (arity >= 2) xfree (operands[1]);
3243 if (arity >= 3) xfree (operands[2]);
3245 return concat_string;