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