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