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