gas/
[binutils-gdb.git] / gas / symbols.c
1 /* symbols.c -symbol table-
2 Copyright 1987, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
3 1999, 2000, 2001, 2002, 2003, 2004, 2005
4 Free Software Foundation, Inc.
5
6 This file is part of GAS, the GNU Assembler.
7
8 GAS is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2, or (at your option)
11 any later version.
12
13 GAS is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GAS; see the file COPYING. If not, write to the Free
20 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
21 02111-1307, USA. */
22
23 /* #define DEBUG_SYMS / * to debug symbol list maintenance. */
24
25 #include "as.h"
26
27 #include "safe-ctype.h"
28 #include "obstack.h" /* For "symbols.h" */
29 #include "subsegs.h"
30
31 #include "struc-symbol.h"
32
33 /* This is non-zero if symbols are case sensitive, which is the
34 default. */
35 int symbols_case_sensitive = 1;
36
37 #ifndef WORKING_DOT_WORD
38 extern int new_broken_words;
39 #endif
40
41 /* symbol-name => struct symbol pointer */
42 static struct hash_control *sy_hash;
43
44 /* Table of local symbols. */
45 static struct hash_control *local_hash;
46
47 /* Below are commented in "symbols.h". */
48 symbolS *symbol_rootP;
49 symbolS *symbol_lastP;
50 symbolS abs_symbol;
51
52 #ifdef DEBUG_SYMS
53 #define debug_verify_symchain verify_symbol_chain
54 #else
55 #define debug_verify_symchain(root, last) ((void) 0)
56 #endif
57
58 #define DOLLAR_LABEL_CHAR '\001'
59 #define LOCAL_LABEL_CHAR '\002'
60
61 struct obstack notes;
62 #ifdef 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
67
68 static char *save_symbol_name (const char *);
69 static void fb_label_init (void);
70 static long dollar_label_instance (long);
71 static long fb_label_instance (long);
72
73 static void print_binary (FILE *, const char *, expressionS *);
74 static void report_op_error (symbolS *, symbolS *, symbolS *);
75
76 /* Return a pointer to a new symbol. Die if we can't make a new
77 symbol. Fill in the symbol's values. Add symbol to end of symbol
78 chain.
79
80 This function should be called in the general case of creating a
81 symbol. However, if the output file symbol table has already been
82 set, and you are certain that this symbol won't be wanted in the
83 output file, you can call symbol_create. */
84
85 symbolS *
86 symbol_new (const char *name, segT segment, valueT valu, fragS *frag)
87 {
88 symbolS *symbolP = symbol_create (name, segment, valu, frag);
89
90 /* Link to end of symbol chain. */
91 #ifdef BFD_ASSEMBLER
92 {
93 extern int symbol_table_frozen;
94 if (symbol_table_frozen)
95 abort ();
96 }
97 #endif
98 symbol_append (symbolP, symbol_lastP, &symbol_rootP, &symbol_lastP);
99
100 return symbolP;
101 }
102
103 /* Save a symbol name on a permanent obstack, and convert it according
104 to the object file format. */
105
106 static char *
107 save_symbol_name (const char *name)
108 {
109 unsigned int name_length;
110 char *ret;
111
112 name_length = strlen (name) + 1; /* +1 for \0. */
113 obstack_grow (&notes, name, name_length);
114 ret = obstack_finish (&notes);
115
116 #ifdef tc_canonicalize_symbol_name
117 ret = tc_canonicalize_symbol_name (ret);
118 #endif
119
120 if (! symbols_case_sensitive)
121 {
122 char *s;
123
124 for (s = ret; *s != '\0'; s++)
125 *s = TOUPPER (*s);
126 }
127
128 return ret;
129 }
130
131 symbolS *
132 symbol_create (const char *name, /* It is copied, the caller can destroy/modify. */
133 segT segment, /* Segment identifier (SEG_<something>). */
134 valueT valu, /* Symbol value. */
135 fragS *frag /* Associated fragment. */)
136 {
137 char *preserved_copy_of_name;
138 symbolS *symbolP;
139
140 preserved_copy_of_name = save_symbol_name (name);
141
142 symbolP = (symbolS *) obstack_alloc (&notes, sizeof (symbolS));
143
144 /* symbol must be born in some fixed state. This seems as good as any. */
145 memset (symbolP, 0, sizeof (symbolS));
146
147 #ifdef BFD_ASSEMBLER
148 symbolP->bsym = bfd_make_empty_symbol (stdoutput);
149 if (symbolP->bsym == NULL)
150 as_perror ("%s", "bfd_make_empty_symbol");
151 symbolP->bsym->udata.p = (PTR) symbolP;
152 #endif
153 S_SET_NAME (symbolP, preserved_copy_of_name);
154
155 S_SET_SEGMENT (symbolP, segment);
156 S_SET_VALUE (symbolP, valu);
157 symbol_clear_list_pointers (symbolP);
158
159 symbolP->sy_frag = frag;
160 #ifndef BFD_ASSEMBLER
161 symbolP->sy_number = ~0;
162 symbolP->sy_name_offset = (unsigned int) ~0;
163 #endif
164
165 obj_symbol_new_hook (symbolP);
166
167 #ifdef tc_symbol_new_hook
168 tc_symbol_new_hook (symbolP);
169 #endif
170
171 return symbolP;
172 }
173 \f
174 #ifdef BFD_ASSEMBLER
175
176 /* Local symbol support. If we can get away with it, we keep only a
177 small amount of information for local symbols. */
178
179 static symbolS *local_symbol_convert (struct local_symbol *);
180
181 /* Used for statistics. */
182
183 static unsigned long local_symbol_count;
184 static unsigned long local_symbol_conversion_count;
185
186 /* This macro is called with a symbol argument passed by reference.
187 It returns whether this is a local symbol. If necessary, it
188 changes its argument to the real symbol. */
189
190 #define LOCAL_SYMBOL_CHECK(s) \
191 (s->bsym == NULL \
192 ? (local_symbol_converted_p ((struct local_symbol *) s) \
193 ? (s = local_symbol_get_real_symbol ((struct local_symbol *) s), \
194 0) \
195 : 1) \
196 : 0)
197
198 /* Create a local symbol and insert it into the local hash table. */
199
200 struct local_symbol *
201 local_symbol_make (const char *name, segT section, valueT value, fragS *frag)
202 {
203 char *name_copy;
204 struct local_symbol *ret;
205
206 ++local_symbol_count;
207
208 name_copy = save_symbol_name (name);
209
210 ret = (struct local_symbol *) obstack_alloc (&notes, sizeof *ret);
211 ret->lsy_marker = NULL;
212 ret->lsy_name = name_copy;
213 ret->lsy_section = section;
214 local_symbol_set_frag (ret, frag);
215 ret->lsy_value = value;
216
217 hash_jam (local_hash, name_copy, (PTR) ret);
218
219 return ret;
220 }
221
222 /* Convert a local symbol into a real symbol. Note that we do not
223 reclaim the space used by the local symbol. */
224
225 static symbolS *
226 local_symbol_convert (struct local_symbol *locsym)
227 {
228 symbolS *ret;
229
230 assert (locsym->lsy_marker == NULL);
231 if (local_symbol_converted_p (locsym))
232 return local_symbol_get_real_symbol (locsym);
233
234 ++local_symbol_conversion_count;
235
236 ret = symbol_new (locsym->lsy_name, locsym->lsy_section, locsym->lsy_value,
237 local_symbol_get_frag (locsym));
238
239 if (local_symbol_resolved_p (locsym))
240 ret->sy_resolved = 1;
241
242 /* Local symbols are always either defined or used. */
243 ret->sy_used = 1;
244
245 #ifdef TC_LOCAL_SYMFIELD_CONVERT
246 TC_LOCAL_SYMFIELD_CONVERT (locsym, ret);
247 #endif
248
249 symbol_table_insert (ret);
250
251 local_symbol_mark_converted (locsym);
252 local_symbol_set_real_symbol (locsym, ret);
253
254 hash_jam (local_hash, locsym->lsy_name, NULL);
255
256 return ret;
257 }
258
259 #else /* ! BFD_ASSEMBLER */
260
261 #define LOCAL_SYMBOL_CHECK(s) 0
262 #define local_symbol_convert(s) ((symbolS *) s)
263
264 #endif /* ! BFD_ASSEMBLER */
265 \f
266 /* We have just seen "<name>:".
267 Creates a struct symbol unless it already exists.
268
269 Gripes if we are redefining a symbol incompatibly (and ignores it). */
270
271 symbolS *
272 colon (/* Just seen "x:" - rattle symbols & frags. */
273 const char *sym_name /* Symbol name, as a cannonical string. */
274 /* We copy this string: OK to alter later. */)
275 {
276 register symbolS *symbolP; /* Symbol we are working with. */
277
278 /* Sun local labels go out of scope whenever a non-local symbol is
279 defined. */
280 if (LOCAL_LABELS_DOLLAR)
281 {
282 int local;
283
284 #ifdef BFD_ASSEMBLER
285 local = bfd_is_local_label_name (stdoutput, sym_name);
286 #else
287 local = LOCAL_LABEL (sym_name);
288 #endif
289
290 if (! local)
291 dollar_label_clear ();
292 }
293
294 #ifndef WORKING_DOT_WORD
295 if (new_broken_words)
296 {
297 struct broken_word *a;
298 int possible_bytes;
299 fragS *frag_tmp;
300 char *frag_opcode;
301
302 if (now_seg == absolute_section)
303 {
304 as_bad (_("cannot define symbol `%s' in absolute section"), sym_name);
305 return NULL;
306 }
307
308 possible_bytes = (md_short_jump_size
309 + new_broken_words * md_long_jump_size);
310
311 frag_tmp = frag_now;
312 frag_opcode = frag_var (rs_broken_word,
313 possible_bytes,
314 possible_bytes,
315 (relax_substateT) 0,
316 (symbolS *) broken_words,
317 (offsetT) 0,
318 NULL);
319
320 /* We want to store the pointer to where to insert the jump
321 table in the fr_opcode of the rs_broken_word frag. This
322 requires a little hackery. */
323 while (frag_tmp
324 && (frag_tmp->fr_type != rs_broken_word
325 || frag_tmp->fr_opcode))
326 frag_tmp = frag_tmp->fr_next;
327 know (frag_tmp);
328 frag_tmp->fr_opcode = frag_opcode;
329 new_broken_words = 0;
330
331 for (a = broken_words; a && a->dispfrag == 0; a = a->next_broken_word)
332 a->dispfrag = frag_tmp;
333 }
334 #endif /* WORKING_DOT_WORD */
335
336 if ((symbolP = symbol_find (sym_name)) != 0)
337 {
338 #ifdef RESOLVE_SYMBOL_REDEFINITION
339 if (RESOLVE_SYMBOL_REDEFINITION (symbolP))
340 return symbolP;
341 #endif
342 /* Now check for undefined symbols. */
343 if (LOCAL_SYMBOL_CHECK (symbolP))
344 {
345 #ifdef BFD_ASSEMBLER
346 struct local_symbol *locsym = (struct local_symbol *) symbolP;
347
348 if (locsym->lsy_section != undefined_section
349 && (local_symbol_get_frag (locsym) != frag_now
350 || locsym->lsy_section != now_seg
351 || locsym->lsy_value != frag_now_fix ()))
352 {
353 as_bad (_("symbol `%s' is already defined"), sym_name);
354 return symbolP;
355 }
356
357 locsym->lsy_section = now_seg;
358 local_symbol_set_frag (locsym, frag_now);
359 locsym->lsy_value = frag_now_fix ();
360 #endif
361 }
362 else if (!S_IS_DEFINED (symbolP) || S_IS_COMMON (symbolP))
363 {
364 if (S_GET_VALUE (symbolP) == 0)
365 {
366 symbolP->sy_frag = frag_now;
367 #ifdef OBJ_VMS
368 S_SET_OTHER (symbolP, const_flag);
369 #endif
370 S_SET_VALUE (symbolP, (valueT) frag_now_fix ());
371 S_SET_SEGMENT (symbolP, now_seg);
372 #ifdef N_UNDF
373 know (N_UNDF == 0);
374 #endif /* if we have one, it better be zero. */
375
376 }
377 else
378 {
379 /* There are still several cases to check:
380
381 A .comm/.lcomm symbol being redefined as initialized
382 data is OK
383
384 A .comm/.lcomm symbol being redefined with a larger
385 size is also OK
386
387 This only used to be allowed on VMS gas, but Sun cc
388 on the sparc also depends on it. */
389
390 if (((!S_IS_DEBUG (symbolP)
391 && (!S_IS_DEFINED (symbolP) || S_IS_COMMON (symbolP))
392 && S_IS_EXTERNAL (symbolP))
393 || S_GET_SEGMENT (symbolP) == bss_section)
394 && (now_seg == data_section
395 || now_seg == S_GET_SEGMENT (symbolP)))
396 {
397 /* Select which of the 2 cases this is. */
398 if (now_seg != data_section)
399 {
400 /* New .comm for prev .comm symbol.
401
402 If the new size is larger we just change its
403 value. If the new size is smaller, we ignore
404 this symbol. */
405 if (S_GET_VALUE (symbolP)
406 < ((unsigned) frag_now_fix ()))
407 {
408 S_SET_VALUE (symbolP, (valueT) frag_now_fix ());
409 }
410 }
411 else
412 {
413 /* It is a .comm/.lcomm being converted to initialized
414 data. */
415 symbolP->sy_frag = frag_now;
416 #ifdef OBJ_VMS
417 S_SET_OTHER (symbolP, const_flag);
418 #endif
419 S_SET_VALUE (symbolP, (valueT) frag_now_fix ());
420 S_SET_SEGMENT (symbolP, now_seg); /* Keep N_EXT bit. */
421 }
422 }
423 else
424 {
425 #if (!defined (OBJ_AOUT) && !defined (OBJ_MAYBE_AOUT) \
426 && !defined (OBJ_BOUT) && !defined (OBJ_MAYBE_BOUT))
427 static const char *od_buf = "";
428 #else
429 char od_buf[100];
430 od_buf[0] = '\0';
431 #ifdef BFD_ASSEMBLER
432 if (OUTPUT_FLAVOR == bfd_target_aout_flavour)
433 #endif
434 sprintf (od_buf, "%d.%d.",
435 S_GET_OTHER (symbolP),
436 S_GET_DESC (symbolP));
437 #endif
438 as_bad (_("symbol `%s' is already defined as \"%s\"/%s%ld"),
439 sym_name,
440 segment_name (S_GET_SEGMENT (symbolP)),
441 od_buf,
442 (long) S_GET_VALUE (symbolP));
443 }
444 } /* if the undefined symbol has no value */
445 }
446 else
447 {
448 /* Don't blow up if the definition is the same. */
449 if (!(frag_now == symbolP->sy_frag
450 && S_GET_VALUE (symbolP) == frag_now_fix ()
451 && S_GET_SEGMENT (symbolP) == now_seg))
452 as_bad (_("symbol `%s' is already defined"), sym_name);
453 }
454
455 }
456 #ifdef BFD_ASSEMBLER
457 else if (! flag_keep_locals && bfd_is_local_label_name (stdoutput, sym_name))
458 {
459 symbolP = (symbolS *) local_symbol_make (sym_name, now_seg,
460 (valueT) frag_now_fix (),
461 frag_now);
462 }
463 #endif /* BFD_ASSEMBLER */
464 else
465 {
466 symbolP = symbol_new (sym_name, now_seg, (valueT) frag_now_fix (),
467 frag_now);
468 #ifdef OBJ_VMS
469 S_SET_OTHER (symbolP, const_flag);
470 #endif /* OBJ_VMS */
471
472 symbol_table_insert (symbolP);
473 }
474
475 if (mri_common_symbol != NULL)
476 {
477 /* This symbol is actually being defined within an MRI common
478 section. This requires special handling. */
479 if (LOCAL_SYMBOL_CHECK (symbolP))
480 symbolP = local_symbol_convert ((struct local_symbol *) symbolP);
481 symbolP->sy_value.X_op = O_symbol;
482 symbolP->sy_value.X_add_symbol = mri_common_symbol;
483 symbolP->sy_value.X_add_number = S_GET_VALUE (mri_common_symbol);
484 symbolP->sy_frag = &zero_address_frag;
485 S_SET_SEGMENT (symbolP, expr_section);
486 symbolP->sy_mri_common = 1;
487 }
488
489 #ifdef tc_frob_label
490 tc_frob_label (symbolP);
491 #endif
492 #ifdef obj_frob_label
493 obj_frob_label (symbolP);
494 #endif
495
496 return symbolP;
497 }
498 \f
499 /* Die if we can't insert the symbol. */
500
501 void
502 symbol_table_insert (symbolS *symbolP)
503 {
504 register const char *error_string;
505
506 know (symbolP);
507 know (S_GET_NAME (symbolP));
508
509 if (LOCAL_SYMBOL_CHECK (symbolP))
510 {
511 error_string = hash_jam (local_hash, S_GET_NAME (symbolP),
512 (PTR) symbolP);
513 if (error_string != NULL)
514 as_fatal (_("inserting \"%s\" into symbol table failed: %s"),
515 S_GET_NAME (symbolP), error_string);
516 return;
517 }
518
519 if ((error_string = hash_jam (sy_hash, S_GET_NAME (symbolP), (PTR) symbolP)))
520 {
521 as_fatal (_("inserting \"%s\" into symbol table failed: %s"),
522 S_GET_NAME (symbolP), error_string);
523 } /* on error */
524 }
525 \f
526 /* If a symbol name does not exist, create it as undefined, and insert
527 it into the symbol table. Return a pointer to it. */
528
529 symbolS *
530 symbol_find_or_make (const char *name)
531 {
532 register symbolS *symbolP;
533
534 symbolP = symbol_find (name);
535
536 if (symbolP == NULL)
537 {
538 #ifdef BFD_ASSEMBLER
539 if (! flag_keep_locals && bfd_is_local_label_name (stdoutput, name))
540 {
541 symbolP = md_undefined_symbol ((char *) name);
542 if (symbolP != NULL)
543 return symbolP;
544
545 symbolP = (symbolS *) local_symbol_make (name, undefined_section,
546 (valueT) 0,
547 &zero_address_frag);
548 return symbolP;
549 }
550 #endif
551
552 symbolP = symbol_make (name);
553
554 symbol_table_insert (symbolP);
555 } /* if symbol wasn't found */
556
557 return (symbolP);
558 }
559
560 symbolS *
561 symbol_make (const char *name)
562 {
563 symbolS *symbolP;
564
565 /* Let the machine description default it, e.g. for register names. */
566 symbolP = md_undefined_symbol ((char *) name);
567
568 if (!symbolP)
569 symbolP = symbol_new (name, undefined_section, (valueT) 0, &zero_address_frag);
570
571 return (symbolP);
572 }
573
574 symbolS *
575 symbol_temp_new (segT seg, valueT ofs, fragS *frag)
576 {
577 return symbol_new (FAKE_LABEL_NAME, seg, ofs, frag);
578 }
579
580 symbolS *
581 symbol_temp_new_now (void)
582 {
583 return symbol_temp_new (now_seg, frag_now_fix (), frag_now);
584 }
585
586 symbolS *
587 symbol_temp_make (void)
588 {
589 return symbol_make (FAKE_LABEL_NAME);
590 }
591
592 /* Implement symbol table lookup.
593 In: A symbol's name as a string: '\0' can't be part of a symbol name.
594 Out: NULL if the name was not in the symbol table, else the address
595 of a struct symbol associated with that name. */
596
597 symbolS *
598 symbol_find_exact (const char *name)
599 {
600 #ifdef BFD_ASSEMBLER
601 {
602 struct local_symbol *locsym;
603
604 locsym = (struct local_symbol *) hash_find (local_hash, name);
605 if (locsym != NULL)
606 return (symbolS *) locsym;
607 }
608 #endif
609
610 return ((symbolS *) hash_find (sy_hash, name));
611 }
612
613 symbolS *
614 symbol_find (const char *name)
615 {
616 #ifdef tc_canonicalize_symbol_name
617 {
618 char *copy;
619 size_t len = strlen (name) + 1;
620
621 copy = (char *) alloca (len);
622 memcpy (copy, name, len);
623 name = tc_canonicalize_symbol_name (copy);
624 }
625 #endif
626
627 if (! symbols_case_sensitive)
628 {
629 char *copy;
630 const char *orig;
631 unsigned char c;
632
633 orig = name;
634 name = copy = (char *) alloca (strlen (name) + 1);
635
636 while ((c = *orig++) != '\0')
637 {
638 *copy++ = TOUPPER (c);
639 }
640 *copy = '\0';
641 }
642
643 return symbol_find_exact (name);
644 }
645
646 /* Once upon a time, symbols were kept in a singly linked list. At
647 least coff needs to be able to rearrange them from time to time, for
648 which a doubly linked list is much more convenient. Loic did these
649 as macros which seemed dangerous to me so they're now functions.
650 xoxorich. */
651
652 /* Link symbol ADDME after symbol TARGET in the chain. */
653
654 void
655 symbol_append (symbolS *addme, symbolS *target,
656 symbolS **rootPP, symbolS **lastPP)
657 {
658 if (LOCAL_SYMBOL_CHECK (addme))
659 abort ();
660 if (target != NULL && LOCAL_SYMBOL_CHECK (target))
661 abort ();
662
663 if (target == NULL)
664 {
665 know (*rootPP == NULL);
666 know (*lastPP == NULL);
667 addme->sy_next = NULL;
668 #ifdef SYMBOLS_NEED_BACKPOINTERS
669 addme->sy_previous = NULL;
670 #endif
671 *rootPP = addme;
672 *lastPP = addme;
673 return;
674 } /* if the list is empty */
675
676 if (target->sy_next != NULL)
677 {
678 #ifdef SYMBOLS_NEED_BACKPOINTERS
679 target->sy_next->sy_previous = addme;
680 #endif /* SYMBOLS_NEED_BACKPOINTERS */
681 }
682 else
683 {
684 know (*lastPP == target);
685 *lastPP = addme;
686 } /* if we have a next */
687
688 addme->sy_next = target->sy_next;
689 target->sy_next = addme;
690
691 #ifdef SYMBOLS_NEED_BACKPOINTERS
692 addme->sy_previous = target;
693 #endif /* SYMBOLS_NEED_BACKPOINTERS */
694
695 debug_verify_symchain (symbol_rootP, symbol_lastP);
696 }
697
698 /* Set the chain pointers of SYMBOL to null. */
699
700 void
701 symbol_clear_list_pointers (symbolS *symbolP)
702 {
703 if (LOCAL_SYMBOL_CHECK (symbolP))
704 abort ();
705 symbolP->sy_next = NULL;
706 #ifdef SYMBOLS_NEED_BACKPOINTERS
707 symbolP->sy_previous = NULL;
708 #endif
709 }
710
711 #ifdef SYMBOLS_NEED_BACKPOINTERS
712 /* Remove SYMBOLP from the list. */
713
714 void
715 symbol_remove (symbolS *symbolP, symbolS **rootPP, symbolS **lastPP)
716 {
717 if (LOCAL_SYMBOL_CHECK (symbolP))
718 abort ();
719
720 if (symbolP == *rootPP)
721 {
722 *rootPP = symbolP->sy_next;
723 } /* if it was the root */
724
725 if (symbolP == *lastPP)
726 {
727 *lastPP = symbolP->sy_previous;
728 } /* if it was the tail */
729
730 if (symbolP->sy_next != NULL)
731 {
732 symbolP->sy_next->sy_previous = symbolP->sy_previous;
733 } /* if not last */
734
735 if (symbolP->sy_previous != NULL)
736 {
737 symbolP->sy_previous->sy_next = symbolP->sy_next;
738 } /* if not first */
739
740 debug_verify_symchain (*rootPP, *lastPP);
741 }
742
743 /* Link symbol ADDME before symbol TARGET in the chain. */
744
745 void
746 symbol_insert (symbolS *addme, symbolS *target,
747 symbolS **rootPP, symbolS **lastPP ATTRIBUTE_UNUSED)
748 {
749 if (LOCAL_SYMBOL_CHECK (addme))
750 abort ();
751 if (LOCAL_SYMBOL_CHECK (target))
752 abort ();
753
754 if (target->sy_previous != NULL)
755 {
756 target->sy_previous->sy_next = addme;
757 }
758 else
759 {
760 know (*rootPP == target);
761 *rootPP = addme;
762 } /* if not first */
763
764 addme->sy_previous = target->sy_previous;
765 target->sy_previous = addme;
766 addme->sy_next = target;
767
768 debug_verify_symchain (*rootPP, *lastPP);
769 }
770
771 #endif /* SYMBOLS_NEED_BACKPOINTERS */
772
773 void
774 verify_symbol_chain (symbolS *rootP, symbolS *lastP)
775 {
776 symbolS *symbolP = rootP;
777
778 if (symbolP == NULL)
779 return;
780
781 for (; symbol_next (symbolP) != NULL; symbolP = symbol_next (symbolP))
782 {
783 #ifdef BFD_ASSEMBLER
784 assert (symbolP->bsym != NULL);
785 #endif
786 #ifdef SYMBOLS_NEED_BACKPOINTERS
787 assert (symbolP->sy_next->sy_previous == symbolP);
788 #else
789 /* Walk the list anyways, to make sure pointers are still good. */
790 ;
791 #endif /* SYMBOLS_NEED_BACKPOINTERS */
792 }
793
794 assert (lastP == symbolP);
795 }
796
797 void
798 verify_symbol_chain_2 (symbolS *sym)
799 {
800 symbolS *p = sym, *n = sym;
801 #ifdef SYMBOLS_NEED_BACKPOINTERS
802 while (symbol_previous (p))
803 p = symbol_previous (p);
804 #endif
805 while (symbol_next (n))
806 n = symbol_next (n);
807 verify_symbol_chain (p, n);
808 }
809
810 static void
811 report_op_error (symbolS *symp, symbolS *left, symbolS *right)
812 {
813 char *file;
814 unsigned int line;
815 segT seg_left = S_GET_SEGMENT (left);
816 segT seg_right = right ? S_GET_SEGMENT (right) : 0;
817
818 if (expr_symbol_where (symp, &file, &line))
819 {
820 if (seg_left == undefined_section)
821 as_bad_where (file, line,
822 _("undefined symbol `%s' in operation"),
823 S_GET_NAME (left));
824 if (seg_right == undefined_section)
825 as_bad_where (file, line,
826 _("undefined symbol `%s' in operation"),
827 S_GET_NAME (right));
828 if (seg_left != undefined_section
829 && seg_right != undefined_section)
830 {
831 if (right)
832 as_bad_where (file, line,
833 _("invalid sections for operation on `%s' and `%s'"),
834 S_GET_NAME (left), S_GET_NAME (right));
835 else
836 as_bad_where (file, line,
837 _("invalid section for operation on `%s'"),
838 S_GET_NAME (left));
839 }
840
841 }
842 else
843 {
844 if (seg_left == undefined_section)
845 as_bad (_("undefined symbol `%s' in operation setting `%s'"),
846 S_GET_NAME (left), S_GET_NAME (symp));
847 if (seg_right == undefined_section)
848 as_bad (_("undefined symbol `%s' in operation setting `%s'"),
849 S_GET_NAME (right), S_GET_NAME (symp));
850 if (seg_left != undefined_section
851 && seg_right != undefined_section)
852 {
853 if (right)
854 as_bad_where (file, line,
855 _("invalid sections for operation on `%s' and `%s' setting `%s'"),
856 S_GET_NAME (left), S_GET_NAME (right), S_GET_NAME (symp));
857 else
858 as_bad_where (file, line,
859 _("invalid section for operation on `%s' setting `%s'"),
860 S_GET_NAME (left), S_GET_NAME (symp));
861 }
862 }
863 }
864
865 /* Resolve the value of a symbol. This is called during the final
866 pass over the symbol table to resolve any symbols with complex
867 values. */
868
869 valueT
870 resolve_symbol_value (symbolS *symp)
871 {
872 int resolved;
873 valueT final_val = 0;
874 segT final_seg;
875
876 #ifdef BFD_ASSEMBLER
877 if (LOCAL_SYMBOL_CHECK (symp))
878 {
879 struct local_symbol *locsym = (struct local_symbol *) symp;
880
881 final_val = locsym->lsy_value;
882 if (local_symbol_resolved_p (locsym))
883 return final_val;
884
885 final_val += local_symbol_get_frag (locsym)->fr_address / OCTETS_PER_BYTE;
886
887 if (finalize_syms)
888 {
889 locsym->lsy_value = final_val;
890 local_symbol_mark_resolved (locsym);
891 }
892
893 return final_val;
894 }
895 #endif
896
897 if (symp->sy_resolved)
898 {
899 if (symp->sy_value.X_op == O_constant)
900 return (valueT) symp->sy_value.X_add_number;
901 else
902 return 0;
903 }
904
905 resolved = 0;
906 final_seg = S_GET_SEGMENT (symp);
907
908 if (symp->sy_resolving)
909 {
910 if (finalize_syms)
911 as_bad (_("symbol definition loop encountered at `%s'"),
912 S_GET_NAME (symp));
913 final_val = 0;
914 resolved = 1;
915 }
916 else
917 {
918 symbolS *add_symbol, *op_symbol;
919 offsetT left, right;
920 segT seg_left, seg_right;
921 operatorT op;
922
923 symp->sy_resolving = 1;
924
925 /* Help out with CSE. */
926 add_symbol = symp->sy_value.X_add_symbol;
927 op_symbol = symp->sy_value.X_op_symbol;
928 final_val = symp->sy_value.X_add_number;
929 op = symp->sy_value.X_op;
930
931 switch (op)
932 {
933 default:
934 BAD_CASE (op);
935 break;
936
937 case O_absent:
938 final_val = 0;
939 /* Fall through. */
940
941 case O_constant:
942 final_val += symp->sy_frag->fr_address / OCTETS_PER_BYTE;
943 if (final_seg == expr_section)
944 final_seg = absolute_section;
945 resolved = 1;
946 break;
947
948 case O_symbol:
949 case O_symbol_rva:
950 left = resolve_symbol_value (add_symbol);
951 seg_left = S_GET_SEGMENT (add_symbol);
952 if (finalize_syms)
953 symp->sy_value.X_op_symbol = NULL;
954
955 do_symbol:
956 if (symp->sy_mri_common)
957 {
958 /* This is a symbol inside an MRI common section. The
959 relocation routines are going to handle it specially.
960 Don't change the value. */
961 resolved = symbol_resolved_p (add_symbol);
962 break;
963 }
964
965 if (finalize_syms && final_val == 0)
966 {
967 if (LOCAL_SYMBOL_CHECK (add_symbol))
968 add_symbol = local_symbol_convert ((struct local_symbol *)
969 add_symbol);
970 copy_symbol_attributes (symp, add_symbol);
971 }
972
973 /* If we have equated this symbol to an undefined or common
974 symbol, keep X_op set to O_symbol, and don't change
975 X_add_number. This permits the routine which writes out
976 relocation to detect this case, and convert the
977 relocation to be against the symbol to which this symbol
978 is equated. */
979 if (! S_IS_DEFINED (add_symbol)
980 #if defined (OBJ_COFF) && defined (TE_PE) && (defined(BFD_ASSEMBLER) || defined(S_IS_WEAK))
981 || S_IS_WEAK (add_symbol)
982 #endif
983 || S_IS_COMMON (add_symbol))
984 {
985 if (finalize_syms)
986 {
987 symp->sy_value.X_op = O_symbol;
988 symp->sy_value.X_add_symbol = add_symbol;
989 symp->sy_value.X_add_number = final_val;
990 /* Use X_op_symbol as a flag. */
991 symp->sy_value.X_op_symbol = add_symbol;
992 final_seg = seg_left;
993 }
994 final_val = 0;
995 resolved = symbol_resolved_p (add_symbol);
996 symp->sy_resolving = 0;
997 goto exit_dont_set_value;
998 }
999 else if (finalize_syms && final_seg == expr_section
1000 && seg_left != expr_section)
1001 {
1002 /* If the symbol is an expression symbol, do similarly
1003 as for undefined and common syms above. Handles
1004 "sym +/- expr" where "expr" cannot be evaluated
1005 immediately, and we want relocations to be against
1006 "sym", eg. because it is weak. */
1007 symp->sy_value.X_op = O_symbol;
1008 symp->sy_value.X_add_symbol = add_symbol;
1009 symp->sy_value.X_add_number = final_val;
1010 symp->sy_value.X_op_symbol = add_symbol;
1011 final_seg = seg_left;
1012 final_val += symp->sy_frag->fr_address + left;
1013 resolved = symbol_resolved_p (add_symbol);
1014 symp->sy_resolving = 0;
1015 goto exit_dont_set_value;
1016 }
1017 else
1018 {
1019 final_val += symp->sy_frag->fr_address + left;
1020 if (final_seg == expr_section || final_seg == undefined_section)
1021 final_seg = seg_left;
1022 }
1023
1024 resolved = symbol_resolved_p (add_symbol);
1025 break;
1026
1027 case O_uminus:
1028 case O_bit_not:
1029 case O_logical_not:
1030 left = resolve_symbol_value (add_symbol);
1031 seg_left = S_GET_SEGMENT (add_symbol);
1032
1033 /* By reducing these to the relevant dyadic operator, we get
1034 !S -> S == 0 permitted on anything,
1035 -S -> 0 - S only permitted on absolute
1036 ~S -> S ^ ~0 only permitted on absolute */
1037 if (op != O_logical_not && seg_left != absolute_section
1038 && finalize_syms)
1039 report_op_error (symp, add_symbol, NULL);
1040
1041 if (final_seg == expr_section || final_seg == undefined_section)
1042 final_seg = absolute_section;
1043
1044 if (op == O_uminus)
1045 left = -left;
1046 else if (op == O_logical_not)
1047 left = !left;
1048 else
1049 left = ~left;
1050
1051 final_val += left + symp->sy_frag->fr_address;
1052
1053 resolved = symbol_resolved_p (add_symbol);
1054 break;
1055
1056 case O_multiply:
1057 case O_divide:
1058 case O_modulus:
1059 case O_left_shift:
1060 case O_right_shift:
1061 case O_bit_inclusive_or:
1062 case O_bit_or_not:
1063 case O_bit_exclusive_or:
1064 case O_bit_and:
1065 case O_add:
1066 case O_subtract:
1067 case O_eq:
1068 case O_ne:
1069 case O_lt:
1070 case O_le:
1071 case O_ge:
1072 case O_gt:
1073 case O_logical_and:
1074 case O_logical_or:
1075 left = resolve_symbol_value (add_symbol);
1076 right = resolve_symbol_value (op_symbol);
1077 seg_left = S_GET_SEGMENT (add_symbol);
1078 seg_right = S_GET_SEGMENT (op_symbol);
1079
1080 /* Simplify addition or subtraction of a constant by folding the
1081 constant into X_add_number. */
1082 if (op == O_add)
1083 {
1084 if (seg_right == absolute_section)
1085 {
1086 final_val += right;
1087 goto do_symbol;
1088 }
1089 else if (seg_left == absolute_section)
1090 {
1091 final_val += left;
1092 add_symbol = op_symbol;
1093 left = right;
1094 seg_left = seg_right;
1095 goto do_symbol;
1096 }
1097 }
1098 else if (op == O_subtract)
1099 {
1100 if (seg_right == absolute_section)
1101 {
1102 final_val -= right;
1103 goto do_symbol;
1104 }
1105 }
1106
1107 /* Equality and non-equality tests are permitted on anything.
1108 Subtraction, and other comparison operators are permitted if
1109 both operands are in the same section. Otherwise, both
1110 operands must be absolute. We already handled the case of
1111 addition or subtraction of a constant above. This will
1112 probably need to be changed for an object file format which
1113 supports arbitrary expressions, such as IEEE-695.
1114
1115 Don't emit messages unless we're finalizing the symbol value,
1116 otherwise we may get the same message multiple times. */
1117 if (finalize_syms
1118 && !(seg_left == absolute_section
1119 && seg_right == absolute_section)
1120 && !(op == O_eq || op == O_ne)
1121 && !((op == O_subtract
1122 || op == O_lt || op == O_le || op == O_ge || op == O_gt)
1123 && seg_left == seg_right
1124 && (seg_left != undefined_section
1125 || add_symbol == op_symbol)))
1126 report_op_error (symp, add_symbol, op_symbol);
1127
1128 if (final_seg == expr_section || final_seg == undefined_section)
1129 final_seg = absolute_section;
1130
1131 /* Check for division by zero. */
1132 if ((op == O_divide || op == O_modulus) && right == 0)
1133 {
1134 /* If seg_right is not absolute_section, then we've
1135 already issued a warning about using a bad symbol. */
1136 if (seg_right == absolute_section && finalize_syms)
1137 {
1138 char *file;
1139 unsigned int line;
1140
1141 if (expr_symbol_where (symp, &file, &line))
1142 as_bad_where (file, line, _("division by zero"));
1143 else
1144 as_bad (_("division by zero when setting `%s'"),
1145 S_GET_NAME (symp));
1146 }
1147
1148 right = 1;
1149 }
1150
1151 switch (symp->sy_value.X_op)
1152 {
1153 case O_multiply: left *= right; break;
1154 case O_divide: left /= right; break;
1155 case O_modulus: left %= right; break;
1156 case O_left_shift: left <<= right; break;
1157 case O_right_shift: left >>= right; break;
1158 case O_bit_inclusive_or: left |= right; break;
1159 case O_bit_or_not: left |= ~right; break;
1160 case O_bit_exclusive_or: left ^= right; break;
1161 case O_bit_and: left &= right; break;
1162 case O_add: left += right; break;
1163 case O_subtract: left -= right; break;
1164 case O_eq:
1165 case O_ne:
1166 left = (left == right && seg_left == seg_right
1167 && (seg_left != undefined_section
1168 || add_symbol == op_symbol)
1169 ? ~ (offsetT) 0 : 0);
1170 if (symp->sy_value.X_op == O_ne)
1171 left = ~left;
1172 break;
1173 case O_lt: left = left < right ? ~ (offsetT) 0 : 0; break;
1174 case O_le: left = left <= right ? ~ (offsetT) 0 : 0; break;
1175 case O_ge: left = left >= right ? ~ (offsetT) 0 : 0; break;
1176 case O_gt: left = left > right ? ~ (offsetT) 0 : 0; break;
1177 case O_logical_and: left = left && right; break;
1178 case O_logical_or: left = left || right; break;
1179 default: abort ();
1180 }
1181
1182 final_val += symp->sy_frag->fr_address + left;
1183 if (final_seg == expr_section || final_seg == undefined_section)
1184 {
1185 if (seg_left == undefined_section
1186 || seg_right == undefined_section)
1187 final_seg = undefined_section;
1188 else if (seg_left == absolute_section)
1189 final_seg = seg_right;
1190 else
1191 final_seg = seg_left;
1192 }
1193 resolved = (symbol_resolved_p (add_symbol)
1194 && symbol_resolved_p (op_symbol));
1195 break;
1196
1197 case O_register:
1198 case O_big:
1199 case O_illegal:
1200 /* Give an error (below) if not in expr_section. We don't
1201 want to worry about expr_section symbols, because they
1202 are fictional (they are created as part of expression
1203 resolution), and any problems may not actually mean
1204 anything. */
1205 break;
1206 }
1207
1208 symp->sy_resolving = 0;
1209 }
1210
1211 if (finalize_syms)
1212 S_SET_VALUE (symp, final_val);
1213
1214 exit_dont_set_value:
1215 /* Always set the segment, even if not finalizing the value.
1216 The segment is used to determine whether a symbol is defined. */
1217 #if defined (OBJ_AOUT) && ! defined (BFD_ASSEMBLER)
1218 /* The old a.out backend does not handle S_SET_SEGMENT correctly
1219 for a stab symbol, so we use this bad hack. */
1220 if (final_seg != S_GET_SEGMENT (symp))
1221 #endif
1222 S_SET_SEGMENT (symp, final_seg);
1223
1224 /* Don't worry if we can't resolve an expr_section symbol. */
1225 if (finalize_syms)
1226 {
1227 if (resolved)
1228 symp->sy_resolved = 1;
1229 else if (S_GET_SEGMENT (symp) != expr_section)
1230 {
1231 as_bad (_("can't resolve value for symbol `%s'"),
1232 S_GET_NAME (symp));
1233 symp->sy_resolved = 1;
1234 }
1235 }
1236
1237 return final_val;
1238 }
1239
1240 #ifdef BFD_ASSEMBLER
1241
1242 static void resolve_local_symbol (const char *, PTR);
1243
1244 /* A static function passed to hash_traverse. */
1245
1246 static void
1247 resolve_local_symbol (const char *key ATTRIBUTE_UNUSED, PTR value)
1248 {
1249 if (value != NULL)
1250 resolve_symbol_value (value);
1251 }
1252
1253 #endif
1254
1255 /* Resolve all local symbols. */
1256
1257 void
1258 resolve_local_symbol_values (void)
1259 {
1260 #ifdef BFD_ASSEMBLER
1261 hash_traverse (local_hash, resolve_local_symbol);
1262 #endif
1263 }
1264
1265 /* Dollar labels look like a number followed by a dollar sign. Eg, "42$".
1266 They are *really* local. That is, they go out of scope whenever we see a
1267 label that isn't local. Also, like fb labels, there can be multiple
1268 instances of a dollar label. Therefor, we name encode each instance with
1269 the instance number, keep a list of defined symbols separate from the real
1270 symbol table, and we treat these buggers as a sparse array. */
1271
1272 static long *dollar_labels;
1273 static long *dollar_label_instances;
1274 static char *dollar_label_defines;
1275 static unsigned long dollar_label_count;
1276 static unsigned long dollar_label_max;
1277
1278 int
1279 dollar_label_defined (long label)
1280 {
1281 long *i;
1282
1283 know ((dollar_labels != NULL) || (dollar_label_count == 0));
1284
1285 for (i = dollar_labels; i < dollar_labels + dollar_label_count; ++i)
1286 if (*i == label)
1287 return dollar_label_defines[i - dollar_labels];
1288
1289 /* If we get here, label isn't defined. */
1290 return 0;
1291 }
1292
1293 static long
1294 dollar_label_instance (long label)
1295 {
1296 long *i;
1297
1298 know ((dollar_labels != NULL) || (dollar_label_count == 0));
1299
1300 for (i = dollar_labels; i < dollar_labels + dollar_label_count; ++i)
1301 if (*i == label)
1302 return (dollar_label_instances[i - dollar_labels]);
1303
1304 /* If we get here, we haven't seen the label before.
1305 Therefore its instance count is zero. */
1306 return 0;
1307 }
1308
1309 void
1310 dollar_label_clear (void)
1311 {
1312 memset (dollar_label_defines, '\0', (unsigned int) dollar_label_count);
1313 }
1314
1315 #define DOLLAR_LABEL_BUMP_BY 10
1316
1317 void
1318 define_dollar_label (long label)
1319 {
1320 long *i;
1321
1322 for (i = dollar_labels; i < dollar_labels + dollar_label_count; ++i)
1323 if (*i == label)
1324 {
1325 ++dollar_label_instances[i - dollar_labels];
1326 dollar_label_defines[i - dollar_labels] = 1;
1327 return;
1328 }
1329
1330 /* If we get to here, we don't have label listed yet. */
1331
1332 if (dollar_labels == NULL)
1333 {
1334 dollar_labels = (long *) xmalloc (DOLLAR_LABEL_BUMP_BY * sizeof (long));
1335 dollar_label_instances = (long *) xmalloc (DOLLAR_LABEL_BUMP_BY * sizeof (long));
1336 dollar_label_defines = xmalloc (DOLLAR_LABEL_BUMP_BY);
1337 dollar_label_max = DOLLAR_LABEL_BUMP_BY;
1338 dollar_label_count = 0;
1339 }
1340 else if (dollar_label_count == dollar_label_max)
1341 {
1342 dollar_label_max += DOLLAR_LABEL_BUMP_BY;
1343 dollar_labels = (long *) xrealloc ((char *) dollar_labels,
1344 dollar_label_max * sizeof (long));
1345 dollar_label_instances = (long *) xrealloc ((char *) dollar_label_instances,
1346 dollar_label_max * sizeof (long));
1347 dollar_label_defines = xrealloc (dollar_label_defines, dollar_label_max);
1348 } /* if we needed to grow */
1349
1350 dollar_labels[dollar_label_count] = label;
1351 dollar_label_instances[dollar_label_count] = 1;
1352 dollar_label_defines[dollar_label_count] = 1;
1353 ++dollar_label_count;
1354 }
1355
1356 /* Caller must copy returned name: we re-use the area for the next name.
1357
1358 The mth occurence of label n: is turned into the symbol "Ln^Am"
1359 where n is the label number and m is the instance number. "L" makes
1360 it a label discarded unless debugging and "^A"('\1') ensures no
1361 ordinary symbol SHOULD get the same name as a local label
1362 symbol. The first "4:" is "L4^A1" - the m numbers begin at 1.
1363
1364 fb labels get the same treatment, except that ^B is used in place
1365 of ^A. */
1366
1367 char * /* Return local label name. */
1368 dollar_label_name (register long n, /* we just saw "n$:" : n a number. */
1369 register int augend /* 0 for current instance, 1 for new instance. */)
1370 {
1371 long i;
1372 /* Returned to caller, then copied. Used for created names ("4f"). */
1373 static char symbol_name_build[24];
1374 register char *p;
1375 register char *q;
1376 char symbol_name_temporary[20]; /* Build up a number, BACKWARDS. */
1377
1378 know (n >= 0);
1379 know (augend == 0 || augend == 1);
1380 p = symbol_name_build;
1381 #ifdef LOCAL_LABEL_PREFIX
1382 *p++ = LOCAL_LABEL_PREFIX;
1383 #endif
1384 *p++ = 'L';
1385
1386 /* Next code just does sprintf( {}, "%d", n); */
1387 /* Label number. */
1388 q = symbol_name_temporary;
1389 for (*q++ = 0, i = n; i; ++q)
1390 {
1391 *q = i % 10 + '0';
1392 i /= 10;
1393 }
1394 while ((*p = *--q) != '\0')
1395 ++p;
1396
1397 *p++ = DOLLAR_LABEL_CHAR; /* ^A */
1398
1399 /* Instance number. */
1400 q = symbol_name_temporary;
1401 for (*q++ = 0, i = dollar_label_instance (n) + augend; i; ++q)
1402 {
1403 *q = i % 10 + '0';
1404 i /= 10;
1405 }
1406 while ((*p++ = *--q) != '\0');;
1407
1408 /* The label, as a '\0' ended string, starts at symbol_name_build. */
1409 return symbol_name_build;
1410 }
1411
1412 /* Somebody else's idea of local labels. They are made by "n:" where n
1413 is any decimal digit. Refer to them with
1414 "nb" for previous (backward) n:
1415 or "nf" for next (forward) n:.
1416
1417 We do a little better and let n be any number, not just a single digit, but
1418 since the other guy's assembler only does ten, we treat the first ten
1419 specially.
1420
1421 Like someone else's assembler, we have one set of local label counters for
1422 entire assembly, not one set per (sub)segment like in most assemblers. This
1423 implies that one can refer to a label in another segment, and indeed some
1424 crufty compilers have done just that.
1425
1426 Since there could be a LOT of these things, treat them as a sparse
1427 array. */
1428
1429 #define FB_LABEL_SPECIAL (10)
1430
1431 static long fb_low_counter[FB_LABEL_SPECIAL];
1432 static long *fb_labels;
1433 static long *fb_label_instances;
1434 static long fb_label_count;
1435 static long fb_label_max;
1436
1437 /* This must be more than FB_LABEL_SPECIAL. */
1438 #define FB_LABEL_BUMP_BY (FB_LABEL_SPECIAL + 6)
1439
1440 static void
1441 fb_label_init (void)
1442 {
1443 memset ((void *) fb_low_counter, '\0', sizeof (fb_low_counter));
1444 }
1445
1446 /* Add one to the instance number of this fb label. */
1447
1448 void
1449 fb_label_instance_inc (long label)
1450 {
1451 long *i;
1452
1453 if (label < FB_LABEL_SPECIAL)
1454 {
1455 ++fb_low_counter[label];
1456 return;
1457 }
1458
1459 if (fb_labels != NULL)
1460 {
1461 for (i = fb_labels + FB_LABEL_SPECIAL;
1462 i < fb_labels + fb_label_count; ++i)
1463 {
1464 if (*i == label)
1465 {
1466 ++fb_label_instances[i - fb_labels];
1467 return;
1468 } /* if we find it */
1469 } /* for each existing label */
1470 }
1471
1472 /* If we get to here, we don't have label listed yet. */
1473
1474 if (fb_labels == NULL)
1475 {
1476 fb_labels = (long *) xmalloc (FB_LABEL_BUMP_BY * sizeof (long));
1477 fb_label_instances = (long *) xmalloc (FB_LABEL_BUMP_BY * sizeof (long));
1478 fb_label_max = FB_LABEL_BUMP_BY;
1479 fb_label_count = FB_LABEL_SPECIAL;
1480
1481 }
1482 else if (fb_label_count == fb_label_max)
1483 {
1484 fb_label_max += FB_LABEL_BUMP_BY;
1485 fb_labels = (long *) xrealloc ((char *) fb_labels,
1486 fb_label_max * sizeof (long));
1487 fb_label_instances = (long *) xrealloc ((char *) fb_label_instances,
1488 fb_label_max * sizeof (long));
1489 } /* if we needed to grow */
1490
1491 fb_labels[fb_label_count] = label;
1492 fb_label_instances[fb_label_count] = 1;
1493 ++fb_label_count;
1494 }
1495
1496 static long
1497 fb_label_instance (long label)
1498 {
1499 long *i;
1500
1501 if (label < FB_LABEL_SPECIAL)
1502 {
1503 return (fb_low_counter[label]);
1504 }
1505
1506 if (fb_labels != NULL)
1507 {
1508 for (i = fb_labels + FB_LABEL_SPECIAL;
1509 i < fb_labels + fb_label_count; ++i)
1510 {
1511 if (*i == label)
1512 {
1513 return (fb_label_instances[i - fb_labels]);
1514 } /* if we find it */
1515 } /* for each existing label */
1516 }
1517
1518 /* We didn't find the label, so this must be a reference to the
1519 first instance. */
1520 return 0;
1521 }
1522
1523 /* Caller must copy returned name: we re-use the area for the next name.
1524
1525 The mth occurence of label n: is turned into the symbol "Ln^Bm"
1526 where n is the label number and m is the instance number. "L" makes
1527 it a label discarded unless debugging and "^B"('\2') ensures no
1528 ordinary symbol SHOULD get the same name as a local label
1529 symbol. The first "4:" is "L4^B1" - the m numbers begin at 1.
1530
1531 dollar labels get the same treatment, except that ^A is used in
1532 place of ^B. */
1533
1534 char * /* Return local label name. */
1535 fb_label_name (long n, /* We just saw "n:", "nf" or "nb" : n a number. */
1536 long augend /* 0 for nb, 1 for n:, nf. */)
1537 {
1538 long i;
1539 /* Returned to caller, then copied. Used for created names ("4f"). */
1540 static char symbol_name_build[24];
1541 register char *p;
1542 register char *q;
1543 char symbol_name_temporary[20]; /* Build up a number, BACKWARDS. */
1544
1545 know (n >= 0);
1546 #ifdef TC_MMIX
1547 know ((unsigned long) augend <= 2 /* See mmix_fb_label. */);
1548 #else
1549 know ((unsigned long) augend <= 1);
1550 #endif
1551 p = symbol_name_build;
1552 #ifdef LOCAL_LABEL_PREFIX
1553 *p++ = LOCAL_LABEL_PREFIX;
1554 #endif
1555 *p++ = 'L';
1556
1557 /* Next code just does sprintf( {}, "%d", n); */
1558 /* Label number. */
1559 q = symbol_name_temporary;
1560 for (*q++ = 0, i = n; i; ++q)
1561 {
1562 *q = i % 10 + '0';
1563 i /= 10;
1564 }
1565 while ((*p = *--q) != '\0')
1566 ++p;
1567
1568 *p++ = LOCAL_LABEL_CHAR; /* ^B */
1569
1570 /* Instance number. */
1571 q = symbol_name_temporary;
1572 for (*q++ = 0, i = fb_label_instance (n) + augend; i; ++q)
1573 {
1574 *q = i % 10 + '0';
1575 i /= 10;
1576 }
1577 while ((*p++ = *--q) != '\0');;
1578
1579 /* The label, as a '\0' ended string, starts at symbol_name_build. */
1580 return (symbol_name_build);
1581 }
1582
1583 /* Decode name that may have been generated by foo_label_name() above.
1584 If the name wasn't generated by foo_label_name(), then return it
1585 unaltered. This is used for error messages. */
1586
1587 char *
1588 decode_local_label_name (char *s)
1589 {
1590 char *p;
1591 char *symbol_decode;
1592 int label_number;
1593 int instance_number;
1594 char *type;
1595 const char *message_format;
1596 int index = 0;
1597
1598 #ifdef LOCAL_LABEL_PREFIX
1599 if (s[index] == LOCAL_LABEL_PREFIX)
1600 ++index;
1601 #endif
1602
1603 if (s[index] != 'L')
1604 return s;
1605
1606 for (label_number = 0, p = s + index + 1; ISDIGIT (*p); ++p)
1607 label_number = (10 * label_number) + *p - '0';
1608
1609 if (*p == DOLLAR_LABEL_CHAR)
1610 type = "dollar";
1611 else if (*p == LOCAL_LABEL_CHAR)
1612 type = "fb";
1613 else
1614 return s;
1615
1616 for (instance_number = 0, p++; ISDIGIT (*p); ++p)
1617 instance_number = (10 * instance_number) + *p - '0';
1618
1619 message_format = _("\"%d\" (instance number %d of a %s label)");
1620 symbol_decode = obstack_alloc (&notes, strlen (message_format) + 30);
1621 sprintf (symbol_decode, message_format, label_number, instance_number, type);
1622
1623 return symbol_decode;
1624 }
1625
1626 /* Get the value of a symbol. */
1627
1628 valueT
1629 S_GET_VALUE (symbolS *s)
1630 {
1631 #ifdef BFD_ASSEMBLER
1632 if (LOCAL_SYMBOL_CHECK (s))
1633 return resolve_symbol_value (s);
1634 #endif
1635
1636 if (!s->sy_resolved)
1637 {
1638 valueT val = resolve_symbol_value (s);
1639 if (!finalize_syms)
1640 return val;
1641 }
1642 if (s->sy_value.X_op != O_constant)
1643 {
1644 static symbolS *recur;
1645
1646 /* FIXME: In non BFD assemblers, S_IS_DEFINED and S_IS_COMMON
1647 may call S_GET_VALUE. We use a static symbol to avoid the
1648 immediate recursion. */
1649 if (recur == s)
1650 return (valueT) s->sy_value.X_add_number;
1651 recur = s;
1652 if (! s->sy_resolved
1653 || s->sy_value.X_op != O_symbol
1654 || (S_IS_DEFINED (s) && ! S_IS_COMMON (s)))
1655 as_bad (_("attempt to get value of unresolved symbol `%s'"),
1656 S_GET_NAME (s));
1657 recur = NULL;
1658 }
1659 return (valueT) s->sy_value.X_add_number;
1660 }
1661
1662 /* Set the value of a symbol. */
1663
1664 void
1665 S_SET_VALUE (symbolS *s, valueT val)
1666 {
1667 #ifdef BFD_ASSEMBLER
1668 if (LOCAL_SYMBOL_CHECK (s))
1669 {
1670 ((struct local_symbol *) s)->lsy_value = val;
1671 return;
1672 }
1673 #endif
1674
1675 s->sy_value.X_op = O_constant;
1676 s->sy_value.X_add_number = (offsetT) val;
1677 s->sy_value.X_unsigned = 0;
1678 }
1679
1680 void
1681 copy_symbol_attributes (symbolS *dest, symbolS *src)
1682 {
1683 if (LOCAL_SYMBOL_CHECK (dest))
1684 dest = local_symbol_convert ((struct local_symbol *) dest);
1685 if (LOCAL_SYMBOL_CHECK (src))
1686 src = local_symbol_convert ((struct local_symbol *) src);
1687
1688 #ifdef BFD_ASSEMBLER
1689 /* In an expression, transfer the settings of these flags.
1690 The user can override later, of course. */
1691 #define COPIED_SYMFLAGS (BSF_FUNCTION | BSF_OBJECT)
1692 dest->bsym->flags |= src->bsym->flags & COPIED_SYMFLAGS;
1693 #endif
1694
1695 #ifdef OBJ_COPY_SYMBOL_ATTRIBUTES
1696 OBJ_COPY_SYMBOL_ATTRIBUTES (dest, src);
1697 #endif
1698 }
1699
1700 #ifdef BFD_ASSEMBLER
1701
1702 int
1703 S_IS_FUNCTION (symbolS *s)
1704 {
1705 flagword flags;
1706
1707 if (LOCAL_SYMBOL_CHECK (s))
1708 return 0;
1709
1710 flags = s->bsym->flags;
1711
1712 return (flags & BSF_FUNCTION) != 0;
1713 }
1714
1715 int
1716 S_IS_EXTERNAL (symbolS *s)
1717 {
1718 flagword flags;
1719
1720 if (LOCAL_SYMBOL_CHECK (s))
1721 return 0;
1722
1723 flags = s->bsym->flags;
1724
1725 /* Sanity check. */
1726 if ((flags & BSF_LOCAL) && (flags & BSF_GLOBAL))
1727 abort ();
1728
1729 return (flags & BSF_GLOBAL) != 0;
1730 }
1731
1732 int
1733 S_IS_WEAK (symbolS *s)
1734 {
1735 if (LOCAL_SYMBOL_CHECK (s))
1736 return 0;
1737 return (s->bsym->flags & BSF_WEAK) != 0;
1738 }
1739
1740 int
1741 S_IS_COMMON (symbolS *s)
1742 {
1743 if (LOCAL_SYMBOL_CHECK (s))
1744 return 0;
1745 return bfd_is_com_section (s->bsym->section);
1746 }
1747
1748 int
1749 S_IS_DEFINED (symbolS *s)
1750 {
1751 if (LOCAL_SYMBOL_CHECK (s))
1752 return ((struct local_symbol *) s)->lsy_section != undefined_section;
1753 return s->bsym->section != undefined_section;
1754 }
1755
1756
1757 #ifndef EXTERN_FORCE_RELOC
1758 #define EXTERN_FORCE_RELOC IS_ELF
1759 #endif
1760
1761 /* Return true for symbols that should not be reduced to section
1762 symbols or eliminated from expressions, because they may be
1763 overridden by the linker. */
1764 int
1765 S_FORCE_RELOC (symbolS *s, int strict)
1766 {
1767 if (LOCAL_SYMBOL_CHECK (s))
1768 return ((struct local_symbol *) s)->lsy_section == undefined_section;
1769
1770 return ((strict
1771 && ((s->bsym->flags & BSF_WEAK) != 0
1772 || (EXTERN_FORCE_RELOC
1773 && (s->bsym->flags & BSF_GLOBAL) != 0)))
1774 || s->bsym->section == undefined_section
1775 || bfd_is_com_section (s->bsym->section));
1776 }
1777
1778 int
1779 S_IS_DEBUG (symbolS *s)
1780 {
1781 if (LOCAL_SYMBOL_CHECK (s))
1782 return 0;
1783 if (s->bsym->flags & BSF_DEBUGGING)
1784 return 1;
1785 return 0;
1786 }
1787
1788 int
1789 S_IS_LOCAL (symbolS *s)
1790 {
1791 flagword flags;
1792 const char *name;
1793
1794 if (LOCAL_SYMBOL_CHECK (s))
1795 return 1;
1796
1797 flags = s->bsym->flags;
1798
1799 /* Sanity check. */
1800 if ((flags & BSF_LOCAL) && (flags & BSF_GLOBAL))
1801 abort ();
1802
1803 if (bfd_get_section (s->bsym) == reg_section)
1804 return 1;
1805
1806 if (flag_strip_local_absolute
1807 /* Keep BSF_FILE symbols in order to allow debuggers to identify
1808 the source file even when the object file is stripped. */
1809 && (flags & (BSF_GLOBAL | BSF_FILE)) == 0
1810 && bfd_get_section (s->bsym) == absolute_section)
1811 return 1;
1812
1813 name = S_GET_NAME (s);
1814 return (name != NULL
1815 && ! S_IS_DEBUG (s)
1816 && (strchr (name, DOLLAR_LABEL_CHAR)
1817 || strchr (name, LOCAL_LABEL_CHAR)
1818 || (! flag_keep_locals
1819 && (bfd_is_local_label (stdoutput, s->bsym)
1820 || (flag_mri
1821 && name[0] == '?'
1822 && name[1] == '?')))));
1823 }
1824
1825 int
1826 S_IS_EXTERN (symbolS *s)
1827 {
1828 return S_IS_EXTERNAL (s);
1829 }
1830
1831 int
1832 S_IS_STABD (symbolS *s)
1833 {
1834 return S_GET_NAME (s) == 0;
1835 }
1836
1837 const char *
1838 S_GET_NAME (symbolS *s)
1839 {
1840 if (LOCAL_SYMBOL_CHECK (s))
1841 return ((struct local_symbol *) s)->lsy_name;
1842 return s->bsym->name;
1843 }
1844
1845 segT
1846 S_GET_SEGMENT (symbolS *s)
1847 {
1848 if (LOCAL_SYMBOL_CHECK (s))
1849 return ((struct local_symbol *) s)->lsy_section;
1850 return s->bsym->section;
1851 }
1852
1853 void
1854 S_SET_SEGMENT (symbolS *s, segT seg)
1855 {
1856 /* Don't reassign section symbols. The direct reason is to prevent seg
1857 faults assigning back to const global symbols such as *ABS*, but it
1858 shouldn't happen anyway. */
1859
1860 if (LOCAL_SYMBOL_CHECK (s))
1861 {
1862 if (seg == reg_section)
1863 s = local_symbol_convert ((struct local_symbol *) s);
1864 else
1865 {
1866 ((struct local_symbol *) s)->lsy_section = seg;
1867 return;
1868 }
1869 }
1870
1871 if (s->bsym->flags & BSF_SECTION_SYM)
1872 {
1873 if (s->bsym->section != seg)
1874 abort ();
1875 }
1876 else
1877 s->bsym->section = seg;
1878 }
1879
1880 void
1881 S_SET_EXTERNAL (symbolS *s)
1882 {
1883 if (LOCAL_SYMBOL_CHECK (s))
1884 s = local_symbol_convert ((struct local_symbol *) s);
1885 if ((s->bsym->flags & BSF_WEAK) != 0)
1886 {
1887 /* Let .weak override .global. */
1888 return;
1889 }
1890 if (s->bsym->flags & BSF_SECTION_SYM)
1891 {
1892 char * file;
1893 unsigned int line;
1894
1895 /* Do not reassign section symbols. */
1896 as_where (& file, & line);
1897 as_warn_where (file, line,
1898 _("section symbols are already global"));
1899 return;
1900 }
1901 s->bsym->flags |= BSF_GLOBAL;
1902 s->bsym->flags &= ~(BSF_LOCAL | BSF_WEAK);
1903
1904 #ifdef USE_UNIQUE
1905 if (! an_external_name && S_GET_NAME(s)[0] != '.')
1906 an_external_name = S_GET_NAME (s);
1907 #endif
1908 }
1909
1910 void
1911 S_CLEAR_EXTERNAL (symbolS *s)
1912 {
1913 if (LOCAL_SYMBOL_CHECK (s))
1914 return;
1915 if ((s->bsym->flags & BSF_WEAK) != 0)
1916 {
1917 /* Let .weak override. */
1918 return;
1919 }
1920 s->bsym->flags |= BSF_LOCAL;
1921 s->bsym->flags &= ~(BSF_GLOBAL | BSF_WEAK);
1922 }
1923
1924 void
1925 S_SET_WEAK (symbolS *s)
1926 {
1927 if (LOCAL_SYMBOL_CHECK (s))
1928 s = local_symbol_convert ((struct local_symbol *) s);
1929 s->bsym->flags |= BSF_WEAK;
1930 s->bsym->flags &= ~(BSF_GLOBAL | BSF_LOCAL);
1931 }
1932
1933 void
1934 S_SET_THREAD_LOCAL (symbolS *s)
1935 {
1936 if (LOCAL_SYMBOL_CHECK (s))
1937 s = local_symbol_convert ((struct local_symbol *) s);
1938 if (bfd_is_com_section (s->bsym->section)
1939 && (s->bsym->flags & BSF_THREAD_LOCAL) != 0)
1940 return;
1941 s->bsym->flags |= BSF_THREAD_LOCAL;
1942 if ((s->bsym->flags & BSF_FUNCTION) != 0)
1943 as_bad (_("Accessing function `%s' as thread-local object"),
1944 S_GET_NAME (s));
1945 else if (! bfd_is_und_section (s->bsym->section)
1946 && (s->bsym->section->flags & SEC_THREAD_LOCAL) == 0)
1947 as_bad (_("Accessing `%s' as thread-local object"),
1948 S_GET_NAME (s));
1949 }
1950
1951 void
1952 S_SET_NAME (symbolS *s, const char *name)
1953 {
1954 if (LOCAL_SYMBOL_CHECK (s))
1955 {
1956 ((struct local_symbol *) s)->lsy_name = name;
1957 return;
1958 }
1959 s->bsym->name = name;
1960 }
1961 #endif /* BFD_ASSEMBLER */
1962
1963 #ifdef SYMBOLS_NEED_BACKPOINTERS
1964
1965 /* Return the previous symbol in a chain. */
1966
1967 symbolS *
1968 symbol_previous (symbolS *s)
1969 {
1970 if (LOCAL_SYMBOL_CHECK (s))
1971 abort ();
1972 return s->sy_previous;
1973 }
1974
1975 #endif /* SYMBOLS_NEED_BACKPOINTERS */
1976
1977 /* Return the next symbol in a chain. */
1978
1979 symbolS *
1980 symbol_next (symbolS *s)
1981 {
1982 if (LOCAL_SYMBOL_CHECK (s))
1983 abort ();
1984 return s->sy_next;
1985 }
1986
1987 /* Return a pointer to the value of a symbol as an expression. */
1988
1989 expressionS *
1990 symbol_get_value_expression (symbolS *s)
1991 {
1992 if (LOCAL_SYMBOL_CHECK (s))
1993 s = local_symbol_convert ((struct local_symbol *) s);
1994 return &s->sy_value;
1995 }
1996
1997 /* Set the value of a symbol to an expression. */
1998
1999 void
2000 symbol_set_value_expression (symbolS *s, const expressionS *exp)
2001 {
2002 if (LOCAL_SYMBOL_CHECK (s))
2003 s = local_symbol_convert ((struct local_symbol *) s);
2004 s->sy_value = *exp;
2005 }
2006
2007 /* Return a pointer to the X_add_number component of a symbol. */
2008
2009 offsetT *
2010 symbol_X_add_number (symbolS *s)
2011 {
2012 #ifdef BFD_ASSEMBLER
2013 if (LOCAL_SYMBOL_CHECK (s))
2014 return (offsetT *) &((struct local_symbol *) s)->lsy_value;
2015 #endif
2016
2017 return &s->sy_value.X_add_number;
2018 }
2019
2020 /* Set the value of SYM to the current position in the current segment. */
2021
2022 void
2023 symbol_set_value_now (symbolS *sym)
2024 {
2025 S_SET_SEGMENT (sym, now_seg);
2026 S_SET_VALUE (sym, frag_now_fix ());
2027 symbol_set_frag (sym, frag_now);
2028 }
2029
2030 /* Set the frag of a symbol. */
2031
2032 void
2033 symbol_set_frag (symbolS *s, fragS *f)
2034 {
2035 #ifdef BFD_ASSEMBLER
2036 if (LOCAL_SYMBOL_CHECK (s))
2037 {
2038 local_symbol_set_frag ((struct local_symbol *) s, f);
2039 return;
2040 }
2041 #endif
2042 s->sy_frag = f;
2043 }
2044
2045 /* Return the frag of a symbol. */
2046
2047 fragS *
2048 symbol_get_frag (symbolS *s)
2049 {
2050 #ifdef BFD_ASSEMBLER
2051 if (LOCAL_SYMBOL_CHECK (s))
2052 return local_symbol_get_frag ((struct local_symbol *) s);
2053 #endif
2054 return s->sy_frag;
2055 }
2056
2057 /* Mark a symbol as having been used. */
2058
2059 void
2060 symbol_mark_used (symbolS *s)
2061 {
2062 if (LOCAL_SYMBOL_CHECK (s))
2063 return;
2064 s->sy_used = 1;
2065 }
2066
2067 /* Clear the mark of whether a symbol has been used. */
2068
2069 void
2070 symbol_clear_used (symbolS *s)
2071 {
2072 if (LOCAL_SYMBOL_CHECK (s))
2073 s = local_symbol_convert ((struct local_symbol *) s);
2074 s->sy_used = 0;
2075 }
2076
2077 /* Return whether a symbol has been used. */
2078
2079 int
2080 symbol_used_p (symbolS *s)
2081 {
2082 if (LOCAL_SYMBOL_CHECK (s))
2083 return 1;
2084 return s->sy_used;
2085 }
2086
2087 /* Mark a symbol as having been used in a reloc. */
2088
2089 void
2090 symbol_mark_used_in_reloc (symbolS *s)
2091 {
2092 if (LOCAL_SYMBOL_CHECK (s))
2093 s = local_symbol_convert ((struct local_symbol *) s);
2094 s->sy_used_in_reloc = 1;
2095 }
2096
2097 /* Clear the mark of whether a symbol has been used in a reloc. */
2098
2099 void
2100 symbol_clear_used_in_reloc (symbolS *s)
2101 {
2102 if (LOCAL_SYMBOL_CHECK (s))
2103 return;
2104 s->sy_used_in_reloc = 0;
2105 }
2106
2107 /* Return whether a symbol has been used in a reloc. */
2108
2109 int
2110 symbol_used_in_reloc_p (symbolS *s)
2111 {
2112 if (LOCAL_SYMBOL_CHECK (s))
2113 return 0;
2114 return s->sy_used_in_reloc;
2115 }
2116
2117 /* Mark a symbol as an MRI common symbol. */
2118
2119 void
2120 symbol_mark_mri_common (symbolS *s)
2121 {
2122 if (LOCAL_SYMBOL_CHECK (s))
2123 s = local_symbol_convert ((struct local_symbol *) s);
2124 s->sy_mri_common = 1;
2125 }
2126
2127 /* Clear the mark of whether a symbol is an MRI common symbol. */
2128
2129 void
2130 symbol_clear_mri_common (symbolS *s)
2131 {
2132 if (LOCAL_SYMBOL_CHECK (s))
2133 return;
2134 s->sy_mri_common = 0;
2135 }
2136
2137 /* Return whether a symbol is an MRI common symbol. */
2138
2139 int
2140 symbol_mri_common_p (symbolS *s)
2141 {
2142 if (LOCAL_SYMBOL_CHECK (s))
2143 return 0;
2144 return s->sy_mri_common;
2145 }
2146
2147 /* Mark a symbol as having been written. */
2148
2149 void
2150 symbol_mark_written (symbolS *s)
2151 {
2152 if (LOCAL_SYMBOL_CHECK (s))
2153 return;
2154 s->written = 1;
2155 }
2156
2157 /* Clear the mark of whether a symbol has been written. */
2158
2159 void
2160 symbol_clear_written (symbolS *s)
2161 {
2162 if (LOCAL_SYMBOL_CHECK (s))
2163 return;
2164 s->written = 0;
2165 }
2166
2167 /* Return whether a symbol has been written. */
2168
2169 int
2170 symbol_written_p (symbolS *s)
2171 {
2172 if (LOCAL_SYMBOL_CHECK (s))
2173 return 0;
2174 return s->written;
2175 }
2176
2177 /* Mark a symbol has having been resolved. */
2178
2179 void
2180 symbol_mark_resolved (symbolS *s)
2181 {
2182 #ifdef BFD_ASSEMBLER
2183 if (LOCAL_SYMBOL_CHECK (s))
2184 {
2185 local_symbol_mark_resolved ((struct local_symbol *) s);
2186 return;
2187 }
2188 #endif
2189 s->sy_resolved = 1;
2190 }
2191
2192 /* Return whether a symbol has been resolved. */
2193
2194 int
2195 symbol_resolved_p (symbolS *s)
2196 {
2197 #ifdef BFD_ASSEMBLER
2198 if (LOCAL_SYMBOL_CHECK (s))
2199 return local_symbol_resolved_p ((struct local_symbol *) s);
2200 #endif
2201 return s->sy_resolved;
2202 }
2203
2204 /* Return whether a symbol is a section symbol. */
2205
2206 int
2207 symbol_section_p (symbolS *s ATTRIBUTE_UNUSED)
2208 {
2209 if (LOCAL_SYMBOL_CHECK (s))
2210 return 0;
2211 #ifdef BFD_ASSEMBLER
2212 return (s->bsym->flags & BSF_SECTION_SYM) != 0;
2213 #else
2214 /* FIXME. */
2215 return 0;
2216 #endif
2217 }
2218
2219 /* Return whether a symbol is equated to another symbol. */
2220
2221 int
2222 symbol_equated_p (symbolS *s)
2223 {
2224 if (LOCAL_SYMBOL_CHECK (s))
2225 return 0;
2226 return s->sy_value.X_op == O_symbol;
2227 }
2228
2229 /* Return whether a symbol is equated to another symbol, and should be
2230 treated specially when writing out relocs. */
2231
2232 int
2233 symbol_equated_reloc_p (symbolS *s)
2234 {
2235 if (LOCAL_SYMBOL_CHECK (s))
2236 return 0;
2237 /* X_op_symbol, normally not used for O_symbol, is set by
2238 resolve_symbol_value to flag expression syms that have been
2239 equated. */
2240 return (s->sy_value.X_op == O_symbol
2241 #if defined (OBJ_COFF) && defined (TE_PE) && (defined(BFD_ASSEMBLER) || defined(S_IS_WEAK))
2242 && ! S_IS_WEAK (s)
2243 #endif
2244 && ((s->sy_resolved && s->sy_value.X_op_symbol != NULL)
2245 || ! S_IS_DEFINED (s)
2246 || S_IS_COMMON (s)));
2247 }
2248
2249 /* Return whether a symbol has a constant value. */
2250
2251 int
2252 symbol_constant_p (symbolS *s)
2253 {
2254 if (LOCAL_SYMBOL_CHECK (s))
2255 return 1;
2256 return s->sy_value.X_op == O_constant;
2257 }
2258
2259 #ifdef BFD_ASSEMBLER
2260
2261 /* Return the BFD symbol for a symbol. */
2262
2263 asymbol *
2264 symbol_get_bfdsym (symbolS *s)
2265 {
2266 if (LOCAL_SYMBOL_CHECK (s))
2267 s = local_symbol_convert ((struct local_symbol *) s);
2268 return s->bsym;
2269 }
2270
2271 /* Set the BFD symbol for a symbol. */
2272
2273 void
2274 symbol_set_bfdsym (symbolS *s, asymbol *bsym)
2275 {
2276 if (LOCAL_SYMBOL_CHECK (s))
2277 s = local_symbol_convert ((struct local_symbol *) s);
2278 /* Usually, it is harmless to reset a symbol to a BFD section
2279 symbol. For example, obj_elf_change_section sets the BFD symbol
2280 of an old symbol with the newly created section symbol. But when
2281 we have multiple sections with the same name, the newly created
2282 section may have the same name as an old section. We check if the
2283 old symbol has been already marked as a section symbol before
2284 resetting it. */
2285 if ((s->bsym->flags & BSF_SECTION_SYM) == 0)
2286 s->bsym = bsym;
2287 /* else XXX - What do we do now ? */
2288 }
2289
2290 #endif /* BFD_ASSEMBLER */
2291
2292 #ifdef OBJ_SYMFIELD_TYPE
2293
2294 /* Get a pointer to the object format information for a symbol. */
2295
2296 OBJ_SYMFIELD_TYPE *
2297 symbol_get_obj (symbolS *s)
2298 {
2299 if (LOCAL_SYMBOL_CHECK (s))
2300 s = local_symbol_convert ((struct local_symbol *) s);
2301 return &s->sy_obj;
2302 }
2303
2304 /* Set the object format information for a symbol. */
2305
2306 void
2307 symbol_set_obj (symbolS *s, OBJ_SYMFIELD_TYPE *o)
2308 {
2309 if (LOCAL_SYMBOL_CHECK (s))
2310 s = local_symbol_convert ((struct local_symbol *) s);
2311 s->sy_obj = *o;
2312 }
2313
2314 #endif /* OBJ_SYMFIELD_TYPE */
2315
2316 #ifdef TC_SYMFIELD_TYPE
2317
2318 /* Get a pointer to the processor information for a symbol. */
2319
2320 TC_SYMFIELD_TYPE *
2321 symbol_get_tc (symbolS *s)
2322 {
2323 if (LOCAL_SYMBOL_CHECK (s))
2324 s = local_symbol_convert ((struct local_symbol *) s);
2325 return &s->sy_tc;
2326 }
2327
2328 /* Set the processor information for a symbol. */
2329
2330 void
2331 symbol_set_tc (symbolS *s, TC_SYMFIELD_TYPE *o)
2332 {
2333 if (LOCAL_SYMBOL_CHECK (s))
2334 s = local_symbol_convert ((struct local_symbol *) s);
2335 s->sy_tc = *o;
2336 }
2337
2338 #endif /* TC_SYMFIELD_TYPE */
2339
2340 void
2341 symbol_begin (void)
2342 {
2343 symbol_lastP = NULL;
2344 symbol_rootP = NULL; /* In case we have 0 symbols (!!) */
2345 sy_hash = hash_new ();
2346 #ifdef BFD_ASSEMBLER
2347 local_hash = hash_new ();
2348 #endif
2349
2350 memset ((char *) (&abs_symbol), '\0', sizeof (abs_symbol));
2351 #ifdef BFD_ASSEMBLER
2352 #if defined (EMIT_SECTION_SYMBOLS) || !defined (RELOC_REQUIRES_SYMBOL)
2353 abs_symbol.bsym = bfd_abs_section.symbol;
2354 #endif
2355 #else
2356 /* Can't initialise a union. Sigh. */
2357 S_SET_SEGMENT (&abs_symbol, absolute_section);
2358 #endif
2359 abs_symbol.sy_value.X_op = O_constant;
2360 abs_symbol.sy_frag = &zero_address_frag;
2361
2362 if (LOCAL_LABELS_FB)
2363 fb_label_init ();
2364 }
2365 \f
2366 int indent_level;
2367
2368 /* Maximum indent level.
2369 Available for modification inside a gdb session. */
2370 int max_indent_level = 8;
2371
2372 void
2373 print_symbol_value_1 (FILE *file, symbolS *sym)
2374 {
2375 const char *name = S_GET_NAME (sym);
2376 if (!name || !name[0])
2377 name = "(unnamed)";
2378 fprintf (file, "sym %lx %s", (unsigned long) sym, name);
2379
2380 if (LOCAL_SYMBOL_CHECK (sym))
2381 {
2382 #ifdef BFD_ASSEMBLER
2383 struct local_symbol *locsym = (struct local_symbol *) sym;
2384 if (local_symbol_get_frag (locsym) != &zero_address_frag
2385 && local_symbol_get_frag (locsym) != NULL)
2386 fprintf (file, " frag %lx", (long) local_symbol_get_frag (locsym));
2387 if (local_symbol_resolved_p (locsym))
2388 fprintf (file, " resolved");
2389 fprintf (file, " local");
2390 #endif
2391 }
2392 else
2393 {
2394 if (sym->sy_frag != &zero_address_frag)
2395 fprintf (file, " frag %lx", (long) sym->sy_frag);
2396 if (sym->written)
2397 fprintf (file, " written");
2398 if (sym->sy_resolved)
2399 fprintf (file, " resolved");
2400 else if (sym->sy_resolving)
2401 fprintf (file, " resolving");
2402 if (sym->sy_used_in_reloc)
2403 fprintf (file, " used-in-reloc");
2404 if (sym->sy_used)
2405 fprintf (file, " used");
2406 if (S_IS_LOCAL (sym))
2407 fprintf (file, " local");
2408 if (S_IS_EXTERN (sym))
2409 fprintf (file, " extern");
2410 if (S_IS_DEBUG (sym))
2411 fprintf (file, " debug");
2412 if (S_IS_DEFINED (sym))
2413 fprintf (file, " defined");
2414 }
2415 fprintf (file, " %s", segment_name (S_GET_SEGMENT (sym)));
2416 if (symbol_resolved_p (sym))
2417 {
2418 segT s = S_GET_SEGMENT (sym);
2419
2420 if (s != undefined_section
2421 && s != expr_section)
2422 fprintf (file, " %lx", (long) S_GET_VALUE (sym));
2423 }
2424 else if (indent_level < max_indent_level
2425 && S_GET_SEGMENT (sym) != undefined_section)
2426 {
2427 indent_level++;
2428 fprintf (file, "\n%*s<", indent_level * 4, "");
2429 #ifdef BFD_ASSEMBLER
2430 if (LOCAL_SYMBOL_CHECK (sym))
2431 fprintf (file, "constant %lx",
2432 (long) ((struct local_symbol *) sym)->lsy_value);
2433 else
2434 #endif
2435 print_expr_1 (file, &sym->sy_value);
2436 fprintf (file, ">");
2437 indent_level--;
2438 }
2439 fflush (file);
2440 }
2441
2442 void
2443 print_symbol_value (symbolS *sym)
2444 {
2445 indent_level = 0;
2446 print_symbol_value_1 (stderr, sym);
2447 fprintf (stderr, "\n");
2448 }
2449
2450 static void
2451 print_binary (FILE *file, const char *name, expressionS *exp)
2452 {
2453 indent_level++;
2454 fprintf (file, "%s\n%*s<", name, indent_level * 4, "");
2455 print_symbol_value_1 (file, exp->X_add_symbol);
2456 fprintf (file, ">\n%*s<", indent_level * 4, "");
2457 print_symbol_value_1 (file, exp->X_op_symbol);
2458 fprintf (file, ">");
2459 indent_level--;
2460 }
2461
2462 void
2463 print_expr_1 (FILE *file, expressionS *exp)
2464 {
2465 fprintf (file, "expr %lx ", (long) exp);
2466 switch (exp->X_op)
2467 {
2468 case O_illegal:
2469 fprintf (file, "illegal");
2470 break;
2471 case O_absent:
2472 fprintf (file, "absent");
2473 break;
2474 case O_constant:
2475 fprintf (file, "constant %lx", (long) exp->X_add_number);
2476 break;
2477 case O_symbol:
2478 indent_level++;
2479 fprintf (file, "symbol\n%*s<", indent_level * 4, "");
2480 print_symbol_value_1 (file, exp->X_add_symbol);
2481 fprintf (file, ">");
2482 maybe_print_addnum:
2483 if (exp->X_add_number)
2484 fprintf (file, "\n%*s%lx", indent_level * 4, "",
2485 (long) exp->X_add_number);
2486 indent_level--;
2487 break;
2488 case O_register:
2489 fprintf (file, "register #%d", (int) exp->X_add_number);
2490 break;
2491 case O_big:
2492 fprintf (file, "big");
2493 break;
2494 case O_uminus:
2495 fprintf (file, "uminus -<");
2496 indent_level++;
2497 print_symbol_value_1 (file, exp->X_add_symbol);
2498 fprintf (file, ">");
2499 goto maybe_print_addnum;
2500 case O_bit_not:
2501 fprintf (file, "bit_not");
2502 break;
2503 case O_multiply:
2504 print_binary (file, "multiply", exp);
2505 break;
2506 case O_divide:
2507 print_binary (file, "divide", exp);
2508 break;
2509 case O_modulus:
2510 print_binary (file, "modulus", exp);
2511 break;
2512 case O_left_shift:
2513 print_binary (file, "lshift", exp);
2514 break;
2515 case O_right_shift:
2516 print_binary (file, "rshift", exp);
2517 break;
2518 case O_bit_inclusive_or:
2519 print_binary (file, "bit_ior", exp);
2520 break;
2521 case O_bit_exclusive_or:
2522 print_binary (file, "bit_xor", exp);
2523 break;
2524 case O_bit_and:
2525 print_binary (file, "bit_and", exp);
2526 break;
2527 case O_eq:
2528 print_binary (file, "eq", exp);
2529 break;
2530 case O_ne:
2531 print_binary (file, "ne", exp);
2532 break;
2533 case O_lt:
2534 print_binary (file, "lt", exp);
2535 break;
2536 case O_le:
2537 print_binary (file, "le", exp);
2538 break;
2539 case O_ge:
2540 print_binary (file, "ge", exp);
2541 break;
2542 case O_gt:
2543 print_binary (file, "gt", exp);
2544 break;
2545 case O_logical_and:
2546 print_binary (file, "logical_and", exp);
2547 break;
2548 case O_logical_or:
2549 print_binary (file, "logical_or", exp);
2550 break;
2551 case O_add:
2552 indent_level++;
2553 fprintf (file, "add\n%*s<", indent_level * 4, "");
2554 print_symbol_value_1 (file, exp->X_add_symbol);
2555 fprintf (file, ">\n%*s<", indent_level * 4, "");
2556 print_symbol_value_1 (file, exp->X_op_symbol);
2557 fprintf (file, ">");
2558 goto maybe_print_addnum;
2559 case O_subtract:
2560 indent_level++;
2561 fprintf (file, "subtract\n%*s<", indent_level * 4, "");
2562 print_symbol_value_1 (file, exp->X_add_symbol);
2563 fprintf (file, ">\n%*s<", indent_level * 4, "");
2564 print_symbol_value_1 (file, exp->X_op_symbol);
2565 fprintf (file, ">");
2566 goto maybe_print_addnum;
2567 default:
2568 fprintf (file, "{unknown opcode %d}", (int) exp->X_op);
2569 break;
2570 }
2571 fflush (stdout);
2572 }
2573
2574 void
2575 print_expr (expressionS *exp)
2576 {
2577 print_expr_1 (stderr, exp);
2578 fprintf (stderr, "\n");
2579 }
2580
2581 void
2582 symbol_print_statistics (FILE *file)
2583 {
2584 hash_print_statistics (file, "symbol table", sy_hash);
2585 #ifdef BFD_ASSEMBLER
2586 hash_print_statistics (file, "mini local symbol table", local_hash);
2587 fprintf (file, "%lu mini local symbols created, %lu converted\n",
2588 local_symbol_count, local_symbol_conversion_count);
2589 #endif
2590 }