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