* symbols.c (S_GET_VALUE): Remove non-BFD assembler recursion guard.
[binutils.git] / gas / symbols.c
blobf781a3574bf93d7528f878bcc6336605e8e34776
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)
11 any later version.
13 GAS is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with GAS; see the file COPYING. If not, write to the Free
20 Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
21 02110-1301, USA. */
23 /* #define DEBUG_SYMS / * to debug symbol list maintenance. */
25 #include "as.h"
27 #include "safe-ctype.h"
28 #include "obstack.h" /* For "symbols.h" */
29 #include "subsegs.h"
31 #include "struc-symbol.h"
33 /* This is non-zero if symbols are case sensitive, which is the
34 default. */
35 int symbols_case_sensitive = 1;
37 #ifndef WORKING_DOT_WORD
38 extern int new_broken_words;
39 #endif
41 /* symbol-name => struct symbol pointer */
42 static struct hash_control *sy_hash;
44 /* Table of local symbols. */
45 static struct hash_control *local_hash;
47 /* Below are commented in "symbols.h". */
48 symbolS *symbol_rootP;
49 symbolS *symbol_lastP;
50 symbolS abs_symbol;
52 #ifdef DEBUG_SYMS
53 #define debug_verify_symchain verify_symbol_chain
54 #else
55 #define debug_verify_symchain(root, last) ((void) 0)
56 #endif
58 #define DOLLAR_LABEL_CHAR '\001'
59 #define LOCAL_LABEL_CHAR '\002'
61 struct obstack notes;
62 #ifdef USE_UNIQUE
63 /* The name of an external symbol which is
64 used to make weak PE symbol names unique. */
65 const char * an_external_name;
66 #endif
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
78 chain.
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. */
85 symbolS *
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)
94 abort ();
96 symbol_append (symbolP, symbol_lastP, &symbol_rootP, &symbol_lastP);
98 return symbolP;
101 /* Save a symbol name on a permanent obstack, and convert it according
102 to the object file format. */
104 static char *
105 save_symbol_name (const char *name)
107 unsigned int name_length;
108 char *ret;
110 name_length = strlen (name) + 1; /* +1 for \0. */
111 obstack_grow (&notes, name, name_length);
112 ret = obstack_finish (&notes);
114 #ifdef tc_canonicalize_symbol_name
115 ret = tc_canonicalize_symbol_name (ret);
116 #endif
118 if (! symbols_case_sensitive)
120 char *s;
122 for (s = ret; *s != '\0'; s++)
123 *s = TOUPPER (*s);
126 return ret;
129 symbolS *
130 symbol_create (const char *name, /* It is copied, the caller can destroy/modify. */
131 segT segment, /* Segment identifier (SEG_<something>). */
132 valueT valu, /* Symbol value. */
133 fragS *frag /* Associated fragment. */)
135 char *preserved_copy_of_name;
136 symbolS *symbolP;
138 preserved_copy_of_name = save_symbol_name (name);
140 symbolP = (symbolS *) obstack_alloc (&notes, 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);
161 #endif
163 return 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) \
182 (s->bsym == NULL \
183 ? (local_symbol_converted_p ((struct local_symbol *) s) \
184 ? (s = local_symbol_get_real_symbol ((struct local_symbol *) s), \
185 0) \
186 : 1) \
187 : 0)
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)
194 char *name_copy;
195 struct local_symbol *ret;
197 ++local_symbol_count;
199 name_copy = save_symbol_name (name);
201 ret = (struct local_symbol *) obstack_alloc (&notes, 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);
210 return ret;
213 /* Convert a local symbol into a real symbol. Note that we do not
214 reclaim the space used by the local symbol. */
216 static symbolS *
217 local_symbol_convert (struct local_symbol *locsym)
219 symbolS *ret;
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. */
234 ret->sy_used = 1;
236 #ifdef TC_LOCAL_SYMFIELD_CONVERT
237 TC_LOCAL_SYMFIELD_CONVERT (locsym, ret);
238 #endif
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);
247 return ret;
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). */
255 symbolS *
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
263 defined. */
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;
272 int possible_bytes;
273 fragS *frag_tmp;
274 char *frag_opcode;
276 if (now_seg == absolute_section)
278 as_bad (_("cannot define symbol `%s' in absolute section"), sym_name);
279 return NULL;
282 possible_bytes = (md_short_jump_size
283 + new_broken_words * md_long_jump_size);
285 frag_tmp = frag_now;
286 frag_opcode = frag_var (rs_broken_word,
287 possible_bytes,
288 possible_bytes,
289 (relax_substateT) 0,
290 (symbolS *) broken_words,
291 (offsetT) 0,
292 NULL);
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. */
297 while (frag_tmp
298 && (frag_tmp->fr_type != rs_broken_word
299 || frag_tmp->fr_opcode))
300 frag_tmp = frag_tmp->fr_next;
301 know (frag_tmp);
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))
315 return symbolP;
316 #endif
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);
328 return symbolP;
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;
341 #ifdef OBJ_VMS
342 S_SET_OTHER (symbolP, const_flag);
343 #endif
344 S_SET_VALUE (symbolP, (valueT) frag_now_fix ());
345 S_SET_SEGMENT (symbolP, now_seg);
346 #ifdef N_UNDF
347 know (N_UNDF == 0);
348 #endif /* if we have one, it better be zero. */
351 else
353 /* There are still several cases to check:
355 A .comm/.lcomm symbol being redefined as initialized
356 data is OK
358 A .comm/.lcomm symbol being redefined with a larger
359 size is also OK
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
378 this symbol. */
379 if (S_GET_VALUE (symbolP)
380 < ((unsigned) frag_now_fix ()))
382 S_SET_VALUE (symbolP, (valueT) frag_now_fix ());
385 else
387 /* It is a .comm/.lcomm being converted to initialized
388 data. */
389 symbolP->sy_frag = frag_now;
390 #ifdef OBJ_VMS
391 S_SET_OTHER (symbolP, const_flag);
392 #endif
393 S_SET_VALUE (symbolP, (valueT) frag_now_fix ());
394 S_SET_SEGMENT (symbolP, now_seg); /* Keep N_EXT bit. */
397 else
399 #if (!defined (OBJ_AOUT) && !defined (OBJ_MAYBE_AOUT) \
400 && !defined (OBJ_BOUT) && !defined (OBJ_MAYBE_BOUT))
401 static const char *od_buf = "";
402 #else
403 char od_buf[100];
404 od_buf[0] = '\0';
405 if (OUTPUT_FLAVOR == bfd_target_aout_flavour)
406 sprintf (od_buf, "%d.%d.",
407 S_GET_OTHER (symbolP),
408 S_GET_DESC (symbolP));
409 #endif
410 as_bad (_("symbol `%s' is already defined as \"%s\"/%s%ld"),
411 sym_name,
412 segment_name (S_GET_SEGMENT (symbolP)),
413 od_buf,
414 (long) S_GET_VALUE (symbolP));
416 } /* if the undefined symbol has no value */
418 else
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 (),
432 frag_now);
434 else
436 symbolP = symbol_new (sym_name, now_seg, (valueT) frag_now_fix (),
437 frag_now);
438 #ifdef OBJ_VMS
439 S_SET_OTHER (symbolP, const_flag);
440 #endif /* OBJ_VMS */
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;
459 #ifdef tc_frob_label
460 tc_frob_label (symbolP);
461 #endif
462 #ifdef obj_frob_label
463 obj_frob_label (symbolP);
464 #endif
466 return symbolP;
469 /* Die if we can't insert the symbol. */
471 void
472 symbol_table_insert (symbolS *symbolP)
474 register const char *error_string;
476 know (symbolP);
477 know (S_GET_NAME (symbolP));
479 if (LOCAL_SYMBOL_CHECK (symbolP))
481 error_string = hash_jam (local_hash, S_GET_NAME (symbolP),
482 (PTR) symbolP);
483 if (error_string != NULL)
484 as_fatal (_("inserting \"%s\" into symbol table failed: %s"),
485 S_GET_NAME (symbolP), error_string);
486 return;
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);
493 } /* on error */
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. */
499 symbolS *
500 symbol_find_or_make (const char *name)
502 register symbolS *symbolP;
504 symbolP = symbol_find (name);
506 if (symbolP == NULL)
508 if (! flag_keep_locals && bfd_is_local_label_name (stdoutput, name))
510 symbolP = md_undefined_symbol ((char *) name);
511 if (symbolP != NULL)
512 return symbolP;
514 symbolP = (symbolS *) local_symbol_make (name, undefined_section,
515 (valueT) 0,
516 &zero_address_frag);
517 return symbolP;
520 symbolP = symbol_make (name);
522 symbol_table_insert (symbolP);
523 } /* if symbol wasn't found */
525 return (symbolP);
528 symbolS *
529 symbol_make (const char *name)
531 symbolS *symbolP;
533 /* Let the machine description default it, e.g. for register names. */
534 symbolP = md_undefined_symbol ((char *) name);
536 if (!symbolP)
537 symbolP = symbol_new (name, undefined_section, (valueT) 0, &zero_address_frag);
539 return (symbolP);
542 symbolS *
543 symbol_clone (symbolS *orgsymP, int replace)
545 symbolS *newsymP;
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 (&notes, sizeof (*newsymP));
559 *newsymP = *orgsymP;
560 bsymnew = bfd_make_empty_symbol (bfd_asymbol_bfd (bsymorg));
561 if (bsymnew == NULL)
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);
573 #endif
575 #ifdef tc_symbol_clone_hook
576 tc_symbol_clone_hook (newsymP, orgsymP);
577 #endif
579 if (replace)
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);
598 return 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
606 symbolS *
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)
615 is_forward = 1;
617 if (is_forward)
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;
647 return symbolP;
650 symbolS *
651 symbol_temp_new (segT seg, valueT ofs, fragS *frag)
653 return symbol_new (FAKE_LABEL_NAME, seg, ofs, frag);
656 symbolS *
657 symbol_temp_new_now (void)
659 return symbol_temp_new (now_seg, frag_now_fix (), frag_now);
662 symbolS *
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. */
673 symbolS *
674 symbol_find_exact (const char *name)
676 return symbol_find_exact_noref (name, 0);
679 symbolS *
680 symbol_find_exact_noref (const char *name, int noref)
682 struct local_symbol *locsym;
683 symbolS* sym;
685 locsym = (struct local_symbol *) hash_find (local_hash, name);
686 if (locsym != NULL)
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. */
696 if (sym && ! noref)
697 S_CLEAR_WEAKREFD (sym);
699 return sym;
702 symbolS *
703 symbol_find (const char *name)
705 return symbol_find_noref (name, 0);
708 symbolS *
709 symbol_find_noref (const char *name, int noref)
711 #ifdef tc_canonicalize_symbol_name
713 char *copy;
714 size_t len = strlen (name) + 1;
716 copy = (char *) alloca (len);
717 memcpy (copy, name, len);
718 name = tc_canonicalize_symbol_name (copy);
720 #endif
722 if (! symbols_case_sensitive)
724 char *copy;
725 const char *orig;
726 unsigned char c;
728 orig = name;
729 name = copy = (char *) alloca (strlen (name) + 1);
731 while ((c = *orig++) != '\0')
733 *copy++ = TOUPPER (c);
735 *copy = '\0';
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.
745 xoxorich. */
747 /* Link symbol ADDME after symbol TARGET in the chain. */
749 void
750 symbol_append (symbolS *addme, symbolS *target,
751 symbolS **rootPP, symbolS **lastPP)
753 if (LOCAL_SYMBOL_CHECK (addme))
754 abort ();
755 if (target != NULL && LOCAL_SYMBOL_CHECK (target))
756 abort ();
758 if (target == NULL)
760 know (*rootPP == NULL);
761 know (*lastPP == NULL);
762 addme->sy_next = NULL;
763 addme->sy_previous = NULL;
764 *rootPP = addme;
765 *lastPP = addme;
766 return;
767 } /* if the list is empty */
769 if (target->sy_next != NULL)
771 target->sy_next->sy_previous = addme;
773 else
775 know (*lastPP == target);
776 *lastPP = addme;
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. */
788 void
789 symbol_clear_list_pointers (symbolS *symbolP)
791 if (LOCAL_SYMBOL_CHECK (symbolP))
792 abort ();
793 symbolP->sy_next = NULL;
794 symbolP->sy_previous = NULL;
797 /* Remove SYMBOLP from the list. */
799 void
800 symbol_remove (symbolS *symbolP, symbolS **rootPP, symbolS **lastPP)
802 if (LOCAL_SYMBOL_CHECK (symbolP))
803 abort ();
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;
818 } /* if not last */
820 if (symbolP->sy_previous != NULL)
822 symbolP->sy_previous->sy_next = symbolP->sy_next;
823 } /* if not first */
825 debug_verify_symchain (*rootPP, *lastPP);
828 /* Link symbol ADDME before symbol TARGET in the chain. */
830 void
831 symbol_insert (symbolS *addme, symbolS *target,
832 symbolS **rootPP, symbolS **lastPP ATTRIBUTE_UNUSED)
834 if (LOCAL_SYMBOL_CHECK (addme))
835 abort ();
836 if (LOCAL_SYMBOL_CHECK (target))
837 abort ();
839 if (target->sy_previous != NULL)
841 target->sy_previous->sy_next = addme;
843 else
845 know (*rootPP == target);
846 *rootPP = addme;
847 } /* if not first */
849 addme->sy_previous = target->sy_previous;
850 target->sy_previous = addme;
851 addme->sy_next = target;
853 debug_verify_symchain (*rootPP, *lastPP);
856 void
857 verify_symbol_chain (symbolS *rootP, symbolS *lastP)
859 symbolS *symbolP = rootP;
861 if (symbolP == NULL)
862 return;
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);
873 static void
874 report_op_error (symbolS *symp, symbolS *left, symbolS *right)
876 char *file;
877 unsigned int line;
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"),
886 S_GET_NAME (left));
887 if (seg_right == undefined_section)
888 as_bad_where (file, line,
889 _("undefined symbol `%s' in operation"),
890 S_GET_NAME (right));
891 if (seg_left != undefined_section
892 && seg_right != undefined_section)
894 if (right)
895 as_bad_where (file, line,
896 _("invalid sections for operation on `%s' and `%s'"),
897 S_GET_NAME (left), S_GET_NAME (right));
898 else
899 as_bad_where (file, line,
900 _("invalid section for operation on `%s'"),
901 S_GET_NAME (left));
905 else
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)
916 if (right)
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));
920 else
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
930 values. */
932 valueT
933 resolve_symbol_value (symbolS *symp)
935 int resolved;
936 valueT final_val = 0;
937 segT final_seg;
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))
945 return final_val;
947 final_val += local_symbol_get_frag (locsym)->fr_address / OCTETS_PER_BYTE;
949 if (finalize_syms)
951 locsym->lsy_value = final_val;
952 local_symbol_mark_resolved (locsym);
955 return final_val;
958 if (symp->sy_resolved)
960 if (symp->sy_value.X_op == O_constant)
961 return (valueT) symp->sy_value.X_add_number;
962 else
963 return 0;
966 resolved = 0;
967 final_seg = S_GET_SEGMENT (symp);
969 if (symp->sy_resolving)
971 if (finalize_syms)
972 as_bad (_("symbol definition loop encountered at `%s'"),
973 S_GET_NAME (symp));
974 final_val = 0;
975 resolved = 1;
977 else
979 symbolS *add_symbol, *op_symbol;
980 offsetT left, right;
981 segT seg_left, seg_right;
982 operatorT op;
983 int move_seg_ok;
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;
993 switch (op)
995 default:
996 BAD_CASE (op);
997 break;
999 case O_absent:
1000 final_val = 0;
1001 /* Fall through. */
1003 case O_constant:
1004 final_val += symp->sy_frag->fr_address / OCTETS_PER_BYTE;
1005 if (final_seg == expr_section)
1006 final_seg = absolute_section;
1007 resolved = 1;
1008 break;
1010 case O_symbol:
1011 case O_symbol_rva:
1012 left = resolve_symbol_value (add_symbol);
1013 seg_left = S_GET_SEGMENT (add_symbol);
1014 if (finalize_syms)
1015 symp->sy_value.X_op_symbol = NULL;
1017 do_symbol:
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);
1037 break;
1040 if (finalize_syms && final_val == 0)
1042 if (LOCAL_SYMBOL_CHECK (add_symbol))
1043 add_symbol = local_symbol_convert ((struct local_symbol *)
1044 add_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
1053 is equated. */
1054 if (! S_IS_DEFINED (add_symbol)
1055 #if defined (OBJ_COFF) && defined (TE_PE)
1056 || S_IS_WEAK (add_symbol)
1057 #endif
1058 || S_IS_COMMON (add_symbol))
1060 if (finalize_syms)
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;
1069 final_val = 0;
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;
1092 else
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;
1102 break;
1104 case O_uminus:
1105 case O_bit_not:
1106 case O_logical_not:
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
1115 && finalize_syms)
1116 report_op_error (symp, add_symbol, NULL);
1118 if (final_seg == expr_section || final_seg == undefined_section)
1119 final_seg = absolute_section;
1121 if (op == O_uminus)
1122 left = -left;
1123 else if (op == O_logical_not)
1124 left = !left;
1125 else
1126 left = ~left;
1128 final_val += left + symp->sy_frag->fr_address;
1130 resolved = symbol_resolved_p (add_symbol);
1131 break;
1133 case O_multiply:
1134 case O_divide:
1135 case O_modulus:
1136 case O_left_shift:
1137 case O_right_shift:
1138 case O_bit_inclusive_or:
1139 case O_bit_or_not:
1140 case O_bit_exclusive_or:
1141 case O_bit_and:
1142 case O_add:
1143 case O_subtract:
1144 case O_eq:
1145 case O_ne:
1146 case O_lt:
1147 case O_le:
1148 case O_ge:
1149 case O_gt:
1150 case O_logical_and:
1151 case O_logical_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. */
1159 if (op == O_add)
1161 if (seg_right == absolute_section)
1163 final_val += right;
1164 goto do_symbol;
1166 else if (seg_left == absolute_section)
1168 final_val += left;
1169 add_symbol = op_symbol;
1170 left = right;
1171 seg_left = seg_right;
1172 goto do_symbol;
1175 else if (op == O_subtract)
1177 if (seg_right == absolute_section)
1179 final_val -= right;
1180 goto do_symbol;
1184 move_seg_ok = 1;
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. */
1203 if (finalize_syms)
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. */
1209 else
1210 move_seg_ok = 0;
1213 if (move_seg_ok
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)
1224 char *file;
1225 unsigned int line;
1227 if (expr_symbol_where (symp, &file, &line))
1228 as_bad_where (file, line, _("division by zero"));
1229 else
1230 as_bad (_("division by zero when setting `%s'"),
1231 S_GET_NAME (symp));
1234 right = 1;
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;
1250 case O_eq:
1251 case O_ne:
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)
1257 left = ~left;
1258 break;
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;
1265 default: abort ();
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;
1276 else
1277 final_seg = seg_left;
1279 resolved = (symbol_resolved_p (add_symbol)
1280 && symbol_resolved_p (op_symbol));
1281 break;
1283 case O_register:
1284 case O_big:
1285 case O_illegal:
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
1290 anything. */
1291 break;
1294 symp->sy_resolving = 0;
1297 if (finalize_syms)
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. */
1306 if (finalize_syms)
1308 if (resolved)
1309 symp->sy_resolved = 1;
1310 else if (S_GET_SEGMENT (symp) != expr_section)
1312 as_bad (_("can't resolve value for symbol `%s'"),
1313 S_GET_NAME (symp));
1314 symp->sy_resolved = 1;
1318 return final_val;
1321 static void resolve_local_symbol (const char *, PTR);
1323 /* A static function passed to hash_traverse. */
1325 static void
1326 resolve_local_symbol (const char *key ATTRIBUTE_UNUSED, PTR value)
1328 if (value != NULL)
1329 resolve_symbol_value (value);
1332 /* Resolve all local symbols. */
1334 void
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);
1354 else
1356 expressionS expr = symbolP->sy_value;
1358 if (!symbolP->sy_resolved && expr.X_op != O_illegal)
1360 int resolved;
1362 if (symbolP->sy_resolving)
1363 return 0;
1364 symbolP->sy_resolving = 1;
1365 resolved = resolve_expression (&expr);
1366 symbolP->sy_resolving = 0;
1367 if (!resolved)
1368 return 0;
1370 switch (expr.X_op)
1372 case O_constant:
1373 case O_register:
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)
1378 break;
1379 /* Fall thru. */
1380 case O_symbol:
1381 case O_symbol_rva:
1382 symbolP = expr.X_add_symbol;
1383 break;
1384 default:
1385 return 0;
1389 *valueP = expr.X_add_number;
1390 *segP = symbolP->bsym->section;
1391 *fragPP = symbolP->sy_frag;
1393 if (*segP == expr_section)
1394 switch (expr.X_op)
1396 case O_constant: *segP = absolute_section; break;
1397 case O_register: *segP = reg_section; break;
1398 default: break;
1402 return 1;
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)
1421 long *i;
1423 know ((dollar_labels != NULL) || (dollar_label_count == 0));
1425 for (i = dollar_labels; i < dollar_labels + dollar_label_count; ++i)
1426 if (*i == label)
1427 return dollar_label_defines[i - dollar_labels];
1429 /* If we get here, label isn't defined. */
1430 return 0;
1433 static long
1434 dollar_label_instance (long label)
1436 long *i;
1438 know ((dollar_labels != NULL) || (dollar_label_count == 0));
1440 for (i = dollar_labels; i < dollar_labels + dollar_label_count; ++i)
1441 if (*i == label)
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. */
1446 return 0;
1449 void
1450 dollar_label_clear (void)
1452 memset (dollar_label_defines, '\0', (unsigned int) dollar_label_count);
1455 #define DOLLAR_LABEL_BUMP_BY 10
1457 void
1458 define_dollar_label (long label)
1460 long *i;
1462 for (i = dollar_labels; i < dollar_labels + dollar_label_count; ++i)
1463 if (*i == label)
1465 ++dollar_label_instances[i - dollar_labels];
1466 dollar_label_defines[i - dollar_labels] = 1;
1467 return;
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
1505 of ^A. */
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. */)
1511 long i;
1512 /* Returned to caller, then copied. Used for created names ("4f"). */
1513 static char symbol_name_build[24];
1514 register char *p;
1515 register char *q;
1516 char symbol_name_temporary[20]; /* Build up a number, BACKWARDS. */
1518 know (n >= 0);
1519 know (augend == 0 || augend == 1);
1520 p = symbol_name_build;
1521 #ifdef LOCAL_LABEL_PREFIX
1522 *p++ = LOCAL_LABEL_PREFIX;
1523 #endif
1524 *p++ = 'L';
1526 /* Next code just does sprintf( {}, "%d", n); */
1527 /* Label number. */
1528 q = symbol_name_temporary;
1529 for (*q++ = 0, i = n; i; ++q)
1531 *q = i % 10 + '0';
1532 i /= 10;
1534 while ((*p = *--q) != '\0')
1535 ++p;
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)
1543 *q = i % 10 + '0';
1544 i /= 10;
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
1559 specially.
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
1567 array. */
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)
1580 static void
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. */
1588 void
1589 fb_label_instance_inc (long label)
1591 long *i;
1593 if (label < FB_LABEL_SPECIAL)
1595 ++fb_low_counter[label];
1596 return;
1599 if (fb_labels != NULL)
1601 for (i = fb_labels + FB_LABEL_SPECIAL;
1602 i < fb_labels + fb_label_count; ++i)
1604 if (*i == label)
1606 ++fb_label_instances[i - fb_labels];
1607 return;
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;
1633 ++fb_label_count;
1636 static long
1637 fb_label_instance (long label)
1639 long *i;
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)
1651 if (*i == label)
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
1659 first instance. */
1660 return 0;
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
1672 place of ^B. */
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. */)
1678 long i;
1679 /* Returned to caller, then copied. Used for created names ("4f"). */
1680 static char symbol_name_build[24];
1681 register char *p;
1682 register char *q;
1683 char symbol_name_temporary[20]; /* Build up a number, BACKWARDS. */
1685 know (n >= 0);
1686 #ifdef TC_MMIX
1687 know ((unsigned long) augend <= 2 /* See mmix_fb_label. */);
1688 #else
1689 know ((unsigned long) augend <= 1);
1690 #endif
1691 p = symbol_name_build;
1692 #ifdef LOCAL_LABEL_PREFIX
1693 *p++ = LOCAL_LABEL_PREFIX;
1694 #endif
1695 *p++ = 'L';
1697 /* Next code just does sprintf( {}, "%d", n); */
1698 /* Label number. */
1699 q = symbol_name_temporary;
1700 for (*q++ = 0, i = n; i; ++q)
1702 *q = i % 10 + '0';
1703 i /= 10;
1705 while ((*p = *--q) != '\0')
1706 ++p;
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)
1714 *q = i % 10 + '0';
1715 i /= 10;
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. */
1727 char *
1728 decode_local_label_name (char *s)
1730 char *p;
1731 char *symbol_decode;
1732 int label_number;
1733 int instance_number;
1734 char *type;
1735 const char *message_format;
1736 int index = 0;
1738 #ifdef LOCAL_LABEL_PREFIX
1739 if (s[index] == LOCAL_LABEL_PREFIX)
1740 ++index;
1741 #endif
1743 if (s[index] != 'L')
1744 return s;
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)
1750 type = "dollar";
1751 else if (*p == LOCAL_LABEL_CHAR)
1752 type = "fb";
1753 else
1754 return s;
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 (&notes, 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. */
1768 valueT
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);
1777 if (!finalize_syms)
1778 return val;
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 if (! s->sy_resolved
1786 || s->sy_value.X_op != O_symbol
1787 || (S_IS_DEFINED (s) && ! S_IS_COMMON (s)))
1788 as_bad (_("attempt to get value of unresolved symbol `%s'"),
1789 S_GET_NAME (s));
1791 return (valueT) s->sy_value.X_add_number;
1794 /* Set the value of a symbol. */
1796 void
1797 S_SET_VALUE (symbolS *s, valueT val)
1799 if (LOCAL_SYMBOL_CHECK (s))
1801 ((struct local_symbol *) s)->lsy_value = val;
1802 return;
1805 s->sy_value.X_op = O_constant;
1806 s->sy_value.X_add_number = (offsetT) val;
1807 s->sy_value.X_unsigned = 0;
1808 S_CLEAR_WEAKREFR (s);
1811 void
1812 copy_symbol_attributes (symbolS *dest, symbolS *src)
1814 if (LOCAL_SYMBOL_CHECK (dest))
1815 dest = local_symbol_convert ((struct local_symbol *) dest);
1816 if (LOCAL_SYMBOL_CHECK (src))
1817 src = local_symbol_convert ((struct local_symbol *) src);
1819 /* In an expression, transfer the settings of these flags.
1820 The user can override later, of course. */
1821 #define COPIED_SYMFLAGS (BSF_FUNCTION | BSF_OBJECT)
1822 dest->bsym->flags |= src->bsym->flags & COPIED_SYMFLAGS;
1824 #ifdef OBJ_COPY_SYMBOL_ATTRIBUTES
1825 OBJ_COPY_SYMBOL_ATTRIBUTES (dest, src);
1826 #endif
1830 S_IS_FUNCTION (symbolS *s)
1832 flagword flags;
1834 if (LOCAL_SYMBOL_CHECK (s))
1835 return 0;
1837 flags = s->bsym->flags;
1839 return (flags & BSF_FUNCTION) != 0;
1843 S_IS_EXTERNAL (symbolS *s)
1845 flagword flags;
1847 if (LOCAL_SYMBOL_CHECK (s))
1848 return 0;
1850 flags = s->bsym->flags;
1852 /* Sanity check. */
1853 if ((flags & BSF_LOCAL) && (flags & BSF_GLOBAL))
1854 abort ();
1856 return (flags & BSF_GLOBAL) != 0;
1860 S_IS_WEAK (symbolS *s)
1862 if (LOCAL_SYMBOL_CHECK (s))
1863 return 0;
1864 /* Conceptually, a weakrefr is weak if the referenced symbol is. We
1865 could probably handle a WEAKREFR as always weak though. E.g., if
1866 the referenced symbol has lost its weak status, there's no reason
1867 to keep handling the weakrefr as if it was weak. */
1868 if (S_IS_WEAKREFR (s))
1869 return S_IS_WEAK (s->sy_value.X_add_symbol);
1870 return (s->bsym->flags & BSF_WEAK) != 0;
1874 S_IS_WEAKREFR (symbolS *s)
1876 if (LOCAL_SYMBOL_CHECK (s))
1877 return 0;
1878 return s->sy_weakrefr != 0;
1882 S_IS_WEAKREFD (symbolS *s)
1884 if (LOCAL_SYMBOL_CHECK (s))
1885 return 0;
1886 return s->sy_weakrefd != 0;
1890 S_IS_COMMON (symbolS *s)
1892 if (LOCAL_SYMBOL_CHECK (s))
1893 return 0;
1894 return bfd_is_com_section (s->bsym->section);
1898 S_IS_DEFINED (symbolS *s)
1900 if (LOCAL_SYMBOL_CHECK (s))
1901 return ((struct local_symbol *) s)->lsy_section != undefined_section;
1902 return s->bsym->section != undefined_section;
1906 #ifndef EXTERN_FORCE_RELOC
1907 #define EXTERN_FORCE_RELOC IS_ELF
1908 #endif
1910 /* Return true for symbols that should not be reduced to section
1911 symbols or eliminated from expressions, because they may be
1912 overridden by the linker. */
1914 S_FORCE_RELOC (symbolS *s, int strict)
1916 if (LOCAL_SYMBOL_CHECK (s))
1917 return ((struct local_symbol *) s)->lsy_section == undefined_section;
1919 return ((strict
1920 && ((s->bsym->flags & BSF_WEAK) != 0
1921 || (EXTERN_FORCE_RELOC
1922 && (s->bsym->flags & BSF_GLOBAL) != 0)))
1923 || s->bsym->section == undefined_section
1924 || bfd_is_com_section (s->bsym->section));
1928 S_IS_DEBUG (symbolS *s)
1930 if (LOCAL_SYMBOL_CHECK (s))
1931 return 0;
1932 if (s->bsym->flags & BSF_DEBUGGING)
1933 return 1;
1934 return 0;
1938 S_IS_LOCAL (symbolS *s)
1940 flagword flags;
1941 const char *name;
1943 if (LOCAL_SYMBOL_CHECK (s))
1944 return 1;
1946 flags = s->bsym->flags;
1948 /* Sanity check. */
1949 if ((flags & BSF_LOCAL) && (flags & BSF_GLOBAL))
1950 abort ();
1952 if (bfd_get_section (s->bsym) == reg_section)
1953 return 1;
1955 if (flag_strip_local_absolute
1956 /* Keep BSF_FILE symbols in order to allow debuggers to identify
1957 the source file even when the object file is stripped. */
1958 && (flags & (BSF_GLOBAL | BSF_FILE)) == 0
1959 && bfd_get_section (s->bsym) == absolute_section)
1960 return 1;
1962 name = S_GET_NAME (s);
1963 return (name != NULL
1964 && ! S_IS_DEBUG (s)
1965 && (strchr (name, DOLLAR_LABEL_CHAR)
1966 || strchr (name, LOCAL_LABEL_CHAR)
1967 || (! flag_keep_locals
1968 && (bfd_is_local_label (stdoutput, s->bsym)
1969 || (flag_mri
1970 && name[0] == '?'
1971 && name[1] == '?')))));
1975 S_IS_STABD (symbolS *s)
1977 return S_GET_NAME (s) == 0;
1981 S_IS_VOLATILE (const symbolS *s)
1983 if (LOCAL_SYMBOL_CHECK (s))
1984 return 0;
1985 return s->sy_volatile;
1989 S_IS_FORWARD_REF (const symbolS *s)
1991 if (LOCAL_SYMBOL_CHECK (s))
1992 return 0;
1993 return s->sy_forward_ref;
1996 const char *
1997 S_GET_NAME (symbolS *s)
1999 if (LOCAL_SYMBOL_CHECK (s))
2000 return ((struct local_symbol *) s)->lsy_name;
2001 return s->bsym->name;
2004 segT
2005 S_GET_SEGMENT (symbolS *s)
2007 if (LOCAL_SYMBOL_CHECK (s))
2008 return ((struct local_symbol *) s)->lsy_section;
2009 return s->bsym->section;
2012 void
2013 S_SET_SEGMENT (symbolS *s, segT seg)
2015 /* Don't reassign section symbols. The direct reason is to prevent seg
2016 faults assigning back to const global symbols such as *ABS*, but it
2017 shouldn't happen anyway. */
2019 if (LOCAL_SYMBOL_CHECK (s))
2021 if (seg == reg_section)
2022 s = local_symbol_convert ((struct local_symbol *) s);
2023 else
2025 ((struct local_symbol *) s)->lsy_section = seg;
2026 return;
2030 if (s->bsym->flags & BSF_SECTION_SYM)
2032 if (s->bsym->section != seg)
2033 abort ();
2035 else
2036 s->bsym->section = seg;
2039 void
2040 S_SET_EXTERNAL (symbolS *s)
2042 if (LOCAL_SYMBOL_CHECK (s))
2043 s = local_symbol_convert ((struct local_symbol *) s);
2044 if ((s->bsym->flags & BSF_WEAK) != 0)
2046 /* Let .weak override .global. */
2047 return;
2049 if (s->bsym->flags & BSF_SECTION_SYM)
2051 char * file;
2052 unsigned int line;
2054 /* Do not reassign section symbols. */
2055 as_where (& file, & line);
2056 as_warn_where (file, line,
2057 _("section symbols are already global"));
2058 return;
2060 s->bsym->flags |= BSF_GLOBAL;
2061 s->bsym->flags &= ~(BSF_LOCAL | BSF_WEAK);
2063 #ifdef USE_UNIQUE
2064 if (! an_external_name && S_GET_NAME(s)[0] != '.')
2065 an_external_name = S_GET_NAME (s);
2066 #endif
2069 void
2070 S_CLEAR_EXTERNAL (symbolS *s)
2072 if (LOCAL_SYMBOL_CHECK (s))
2073 return;
2074 if ((s->bsym->flags & BSF_WEAK) != 0)
2076 /* Let .weak override. */
2077 return;
2079 s->bsym->flags |= BSF_LOCAL;
2080 s->bsym->flags &= ~(BSF_GLOBAL | BSF_WEAK);
2083 void
2084 S_SET_WEAK (symbolS *s)
2086 if (LOCAL_SYMBOL_CHECK (s))
2087 s = local_symbol_convert ((struct local_symbol *) s);
2088 #ifdef obj_set_weak_hook
2089 obj_set_weak_hook (s);
2090 #endif
2091 s->bsym->flags |= BSF_WEAK;
2092 s->bsym->flags &= ~(BSF_GLOBAL | BSF_LOCAL);
2095 void
2096 S_SET_WEAKREFR (symbolS *s)
2098 if (LOCAL_SYMBOL_CHECK (s))
2099 s = local_symbol_convert ((struct local_symbol *) s);
2100 s->sy_weakrefr = 1;
2101 /* If the alias was already used, make sure we mark the target as
2102 used as well, otherwise it might be dropped from the symbol
2103 table. This may have unintended side effects if the alias is
2104 later redirected to another symbol, such as keeping the unused
2105 previous target in the symbol table. Since it will be weak, it's
2106 not a big deal. */
2107 if (s->sy_used)
2108 symbol_mark_used (s->sy_value.X_add_symbol);
2111 void
2112 S_CLEAR_WEAKREFR (symbolS *s)
2114 if (LOCAL_SYMBOL_CHECK (s))
2115 return;
2116 s->sy_weakrefr = 0;
2119 void
2120 S_SET_WEAKREFD (symbolS *s)
2122 if (LOCAL_SYMBOL_CHECK (s))
2123 s = local_symbol_convert ((struct local_symbol *) s);
2124 s->sy_weakrefd = 1;
2125 S_SET_WEAK (s);
2128 void
2129 S_CLEAR_WEAKREFD (symbolS *s)
2131 if (LOCAL_SYMBOL_CHECK (s))
2132 return;
2133 if (s->sy_weakrefd)
2135 s->sy_weakrefd = 0;
2136 /* If a weakref target symbol is weak, then it was never
2137 referenced directly before, not even in a .global directive,
2138 so decay it to local. If it remains undefined, it will be
2139 later turned into a global, like any other undefined
2140 symbol. */
2141 if (s->bsym->flags & BSF_WEAK)
2143 #ifdef obj_clear_weak_hook
2144 obj_clear_weak_hook (s);
2145 #endif
2146 s->bsym->flags &= ~BSF_WEAK;
2147 s->bsym->flags |= BSF_LOCAL;
2152 void
2153 S_SET_THREAD_LOCAL (symbolS *s)
2155 if (LOCAL_SYMBOL_CHECK (s))
2156 s = local_symbol_convert ((struct local_symbol *) s);
2157 if (bfd_is_com_section (s->bsym->section)
2158 && (s->bsym->flags & BSF_THREAD_LOCAL) != 0)
2159 return;
2160 s->bsym->flags |= BSF_THREAD_LOCAL;
2161 if ((s->bsym->flags & BSF_FUNCTION) != 0)
2162 as_bad (_("Accessing function `%s' as thread-local object"),
2163 S_GET_NAME (s));
2164 else if (! bfd_is_und_section (s->bsym->section)
2165 && (s->bsym->section->flags & SEC_THREAD_LOCAL) == 0)
2166 as_bad (_("Accessing `%s' as thread-local object"),
2167 S_GET_NAME (s));
2170 void
2171 S_SET_NAME (symbolS *s, const char *name)
2173 if (LOCAL_SYMBOL_CHECK (s))
2175 ((struct local_symbol *) s)->lsy_name = name;
2176 return;
2178 s->bsym->name = name;
2181 void
2182 S_SET_VOLATILE (symbolS *s)
2184 if (LOCAL_SYMBOL_CHECK (s))
2185 s = local_symbol_convert ((struct local_symbol *) s);
2186 s->sy_volatile = 1;
2189 void
2190 S_SET_FORWARD_REF (symbolS *s)
2192 if (LOCAL_SYMBOL_CHECK (s))
2193 s = local_symbol_convert ((struct local_symbol *) s);
2194 s->sy_forward_ref = 1;
2197 /* Return the previous symbol in a chain. */
2199 symbolS *
2200 symbol_previous (symbolS *s)
2202 if (LOCAL_SYMBOL_CHECK (s))
2203 abort ();
2204 return s->sy_previous;
2207 /* Return the next symbol in a chain. */
2209 symbolS *
2210 symbol_next (symbolS *s)
2212 if (LOCAL_SYMBOL_CHECK (s))
2213 abort ();
2214 return s->sy_next;
2217 /* Return a pointer to the value of a symbol as an expression. */
2219 expressionS *
2220 symbol_get_value_expression (symbolS *s)
2222 if (LOCAL_SYMBOL_CHECK (s))
2223 s = local_symbol_convert ((struct local_symbol *) s);
2224 return &s->sy_value;
2227 /* Set the value of a symbol to an expression. */
2229 void
2230 symbol_set_value_expression (symbolS *s, const expressionS *exp)
2232 if (LOCAL_SYMBOL_CHECK (s))
2233 s = local_symbol_convert ((struct local_symbol *) s);
2234 s->sy_value = *exp;
2235 S_CLEAR_WEAKREFR (s);
2238 /* Return a pointer to the X_add_number component of a symbol. */
2240 offsetT *
2241 symbol_X_add_number (symbolS *s)
2243 if (LOCAL_SYMBOL_CHECK (s))
2244 return (offsetT *) &((struct local_symbol *) s)->lsy_value;
2246 return &s->sy_value.X_add_number;
2249 /* Set the value of SYM to the current position in the current segment. */
2251 void
2252 symbol_set_value_now (symbolS *sym)
2254 S_SET_SEGMENT (sym, now_seg);
2255 S_SET_VALUE (sym, frag_now_fix ());
2256 symbol_set_frag (sym, frag_now);
2259 /* Set the frag of a symbol. */
2261 void
2262 symbol_set_frag (symbolS *s, fragS *f)
2264 if (LOCAL_SYMBOL_CHECK (s))
2266 local_symbol_set_frag ((struct local_symbol *) s, f);
2267 return;
2269 s->sy_frag = f;
2270 S_CLEAR_WEAKREFR (s);
2273 /* Return the frag of a symbol. */
2275 fragS *
2276 symbol_get_frag (symbolS *s)
2278 if (LOCAL_SYMBOL_CHECK (s))
2279 return local_symbol_get_frag ((struct local_symbol *) s);
2280 return s->sy_frag;
2283 /* Mark a symbol as having been used. */
2285 void
2286 symbol_mark_used (symbolS *s)
2288 if (LOCAL_SYMBOL_CHECK (s))
2289 return;
2290 s->sy_used = 1;
2291 if (S_IS_WEAKREFR (s))
2292 symbol_mark_used (s->sy_value.X_add_symbol);
2295 /* Clear the mark of whether a symbol has been used. */
2297 void
2298 symbol_clear_used (symbolS *s)
2300 if (LOCAL_SYMBOL_CHECK (s))
2301 s = local_symbol_convert ((struct local_symbol *) s);
2302 s->sy_used = 0;
2305 /* Return whether a symbol has been used. */
2308 symbol_used_p (symbolS *s)
2310 if (LOCAL_SYMBOL_CHECK (s))
2311 return 1;
2312 return s->sy_used;
2315 /* Mark a symbol as having been used in a reloc. */
2317 void
2318 symbol_mark_used_in_reloc (symbolS *s)
2320 if (LOCAL_SYMBOL_CHECK (s))
2321 s = local_symbol_convert ((struct local_symbol *) s);
2322 s->sy_used_in_reloc = 1;
2325 /* Clear the mark of whether a symbol has been used in a reloc. */
2327 void
2328 symbol_clear_used_in_reloc (symbolS *s)
2330 if (LOCAL_SYMBOL_CHECK (s))
2331 return;
2332 s->sy_used_in_reloc = 0;
2335 /* Return whether a symbol has been used in a reloc. */
2338 symbol_used_in_reloc_p (symbolS *s)
2340 if (LOCAL_SYMBOL_CHECK (s))
2341 return 0;
2342 return s->sy_used_in_reloc;
2345 /* Mark a symbol as an MRI common symbol. */
2347 void
2348 symbol_mark_mri_common (symbolS *s)
2350 if (LOCAL_SYMBOL_CHECK (s))
2351 s = local_symbol_convert ((struct local_symbol *) s);
2352 s->sy_mri_common = 1;
2355 /* Clear the mark of whether a symbol is an MRI common symbol. */
2357 void
2358 symbol_clear_mri_common (symbolS *s)
2360 if (LOCAL_SYMBOL_CHECK (s))
2361 return;
2362 s->sy_mri_common = 0;
2365 /* Return whether a symbol is an MRI common symbol. */
2368 symbol_mri_common_p (symbolS *s)
2370 if (LOCAL_SYMBOL_CHECK (s))
2371 return 0;
2372 return s->sy_mri_common;
2375 /* Mark a symbol as having been written. */
2377 void
2378 symbol_mark_written (symbolS *s)
2380 if (LOCAL_SYMBOL_CHECK (s))
2381 return;
2382 s->written = 1;
2385 /* Clear the mark of whether a symbol has been written. */
2387 void
2388 symbol_clear_written (symbolS *s)
2390 if (LOCAL_SYMBOL_CHECK (s))
2391 return;
2392 s->written = 0;
2395 /* Return whether a symbol has been written. */
2398 symbol_written_p (symbolS *s)
2400 if (LOCAL_SYMBOL_CHECK (s))
2401 return 0;
2402 return s->written;
2405 /* Mark a symbol has having been resolved. */
2407 void
2408 symbol_mark_resolved (symbolS *s)
2410 if (LOCAL_SYMBOL_CHECK (s))
2412 local_symbol_mark_resolved ((struct local_symbol *) s);
2413 return;
2415 s->sy_resolved = 1;
2418 /* Return whether a symbol has been resolved. */
2421 symbol_resolved_p (symbolS *s)
2423 if (LOCAL_SYMBOL_CHECK (s))
2424 return local_symbol_resolved_p ((struct local_symbol *) s);
2425 return s->sy_resolved;
2428 /* Return whether a symbol is a section symbol. */
2431 symbol_section_p (symbolS *s ATTRIBUTE_UNUSED)
2433 if (LOCAL_SYMBOL_CHECK (s))
2434 return 0;
2435 return (s->bsym->flags & BSF_SECTION_SYM) != 0;
2438 /* Return whether a symbol is equated to another symbol. */
2441 symbol_equated_p (symbolS *s)
2443 if (LOCAL_SYMBOL_CHECK (s))
2444 return 0;
2445 return s->sy_value.X_op == O_symbol;
2448 /* Return whether a symbol is equated to another symbol, and should be
2449 treated specially when writing out relocs. */
2452 symbol_equated_reloc_p (symbolS *s)
2454 if (LOCAL_SYMBOL_CHECK (s))
2455 return 0;
2456 /* X_op_symbol, normally not used for O_symbol, is set by
2457 resolve_symbol_value to flag expression syms that have been
2458 equated. */
2459 return (s->sy_value.X_op == O_symbol
2460 #if defined (OBJ_COFF) && defined (TE_PE)
2461 && ! S_IS_WEAK (s)
2462 #endif
2463 && ((s->sy_resolved && s->sy_value.X_op_symbol != NULL)
2464 || ! S_IS_DEFINED (s)
2465 || S_IS_COMMON (s)));
2468 /* Return whether a symbol has a constant value. */
2471 symbol_constant_p (symbolS *s)
2473 if (LOCAL_SYMBOL_CHECK (s))
2474 return 1;
2475 return s->sy_value.X_op == O_constant;
2478 /* Return the BFD symbol for a symbol. */
2480 asymbol *
2481 symbol_get_bfdsym (symbolS *s)
2483 if (LOCAL_SYMBOL_CHECK (s))
2484 s = local_symbol_convert ((struct local_symbol *) s);
2485 return s->bsym;
2488 /* Set the BFD symbol for a symbol. */
2490 void
2491 symbol_set_bfdsym (symbolS *s, asymbol *bsym)
2493 if (LOCAL_SYMBOL_CHECK (s))
2494 s = local_symbol_convert ((struct local_symbol *) s);
2495 /* Usually, it is harmless to reset a symbol to a BFD section
2496 symbol. For example, obj_elf_change_section sets the BFD symbol
2497 of an old symbol with the newly created section symbol. But when
2498 we have multiple sections with the same name, the newly created
2499 section may have the same name as an old section. We check if the
2500 old symbol has been already marked as a section symbol before
2501 resetting it. */
2502 if ((s->bsym->flags & BSF_SECTION_SYM) == 0)
2503 s->bsym = bsym;
2504 /* else XXX - What do we do now ? */
2507 #ifdef OBJ_SYMFIELD_TYPE
2509 /* Get a pointer to the object format information for a symbol. */
2511 OBJ_SYMFIELD_TYPE *
2512 symbol_get_obj (symbolS *s)
2514 if (LOCAL_SYMBOL_CHECK (s))
2515 s = local_symbol_convert ((struct local_symbol *) s);
2516 return &s->sy_obj;
2519 /* Set the object format information for a symbol. */
2521 void
2522 symbol_set_obj (symbolS *s, OBJ_SYMFIELD_TYPE *o)
2524 if (LOCAL_SYMBOL_CHECK (s))
2525 s = local_symbol_convert ((struct local_symbol *) s);
2526 s->sy_obj = *o;
2529 #endif /* OBJ_SYMFIELD_TYPE */
2531 #ifdef TC_SYMFIELD_TYPE
2533 /* Get a pointer to the processor information for a symbol. */
2535 TC_SYMFIELD_TYPE *
2536 symbol_get_tc (symbolS *s)
2538 if (LOCAL_SYMBOL_CHECK (s))
2539 s = local_symbol_convert ((struct local_symbol *) s);
2540 return &s->sy_tc;
2543 /* Set the processor information for a symbol. */
2545 void
2546 symbol_set_tc (symbolS *s, TC_SYMFIELD_TYPE *o)
2548 if (LOCAL_SYMBOL_CHECK (s))
2549 s = local_symbol_convert ((struct local_symbol *) s);
2550 s->sy_tc = *o;
2553 #endif /* TC_SYMFIELD_TYPE */
2555 void
2556 symbol_begin (void)
2558 symbol_lastP = NULL;
2559 symbol_rootP = NULL; /* In case we have 0 symbols (!!) */
2560 sy_hash = hash_new ();
2561 local_hash = hash_new ();
2563 memset ((char *) (&abs_symbol), '\0', sizeof (abs_symbol));
2564 #if defined (EMIT_SECTION_SYMBOLS) || !defined (RELOC_REQUIRES_SYMBOL)
2565 abs_symbol.bsym = bfd_abs_section.symbol;
2566 #endif
2567 abs_symbol.sy_value.X_op = O_constant;
2568 abs_symbol.sy_frag = &zero_address_frag;
2570 if (LOCAL_LABELS_FB)
2571 fb_label_init ();
2574 int indent_level;
2576 /* Maximum indent level.
2577 Available for modification inside a gdb session. */
2578 static int max_indent_level = 8;
2580 void
2581 print_symbol_value_1 (FILE *file, symbolS *sym)
2583 const char *name = S_GET_NAME (sym);
2584 if (!name || !name[0])
2585 name = "(unnamed)";
2586 fprintf (file, "sym %lx %s", (unsigned long) sym, name);
2588 if (LOCAL_SYMBOL_CHECK (sym))
2590 struct local_symbol *locsym = (struct local_symbol *) sym;
2591 if (local_symbol_get_frag (locsym) != &zero_address_frag
2592 && local_symbol_get_frag (locsym) != NULL)
2593 fprintf (file, " frag %lx", (long) local_symbol_get_frag (locsym));
2594 if (local_symbol_resolved_p (locsym))
2595 fprintf (file, " resolved");
2596 fprintf (file, " local");
2598 else
2600 if (sym->sy_frag != &zero_address_frag)
2601 fprintf (file, " frag %lx", (long) sym->sy_frag);
2602 if (sym->written)
2603 fprintf (file, " written");
2604 if (sym->sy_resolved)
2605 fprintf (file, " resolved");
2606 else if (sym->sy_resolving)
2607 fprintf (file, " resolving");
2608 if (sym->sy_used_in_reloc)
2609 fprintf (file, " used-in-reloc");
2610 if (sym->sy_used)
2611 fprintf (file, " used");
2612 if (S_IS_LOCAL (sym))
2613 fprintf (file, " local");
2614 if (S_IS_EXTERNAL (sym))
2615 fprintf (file, " extern");
2616 if (S_IS_WEAK (sym))
2617 fprintf (file, " weak");
2618 if (S_IS_DEBUG (sym))
2619 fprintf (file, " debug");
2620 if (S_IS_DEFINED (sym))
2621 fprintf (file, " defined");
2623 if (S_IS_WEAKREFR (sym))
2624 fprintf (file, " weakrefr");
2625 if (S_IS_WEAKREFD (sym))
2626 fprintf (file, " weakrefd");
2627 fprintf (file, " %s", segment_name (S_GET_SEGMENT (sym)));
2628 if (symbol_resolved_p (sym))
2630 segT s = S_GET_SEGMENT (sym);
2632 if (s != undefined_section
2633 && s != expr_section)
2634 fprintf (file, " %lx", (long) S_GET_VALUE (sym));
2636 else if (indent_level < max_indent_level
2637 && S_GET_SEGMENT (sym) != undefined_section)
2639 indent_level++;
2640 fprintf (file, "\n%*s<", indent_level * 4, "");
2641 if (LOCAL_SYMBOL_CHECK (sym))
2642 fprintf (file, "constant %lx",
2643 (long) ((struct local_symbol *) sym)->lsy_value);
2644 else
2645 print_expr_1 (file, &sym->sy_value);
2646 fprintf (file, ">");
2647 indent_level--;
2649 fflush (file);
2652 void
2653 print_symbol_value (symbolS *sym)
2655 indent_level = 0;
2656 print_symbol_value_1 (stderr, sym);
2657 fprintf (stderr, "\n");
2660 static void
2661 print_binary (FILE *file, const char *name, expressionS *exp)
2663 indent_level++;
2664 fprintf (file, "%s\n%*s<", name, indent_level * 4, "");
2665 print_symbol_value_1 (file, exp->X_add_symbol);
2666 fprintf (file, ">\n%*s<", indent_level * 4, "");
2667 print_symbol_value_1 (file, exp->X_op_symbol);
2668 fprintf (file, ">");
2669 indent_level--;
2672 void
2673 print_expr_1 (FILE *file, expressionS *exp)
2675 fprintf (file, "expr %lx ", (long) exp);
2676 switch (exp->X_op)
2678 case O_illegal:
2679 fprintf (file, "illegal");
2680 break;
2681 case O_absent:
2682 fprintf (file, "absent");
2683 break;
2684 case O_constant:
2685 fprintf (file, "constant %lx", (long) exp->X_add_number);
2686 break;
2687 case O_symbol:
2688 indent_level++;
2689 fprintf (file, "symbol\n%*s<", indent_level * 4, "");
2690 print_symbol_value_1 (file, exp->X_add_symbol);
2691 fprintf (file, ">");
2692 maybe_print_addnum:
2693 if (exp->X_add_number)
2694 fprintf (file, "\n%*s%lx", indent_level * 4, "",
2695 (long) exp->X_add_number);
2696 indent_level--;
2697 break;
2698 case O_register:
2699 fprintf (file, "register #%d", (int) exp->X_add_number);
2700 break;
2701 case O_big:
2702 fprintf (file, "big");
2703 break;
2704 case O_uminus:
2705 fprintf (file, "uminus -<");
2706 indent_level++;
2707 print_symbol_value_1 (file, exp->X_add_symbol);
2708 fprintf (file, ">");
2709 goto maybe_print_addnum;
2710 case O_bit_not:
2711 fprintf (file, "bit_not");
2712 break;
2713 case O_multiply:
2714 print_binary (file, "multiply", exp);
2715 break;
2716 case O_divide:
2717 print_binary (file, "divide", exp);
2718 break;
2719 case O_modulus:
2720 print_binary (file, "modulus", exp);
2721 break;
2722 case O_left_shift:
2723 print_binary (file, "lshift", exp);
2724 break;
2725 case O_right_shift:
2726 print_binary (file, "rshift", exp);
2727 break;
2728 case O_bit_inclusive_or:
2729 print_binary (file, "bit_ior", exp);
2730 break;
2731 case O_bit_exclusive_or:
2732 print_binary (file, "bit_xor", exp);
2733 break;
2734 case O_bit_and:
2735 print_binary (file, "bit_and", exp);
2736 break;
2737 case O_eq:
2738 print_binary (file, "eq", exp);
2739 break;
2740 case O_ne:
2741 print_binary (file, "ne", exp);
2742 break;
2743 case O_lt:
2744 print_binary (file, "lt", exp);
2745 break;
2746 case O_le:
2747 print_binary (file, "le", exp);
2748 break;
2749 case O_ge:
2750 print_binary (file, "ge", exp);
2751 break;
2752 case O_gt:
2753 print_binary (file, "gt", exp);
2754 break;
2755 case O_logical_and:
2756 print_binary (file, "logical_and", exp);
2757 break;
2758 case O_logical_or:
2759 print_binary (file, "logical_or", exp);
2760 break;
2761 case O_add:
2762 indent_level++;
2763 fprintf (file, "add\n%*s<", indent_level * 4, "");
2764 print_symbol_value_1 (file, exp->X_add_symbol);
2765 fprintf (file, ">\n%*s<", indent_level * 4, "");
2766 print_symbol_value_1 (file, exp->X_op_symbol);
2767 fprintf (file, ">");
2768 goto maybe_print_addnum;
2769 case O_subtract:
2770 indent_level++;
2771 fprintf (file, "subtract\n%*s<", indent_level * 4, "");
2772 print_symbol_value_1 (file, exp->X_add_symbol);
2773 fprintf (file, ">\n%*s<", indent_level * 4, "");
2774 print_symbol_value_1 (file, exp->X_op_symbol);
2775 fprintf (file, ">");
2776 goto maybe_print_addnum;
2777 default:
2778 fprintf (file, "{unknown opcode %d}", (int) exp->X_op);
2779 break;
2781 fflush (stdout);
2784 void
2785 print_expr (expressionS *exp)
2787 print_expr_1 (stderr, exp);
2788 fprintf (stderr, "\n");
2791 void
2792 symbol_print_statistics (FILE *file)
2794 hash_print_statistics (file, "symbol table", sy_hash);
2795 hash_print_statistics (file, "mini local symbol table", local_hash);
2796 fprintf (file, "%lu mini local symbols created, %lu converted\n",
2797 local_symbol_count, local_symbol_conversion_count);