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