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